我有一个矩阵X,维度r=2行,列= 20000列,我想计算两点之间距离平方和=欧几里得距离的平方根。对于ex:
让我们,
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的矩阵。但是,当数据点很大时,例如一百万,这将花费大量时间。我怎样才能有效地修改这段代码,使它变得得体而快速。请帮帮忙。
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发布于 2015-01-30 11:40:55
因为您有计算一组点中每个点之间的距离的特殊情况,所以您有一个可以使用的优势,以便提高速度:
对于欧氏距离,点A和B之间的距离是dist(A,B),但是dist(A,B) === dist(B,A)。
所以你只需要计算矩阵的一半。我只留下上半部分的三角形。您还可以使用dist(A,A) =0这一事实来节省一些时间。
以下代码计算矩阵的速度比问题中的方法快%66.55。请注意,只使用了上半部分三角形,因此您必须仅使用有效元素(即a <= 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,它很有趣。
https://stackoverflow.com/questions/28228283
复制相似问题