2013-01-23 11 views
7

私は約144点の領域を持っています。私が達成したいのは、ある点と他の点との距離を測定し、それを配列に格納することです。私はすべての点でこれをやりたい可能であれば、このデータを繰り返さないように保存したいと考えています。そして、私はクエリを作ることができるはずです - すべてのポイント間のすべての距離は繰り返しなし、no56などのすべての距離の合計です。ある領域内のすべての点の距離を計算する

私はポイントの座標を格納する2つの列を持っています。

+0

内のすべての点の間のすべてのペアごとの距離を与える私はこの質問に気づいた場合[MATLABでペアワイズ距離を計算する3つの方法の比較でこの答えにリンク]を付けたいと思っています(http://stackoverflow.com/a/19456458/2778484)。もう1つの質問はひどく混乱しますが、答えはペア間の距離、どの次元の最後の方法でも対処します。 – 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であるとしましょう。各列には1点の座標が格納されています。 (繰り返しなし)すべての点対の組み合わせを取得するには、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

関連する問題