Matlab:如何有效地计算距离

时间:2015-01-30 02:29:07

标签: matlab euclidean-distance

我有一个维度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

1 个答案:

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