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 中进行矢量化会更快。循环在很久以前曾经很慢,但现在情况已不再如此。矢量化需要一个中间 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.';
我做了三处改变:
X
上,您可以正确循环(索引列),但在 D
上,顺序颠倒了。norm
,这是一个复杂的函数,可能会执行大量检查。相反,我使用点积。这将是矢量化代码:
D = vecnorm(reshape(X, S, 1, N) - X);
D = reshape(D, N, N); % or just squeeze(D)