Suponha que eu tenha duas matrizes Nx2, Mx2 representando N, M2 vetores, respectivamente. Existe uma maneira simples e boa de calcular distâncias entre cada par de vetores (n, m)?
A maneira mais fácil, porém ineficiente, é:
d = zeros(N, M);
for i = 1:N,
for j = 1:M,
d(i,j) = norm(n(i,:) - m(j,:));
endfor;
endfor;
A resposta mais próxima que encontrei é a seguinte 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
Kelley van Evert
fonte
fonte
cartprod
, então agora eu posso escrever: (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)
..o que corre muito mais rápido!Respostas:
A vetorização é direta nessas situações, usando uma estratégia como esta:
Aqui está um exemplo que vetoriza o loop for com uma aceleração de 15x para M = 1000 e N = 2000.
fonte
A partir da oitava 3.4.3 e posterior, o operador - faz a transmissão automática (usa bsxfun internamente). Então você pode proceder dessa maneira.
Você pode fazer o mesmo usando uma matriz 3d, mas acho que assim é mais claro. D é uma matriz NxM de distâncias, todo vetor em N contra todo vetor em M.
Espero que isto ajude
fonte