【发布时间】:2015-10-12 14:38:14
【问题描述】:
这可能是一个有点愚蠢的问题 - 但假设我想找到两个像素之间的距离,坐标为 (x1,y1) 和 (x2,y2 )。使用 MatLab 执行此操作的最简单方法是什么?
【问题讨论】:
-
你好。我看到您最近得到了很多帮助,但我们没有收到您关于我们的回答帮助您的反馈。如果我们帮助了您,也许如果您接受我们的一些答案,它会告诉我们您不再需要任何帮助。
这可能是一个有点愚蠢的问题 - 但假设我想找到两个像素之间的距离,坐标为 (x1,y1) 和 (x2,y2 )。使用 MatLab 执行此操作的最简单方法是什么?
【问题讨论】:
pdist 是一个不错的答案,但我认为它很慢(至少对于更多的点而言)。此外,pdist 需要统计工具箱,因此如果您没有该工具箱,则无法使用该答案。
我建议将bsxfun 与permute 和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。
如果我们在计算距离之前稍微改变permute 尺寸的方式,我们可以通过将其替换为另一个permute 调用来避免reshape,这可能代价高昂:
out = sqrt(sum(bsxfun(@minus, permute(X, [1 3 2]), permute(X, [3 1 2])).^2, 3));
【讨论】:
out = sqrt(sum(bsxfun(@minus, permute(X, [1 3 2]), permute(X, 3 1 2)).^2, 3)
X = [x1,y1;x2,y2];
d = pdist(X,'euclidean')
d 是距离。
【讨论】:
N x 2 矩阵中,其中N 是您的总点数,然后将其设为X。之后,使用pdist。顺便说一句,我建议在此代码上使用squareform,以便将其转换为更易读的格式。