Załóżmy, że mam dwie macierze Nx2, Mx2 reprezentujące odpowiednio wektory N, M 2d. Czy istnieje prosty i dobry sposób obliczenia odległości między każdą parą wektorów (n, m)?
Łatwy, ale nieefektywny sposób to oczywiście:
d = zeros(N, M);
for i = 1:N,
for j = 1:M,
d(i,j) = norm(n(i,:) - m(j,:));
endfor;
endfor;
Najbliższa odpowiedź, jaką znalazłem, jest następująca 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
źródło
źródło
cartprod
, więc teraz mogę pisać: (1)x = cartprod(n(:,1), m(:,1));
(2)y = cartprod(n(:,2), m(:,2));
(3) .. któryd = sqrt((x(:,1)-x(:,2)).^2+(y(:,1)-y(:,2)).^2)
działa znacznie szybciej!Odpowiedzi:
Wektoryzacja jest prosta w takich sytuacjach przy użyciu strategii takiej jak ta:
Oto przykład, który wektoryzuje pętlę for z 15-krotnym przyspieszeniem dla M = 1000 i N = 2000.
źródło
Od wersji Octave 3.4.3 i późniejszych operator wykonuje automatyczną transmisję (używa bsxfun wewnętrznie). Możesz więc postępować w ten sposób.
Możesz zrobić to samo za pomocą matrycy 3D, ale myślę, że to jest bardziej jasne. D jest macierzą odległości NxM, każdy wektor w N względem każdego wektora w M.
Mam nadzieję że to pomoże
źródło