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

MATLAB: Computing euclidean distance in an efficient way?

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

[~, 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

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

||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 之间的平方距离。 应该运行挺快的。