Misalkan saya memiliki dua matriks Nx2, Mx2 masing-masing mewakili N, M 2d vektor. Apakah ada cara sederhana dan bagus untuk menghitung jarak antara masing-masing pasangan vektor (n, m)?
Cara yang mudah namun tidak efisien tentu saja:
d = zeros(N, M);
for i = 1:N,
for j = 1:M,
d(i,j) = norm(n(i,:) - m(j,:));
endfor;
endfor;
Jawaban terdekat yang saya temukan adalah bsxfun
, digunakan seperti:
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
sumber
sumber
cartprod
, jadi sekarang saya dapat menulis: (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)
..yang berjalan jauh lebih cepat!Jawaban:
Vektorisasi mudah dalam situasi ini menggunakan strategi seperti ini:
Berikut adalah contoh yang memvariasikan loop untuk dengan speedup 15x untuk M = 1000 dan N = 2000.
sumber
Dari Octave 3.4.3 dan kemudian operator - melakukan siaran otomatis (menggunakan bsxfun secara internal). Jadi Anda bisa melanjutkan dengan cara ini.
Anda dapat melakukan hal yang sama menggunakan matriks 3d tapi saya rasa ini lebih jelas. D adalah matriks NxM jarak, setiap vektor dalam N terhadap setiap vektor dalam M.
Semoga ini membantu
sumber