2013-01-23 44 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