【问题标题】:Matlab: How to efficiently compute distances [duplicate]Matlab:如何有效地计算距离
【发布时间】:2015-01-30 02:29:07
【问题描述】:

我有一个矩阵X,维度为 r = 2 行,col = 20000 列,我想计算平方距离之和的平方根 = 点对之间的欧几里得距离。例如:

让,

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

【问题讨论】:

  • here
  • Here's 解释和一些矢量化的变体。
  • X = [ 1 2 3 4; 5 6 7 8]; [i,j] = meshgrid(1:size(X,2),1:size(X,2)); Dx = reshape(X(1,i)-X(1,j),size(X,2),size(X,2)); Dy = reshape(X(2,i)-X(2,j),size(X,2),size(X,2)); D=sqrt(Dx.^2 + Dy.^2);
  • 无法将其添加为单独的答案,因为它被标记为重复。但是我的解决方案比 rayryeng 引用的答案更具体,因为维度只有 2,不需要更高维度的选项。

标签: matlab euclidean-distance


【解决方案1】:

因为您有计算一组点中每个点之间距离的特殊情况,所以您可以利用一个优势来提高速度:

A点和B点之间的距离是dist(A,B),但是dist(A,B) === dist(B,A),对于欧式距离。

所以你只需要计算你正在计算的矩阵的一半。我只留下上三角形的一半。 您还可以使用 dist(A,A) = 0 这一事实来节省一些时间。

以下代码比您问题中的方法更快地计算出您的矩阵 %66.55。请注意,仅使用了上三角半部分,因此您必须仅使用有效元素(即 a

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,这很有趣。

【讨论】:

  • 谢谢您的回复,这个方法对数据集的任何维度都有效吗?假设维度 d = 100,则意味着 100 个循环。我一直在寻找一种可以避免这么多循环的方法。你能解释一下这个问题吗?
猜你喜欢
  • 2016-01-19
  • 1970-01-01
  • 1970-01-01
  • 2021-12-27
  • 1970-01-01
  • 2014-07-17
  • 1970-01-01
相关资源
最近更新 更多