3

以下矩阵 a 表示从到距离:

a = [0 3 5 6; 4 0 2 9; 9 1 0 4; 8 3 8 0];

a =

 0     3     5     6
 4     0     2     9
 9     1     0     4
 8     3     8     0

(即从 2 到 4 = 9,从 1 到 2 = 3 等)

矩阵a是静态的(不改变),还有另一个矩阵b发生变化。一个示例输入是:

b = [1; 4; 2; 1; 3; 4; 1];

b =

 1
 4
 2
 1
 3
 4
 1

我正在寻找第一行和第二行之间的距离 - 并为所有行执行该任务以输出:

b =

 1  
 4  6
 2  3
 1  4
 3  5
 4  4
 1  8

其中第二列是从矩阵a获得的值。

4

1 回答 1

2

这是一个单行解决方案:

%#Set parameters of problem
a = [0 3 5 6; 4 0 2 9; 9 1 0 4; 8 3 8 0];
b = [1; 4; 2; 1; 3; 4; 1];
aSize = size(a);

%#The one-line solution 
Soln = [b, [NaN; a(sub2ind(aSize, b(1:end-1), b(2:end)))]];

或者,非矢量化解决方案是:

%#Set parameters of problem
a = [0 3 5 6; 4 0 2 9; 9 1 0 4; 8 3 8 0];
b = [1; 4; 2; 1; 3; 4; 1];
T = length(b);

%#Preallocate a distance vector
bDist = NaN(T, 1);

%#Loop over b getting the distance for each pair
for t = 2:T
    bDist(t, 1) = a(b(t-1), b(t));
end

%#Combine b and bDist into a single matrix.
Soln = [b bDist];

那么哪种解决方案是最优的呢?在我的机器(R2012b,Linux Mint v12)上,临界点长度b约为650。如果b大于650,则使用矢量化解决方案(即单线)。如果b小于 650,则使用循环。

顺便说一句,如果您想知道,单行解决方案通过使用函数将连续的对转换b为矩阵的行和列索引来工作。然后通过使用这些索引进行索引来找到解向量。asub2inda

ps 一个不对称的距离矩阵?听起来是个有趣的问题!

于 2012-11-05T00:13:39.407 回答