八度:计算两个向量矩阵之间的距离

计算科学 表现 八度 矢量化
2021-11-28 02:51:31

假设我有两个矩阵 Nx2, Mx2 分别代表 N, M 2d 向量。有没有一种简单而好的方法来计算每个向量对(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
2个回答

在这些情况下,使用这样的策略向量化很简单:

eN = ones(N,1);
eM = ones(M,1);
d  = sqrt(eM*n.^2' - 2*m*n' + m.^2*eN');

这是一个将 for 循环向量化的示例,在 M=1000 和 N=2000 的情况下加速了 15 倍。

n = rand(N,2);
m = rand(M,2);
eN = ones(N,2);
eM = ones(2,M);

tic;
d_vect  = sqrt(eN*m.^2' - 2*n*m' + n.^2*eM);
vect_time = toc;

tic;
for i=1:N
  for j=1:M
     d_for(i,j) = norm(n(i,:)-m(j,:));
  end
end
for_time = toc; 

assert(norm(d_vect-d_for) < 1e-10*norm(d_for)) 

从 Octave 3.4.3 及更高版本开始,操作员 - 进行自动广播(内部使用 bsxfun)。所以你可以按照这种方式进行。

Dx = N(:,1) - M(:,1)';
Dy = N(:,2) - M(:,2)';
D = sqrt (Dx.^2 + Dy.^2);

你可以使用 3d 矩阵来做同样的事情,但我想这样会更清楚。D 是一个 NxM 距离矩阵,N 中的每个向量对 M 中的每个向量。

希望这可以帮助