Предположим, у меня есть две матрицы Nx2, Mx2, представляющие N, M 2d векторов соответственно. Есть ли простой и хороший способ рассчитать расстояния между каждой векторной парой (n, m)?
Простой, но неэффективный способ, конечно:
d = zeros(N, M);
for i = 1:N,
for j = 1:M,
d(i,j) = norm(n(i,:) - m(j,:));
endfor;
endfor;
Самый близкий ответ, который я нашел bsxfun
, использовался так:
bsxfun(inline("x-y"),[1,2,3,4],[3;4;5;6])
ans =
-2 -1 0 1
-3 -2 -1 0
-4 -3 -2 -1
-5 -4 -3 -2
performance
octave
vectorization
Келли ван Эверт
источник
источник
cartprod
, так что теперь я могу написать: (1)x = cartprod(n(:,1), m(:,1));
(2)y = cartprod(n(:,2), m(:,2));
(3)d = sqrt((x(:,1)-x(:,2)).^2+(y(:,1)-y(:,2)).^2)
... который работает намного быстрее!Ответы:
Векторизация проста в этих ситуациях, используя такую стратегию:
Вот пример, который векторизует цикл for с ускорением в 15 раз для M = 1000 и N = 2000.
источник
Начиная с октавы 3.4.3 и более поздних, оператор - осуществляет автоматическое вещание (использует bsxfun для внутреннего использования). Таким образом, вы можете продолжать таким образом.
Вы можете сделать то же самое, используя 3D-матрицу, но я думаю, что это более понятно. D - матрица расстояний NxM, каждый вектор в N против каждого вектора в M.
Надеюсь это поможет
источник