计算一个区域内所有点之间的距离

6
我有一个包含约144个点的区域。我想要实现的是测量每个点与其他所有点的距离,并将其存储在数组中。我希望对所有点都进行这样的操作。如果可能,我希望以无重复的方式存储这些数据。并且我应该能够进行查询,比如:所有点之间的距离(无重复),第56个点的所有距离之和等等。
我有一个3*144的数组,其中两列存储了点的坐标。

我刚刚注意到这个问题,并想提供一个链接,其中包含MATLAB中计算成对距离的三种方法的比较答案(http://stackoverflow.com/a/19456458/2778484)。另一个问题非常令人困惑,但是该答案解决了任何维度中的成对距离的最后一种方法。 - chappjc
3个回答

5

可能的解决方案(虽然我不是很清楚您所说的无重复指的是什么):

 X are your points with coordinates x = X(:,1), y = X(:,2)


 dist = sqrt(bsxfun(@minus,X(:,1),X(:,1)').^2 + bsxfun(@minus,X(:,2),X(:,2)').^2)

所以
dist(i,j) is the euclidean distance between i and j

当然,这个矩阵是对称的。你可以轻松降低复杂性。

我所说的重复是指从点A到B的距离与从B到A的距离相同,因此不应计算在内。 - Vikram
@Vikram,没错,矩阵确实是对称的。顺便说一下,对于少量点(如144个),也许这种更加暴力的方法比更聪明的方法要快一些。试试看吧。 - Acorbe

2

假设您的数组是A,其中每列存储单个点的坐标。要获取所有点对的组合(不重复),请使用nchoosek函数:

pairs = nchoosek(1:size(A, 2), 2)

然后按以下方式计算欧几里得距离

dist = sqrt(sum((A(:, pairs(:, 1)) - A(:, pairs(:, 2))) .^ 2, 1))

如果您已经安装了统计工具箱(Statistics Toolbox),您可以使用pdist(A)来达到相同的效果。

我有pdist函数。[pdist(A)][4]中的[4]代表什么? - Vikram
@Vikram 这只是一个打字错误(我试图创建一个到 pdist 官方文档的超链接)。应该是 pdist(A)。已修复。 - Eitan T

1
如果您拥有统计工具箱,并且您的所有数据都在数组X中,则:
D = pdist(X)

提供X中所有点之间的两两距离。


如果您可以接受三角形距离矩阵而不是对称距离矩阵,则最简单的解决方案是使用 squareform(可在此处找到所有内容)。参考本帖的答案,了解pdist和其他“手动”解决方案的比较。+1 - chappjc

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接