我有一个维度r = 2行和col = 20000列的矩阵X
,我想计算平方距离之和的平方根=一对点之间的欧几里德距离。例如:
让,
X = 1 2 3 4
5 6 7 8
Dist1 = sqrt((1-2)^2 + (5-6)^2))
Dist2 = sqrt((1-3)^2 + (5-7)^2))
and so on. So, distance(1,2) = Dist1;
distance(1,3) = Dist2
结果将是一个大小为N*N
的矩阵。
但是,当数据点大到100万时,需要花费大量时间。如何有效地修改此代码以使其正常且快速。请帮忙。
r =2;
col = 2000;
X = rand(r,col);
N = col;
for k =1: N
for l = 1: N
if (l ~= k)
distance(k,l) =( sqrt(sum((X(:,k) - X(:,l)) .^ 2)));
end
end
end
end
答案 0 :(得分:0)
因为您有计算一组点中每个点之间距离的特殊情况,所以您可以使用一个优势来提高速度:
对于欧几里德距离,A点和B点之间的距离为dist(A,B),但dist(A,B)=== dist(B,A)。
所以你只需要计算你正在计算的矩阵的一半。我只留下上三角形的一半。 你也可以使用dist(A,A)= 0的事实来节省一些时间。
以下代码比您问题中的方法更快地计算了矩阵%66.55。请注意,仅使用上三角形半部分,因此您必须仅使用有效元素(即< = b)索引dist(a,b)。
r = 2;
N = 2000;
X = rand(r,N);
t = tic();
dist = zeros(N,N);
for k = 1:N
for l = (k+1):N
dist(k,l) = sqrt(sum((X(:,l)-X(:,k)).^2));
end
end
T = toc(t);
disp(T);
另见Benoit_11的link,这很有趣。