2012-02-29 3 views
1

У меня есть n на d матрица A, представляющая n d-мерных точек. У меня есть другая матрица B, представляющая m d-мерные точки.Быстрый способ вычисления попарных расстояний и ближайших соседей в Matlab?

  1. Интересно, как эффективно компьютер т о с п матрицей, чья (I, J) элемента представляет евклидово расстояния между я-й строкой матрицей А и J-й строкой матрицей B?
  2. Как я могу эффективно определить вектор из m элементов, чей k-й элемент представляет строку A, ближайшую к k-й строке B?

Примечание: Я знаю, как сделать эти два использования с использованием петель. Но в Matlab неэффективно использовать циклы, поэтому я задаю эти вопросы.

Спасибо!

+0

Вы могли бы быть заинтересованы в моем вкладе http://stackoverflow.com/questions/23911670/efficiently-compute-pairwise-squared-euclidean-distance-in-matlab/23911671?noredirect=1 – matheburg

ответ

2

Если у вас достаточно оперативной памяти, эффективный способ может быть

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

distMat = zeros(n,m); 

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

Вы определенно должны профилировать два решения, так как цикл может быть достаточно оптимизирован, что ndgrid раствора медленнее.

Чтобы найти строку в A, ближайшую к точкам в B, вы можете использовать min. Обратите внимание, что это даст вам только одно минимальное расстояние для каждой точки; если вам нужно определить связи, вы должны использовать find.

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

Спасибо! +1. Это действительно занимает много памяти. Мой случай равен n = m = 2000 и d = 6. Мой ноутбук замерз. –

+0

@ Ethan: Мне тоже нужно купить новый ноутбук. 8 ГБ оперативной памяти заполняется так быстро :) – Jonas

+0

Есть ли у вас несколько альтернативных способов сбалансировать компромисс между временем и памятью? –