以下矩阵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 获得的值。
答案 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非对称距离矩阵?听起来像一个有趣的问题!