MATLAB:以有效的方式计算欧氏距离?

时间:2016-11-08 06:20:00

标签: matlab vector euclidean-distance

我目前正在做的是计算矢量中所有元素之间的欧氏距离(元素是2D图像中的像素位置),以查看元素是否彼此接近。我创建了一个引用向量,它以递增的方式接受向量中每个索引的值。使用MATLAB函数“pdist2”计算参考矢量与像素位置矢量中所有元素之间的欧氏距离,并将结果应用于某些条件;然而,在运行代码时,这个函数似乎需要花费最长的时间来计算(例如,对于一次运行,该函数被调用27,245次并且占整个程序运行时间的约54%)。有没有更有效的方法来做到这一点并加快程序的速度?

[~, n] = size(xArray); %xArray and yArray are same size
%Pair the x and y coordinates of the interest pixels
pairLocations = [xArray; yArray].';
%Preallocate cells with the max amount (# of interest pixels)
p = cell(1,n);

for i = 1:n
    ref = [xArray(i), yArray(i)];
    d = pdist2(ref,pairLocations,'euclidean');
    d = d < dTh;
    d = find(d==1);
    [~,k] = size(d);
    if (k >= num)
        p{1,i} = d;
    end
end

1 个答案:

答案 0 :(得分:2)

对于平方欧几里德距离,有一个使用矩阵点积的技巧:

||a-b||² = <a-b, a-b> = ||a||² - 2<a,b> + ||b||²

C = [xArray; yArray];列出所有位置的2×n矩阵,然后

n2 = sum(C.^2); % sq norm of coordinates
D  = bsxfun(@plus, n2, n2.') - 2 * C.' * C;

现在D(ii,jj)保持点ii和点jj之间的平方距离。 应该跑得很快。