2013-01-23 32 views
7

我有一个区域约144点。我想实现的是测量一个点与所有其他点的距离并将其存储在一个数组中。我想为所有要点做到这一点。如果可能,我希望以不重复的方式存储这些数据。我应该能够使查询如所有点之间的所有点之间没有重复,所有距离的总和点56号等计算一个区域内所有点的距离

我有一个3 * 144数组有两列存储点的坐标。

+0

我只注意到这个问题, ,并希望给出一个链接[这个答案与三种计算MATLAB中成对距离的方法的比较](http://stackoverflow.com/a/19456458/2778484)。另一个问题非常令人困惑,但答案解决了成对距离,这是任何维度中的最后一种方法。 – chappjc

回答

6

一个可能的解决方案(我不是真的与你的意思是没有重复什么明确的,虽然):

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 
当然

矩阵是对称的。您可以轻松降低涉及的复杂程度。

+0

通过重复,我的意思是距离A点到B点的距离与B到A的距离相同,所以不应该考虑。 – Vikram

+0

@Vikram,对,矩阵确实是对称的。顺便说一下,对于少数点(如144),这种更加暴力的方法可能比智能方法快。试试吧。 – Acorbe

2

假设你的数组是A,其中每列存储单个点的坐标。为了获得所有点对的组合(不重复),使用nchoosek

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

然后计算Euclidean distance像这样:

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

如果您已经安装了Statistics Toolbox,您可以使用pdist(A)而不是为同样的效果。

+0

我有pdist功能。 [pdist(A)] [4]中的[4]是怎样解释的? – Vikram

+0

@Vikram这只是一个打字错误(我试图做一个超链接到'pdist'官方文档)。它应该是'pdist(A)'。固定。 –

1

如果你有统计工具箱,如果你有在排列X您的所有数据,然后

D = pdist(X) 

给出X.所有点之间的所有成对距离

+0

最简单的解决方案,如果你可以用三角矩阵代替对称距离矩阵(虽然['squareform'](http://www.mathworks.com/help/stats/squareform.html)可以让你一路) 。 +1有关参考资料,请参见[这篇文章的其他答案,以便比较'pdist'和其他“手动”解决方案“](http://stackoverflow.com/a/19456458/2778484)。 – chappjc