假设我有两个分别代表N,M个2d向量的矩阵Nx2,Mx2。有没有一种简单而又好的方法来计算每个向量对(n,m)之间的距离?
简单但低效的方法当然是:
d = zeros(N, M);
for i = 1:N,
for j = 1:M,
d(i,j) = norm(n(i,:) - m(j,:));
endfor;
endfor;
我找到的最接近的答案是bsxfun
,用法如下:
bsxfun(inline("x-y"),[1,2,3,4],[3;4;5;6])
ans =
-2 -1 0 1
-3 -2 -1 0
-4 -3 -2 -1
-5 -4 -3 -2
我看了一下,没有比向量化计算更好的了。我认为此计算非常适合编写外部C / Fortran函数。
—
阿隆·艾玛迪亚
我敢打赌,您可以制作一个2xNxM的矩阵,并在其中填充一个外部乘积,然后对每个条目求平方并沿零轴和平方根求和。在Python中,它看起来像是:distance_matrix =(n [:,:,nexaxis] * m [:,newaxis ,:]); distance_matrix = distance_matrix ** 2; distance_matrix = sqrt(distance_matrix.sum(axis = 1)); 如果您只需要知道最接近的n个向量,则可以使用更好的方法!
—
meawoppl 2012年
@meawoppl(Octave的新手)我发现了如何在Octave中使用线性代数包,该包提供
—
凯利·范·埃弗特
cartprod
,所以现在我可以编写:(1) x = cartprod(n(:,1), m(:,1));
(2) y = cartprod(n(:,2), m(:,2));
(3) d = sqrt((x(:,1)-x(:,2)).^2+(y(:,1)-y(:,2)).^2)
..它运行得更快!