2012-02-29 26 views
1

私は、n d次元の点を表すn行d列の行列Aを持っています。私はd個の次元の点を表す行列Bで別のmを持っています。Matlabでペアワイズ距離と最近傍を高速に計算する方法はありますか?

  1. 私はどのように(i、j)はn個の行列、によってM効率的にコンピュータにだろ 要素は 行列Aおよび行列Bのj番目の列のi番目の行との間のユークリッド距離を表しますか?
  2. k番目の 要素がBのk番目の行に最も近いAの行を表すm要素のベクトルを効率的に決定するにはどうすればよいですか?

注意私は上記の2つのループを使用して行う方法を知っています。しかし、Matlabでは、ループを使うのは効率的ではないので、私はこれらの質問をします。

ありがとうございます!

+0

あなたは私の貢献http://stackoverflow.com/questions/23911670/efficiently-compute-pairwise-squared-euclidean-distance-in-matlab/23911671?noredirect=1 – matheburg

答えて

2

あなたは十分なRAMを持っている場合は、効率的な方法は

[idxA,idxB] = ndgrid(1:n,1:m); 

distMat = zeros(n,m); 

distMat(:) = sqrt(sum((A(idxA,:) - B(idxB,:)).^2,2)); 

ループが十分にndgridソリューションが遅くなることを最適化することができるので、あなたは間違いなく、2つのソリューションをプロファイリングする必要がありかもしれません。

Bの点に最も近いAの行を見つけるには、minを使用できます。これは各点の最小距離を1つだけ与えることに注意してください。結束を特定する必要がある場合は、findを使用する必要があります。

[minDist,closestRowsInA] = min(distMat,[],1); 
+0

おかげで興味がある可能性! +1。それは確かに多くの記憶を必要とします。私のケースはn = m = 2000、d = 6です。私のラップトップはしばらく凍りつきました。 –

+0

@Ethan:私も新しいノートパソコンを購入する必要があります。 8GBのRAMがすぐにいっぱいになる:) – Jonas

+0

時間とメモリのトレードオフのバランスをとる代替方法がありますか? –

関連する問題