Быстрый способ вычисления попарных расстояний и ближайших соседей в Matlab? - PullRequest
1 голос
/ 29 февраля 2012

У меня есть матрица A размером n на d, представляющая n d-мерных точек. У меня есть еще одна матрица B размером m на d, представляющая m точек измерения d.

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

Заметьте, я знаю, как сделать два вышеупомянутых цикла. Но в Matlab неэффективно использовать циклы, поэтому я задаю эти вопросы.

Спасибо!

1 Ответ

2 голосов
/ 29 февраля 2012

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

[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); 
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...