找到两个像素之间的距离的最简单方法是什么?
What is the simplest way of finding the distance between two pixels?
这可能有点菜鸟问题 - 但假设我想找到坐标为 (x1,y1) 和 ( 的两个像素之间的距离x2,y2)。使用 MatLab 执行此操作的最简单方法是什么?
X = [x1,y1;x2,y2];
d = pdist(X,'euclidean')
d 是距离。
pdist
是一个好的答案,但我认为它很慢(至少对于大量的点)。此外,pdist
需要统计工具箱,因此如果您没有该工具箱,则无法使用该答案。
我建议使用 bsxfun
combined with permute
and reshape
作为独立于工具箱的解决方案。假设X
是一个2列矩阵,排列方式如下:
X = [x y];
x
和 y
是您要查找距离的所有点的 X 和 Y 坐标。因此,每一行都包含一个查询点:
X2 = permute(X, [3 2 1]);
out = sqrt(sum(bsxfun(@minus, X, X2).^2, 2));
out = reshape(out, size(X,1), []);
这应该会为您提供与将 squareform
应用于 pdist
的输出相同的输出。具体来说,在 out
的元素 (i,j)
处,这将为您提供点 i
和点 j
之间的距离,因此对角线元素的值应为 0
因为自我距离为 0.
乔纳斯的建议
我们可以避免 reshape
如果我们在计算距离之前稍微改变我们 permute
尺寸的方式,则可以通过将其替换为另一个 permute
调用来避免成本高昂:
out = sqrt(sum(bsxfun(@minus, permute(X, [1 3 2]), permute(X, [3 1 2])).^2, 3));
这可能有点菜鸟问题 - 但假设我想找到坐标为 (x1,y1) 和 ( 的两个像素之间的距离x2,y2)。使用 MatLab 执行此操作的最简单方法是什么?
X = [x1,y1;x2,y2];
d = pdist(X,'euclidean')
d 是距离。
pdist
是一个好的答案,但我认为它很慢(至少对于大量的点)。此外,pdist
需要统计工具箱,因此如果您没有该工具箱,则无法使用该答案。
我建议使用 bsxfun
combined with permute
and reshape
作为独立于工具箱的解决方案。假设X
是一个2列矩阵,排列方式如下:
X = [x y];
x
和 y
是您要查找距离的所有点的 X 和 Y 坐标。因此,每一行都包含一个查询点:
X2 = permute(X, [3 2 1]);
out = sqrt(sum(bsxfun(@minus, X, X2).^2, 2));
out = reshape(out, size(X,1), []);
这应该会为您提供与将 squareform
应用于 pdist
的输出相同的输出。具体来说,在 out
的元素 (i,j)
处,这将为您提供点 i
和点 j
之间的距离,因此对角线元素的值应为 0
因为自我距离为 0.
乔纳斯的建议
我们可以避免 reshape
如果我们在计算距离之前稍微改变我们 permute
尺寸的方式,则可以通过将其替换为另一个 permute
调用来避免成本高昂:
out = sqrt(sum(bsxfun(@minus, permute(X, [1 3 2]), permute(X, [3 1 2])).^2, 3));