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
之间的平方距离。
应该运行挺快的。
我目前正在做的是计算向量中所有元素之间的欧式距离(元素是二维图像中的像素位置),以查看元素之间是否接近。我创建了一个参考向量,它以递增方式获取向量中每个索引的值。使用 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
之间的平方距离。
应该运行挺快的。