如何通过向量化计算两个复数矩阵之间的欧氏距离?

问题描述 投票:0回答:1

X=[x_1,x_2,...,x_N]
是一个
[S,N]
复矩阵。 例如,
S=3
x_1=[1+2j,2+3j,3+4j]'

D
X
的距离矩阵,这意味着
D(i,j)
x_i
x_j
之间的欧氏距离。

我的代码:

D = zeros(N, N);
for i = 1:N
    for j = i:N 
        D(i, j) = norm(X(:, i) - X(:, j));
    end
end
D = D + D.';

如何通过矢量化来简化?

我尝试使用两个循环,但是当 N 很大时会花费时间。 并且复数矩阵无法通过

pdist
计算。

matlab matrix vectorization euclidean-distance
1个回答
0
投票

我不认为在现代 MATLAB 中进行矢量化会更快。循环在很久以前曾经很慢,但现在情况已不再如此。矢量化需要一个中间 NxNxS 矩阵,这将使用大量内存并因此减慢计算速度。在非常旧的 MATLAB 版本和 Octave 中,矢量化代码会更快。

未经任何测试,我认为这段代码会比现代 MATLAB 上的 OP 更快:

D = zeros(N, N);
for i = 1:N
    for j = i+1:N  % Skip the diagonal!
        d = X(:, i) - X(:, j);
        D(j, i) = sqrt(d.' * d);
    end
end
D = D + D.';

我做了三处改变:

  1. 循环二维矩阵时,内部循环应始终是第一个索引。在
    X
    上,您可以正确循环(索引列),但在
    D
    上,顺序颠倒了。
  2. 不调用
    norm
    ,这是一个复杂的函数,可能会执行大量检查。相反,我使用点积。
  3. 跳过对角线,我们知道对角线将全为零。

这将是矢量化代码:

D = vecnorm(reshape(X, S, 1, N) - X);
D = reshape(D, N, N);  % or just squeeze(D)
© www.soinside.com 2019 - 2024. All rights reserved.