首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Matlab:如何高效地计算距离

Matlab:如何高效地计算距离
EN

Stack Overflow用户
提问于 2015-01-30 10:29:07
回答 1查看 158关注 0票数 0

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

让我们,

代码语言:javascript
复制
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的矩阵。但是,当数据点很大时,例如一百万,这将花费大量时间。我怎样才能有效地修改这段代码,使它变得得体而快速。请帮帮忙。

代码语言:javascript
复制
 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
EN

回答 1

Stack Overflow用户

发布于 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)进行索引。

代码语言:javascript
复制
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,它很有趣。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/28228283

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档