我目前正在做的是计算矢量中所有元素之间的欧氏距离(元素是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
答案 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
之间的平方距离。
应该跑得很快。