从矩阵中找到距离(matlab)

时间:2012-11-04 23:52:04

标签: matlab matrix distance

以下矩阵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 获得的值。

1 个答案:

答案 0 :(得分: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中的连续对转换为矩阵a的行和列索引,方法是使用sub2ind功能。然后通过使用这些索引索引a来找到解决方案向量。

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