Angenommen, ich habe zwei Matrizen Nx2, Mx2, die jeweils N, M 2d Vektoren darstellen. Gibt es eine einfache und gute Möglichkeit, die Abstände zwischen den einzelnen Vektorpaaren (n, m) zu berechnen?
Der einfache, aber ineffiziente Weg ist natürlich:
d = zeros(N, M);
for i = 1:N,
for j = 1:M,
d(i,j) = norm(n(i,:) - m(j,:));
endfor;
endfor;
Die nächste Antwort, die ich gefunden habe, lautet bsxfun
wie folgt :
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
quelle
quelle
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)
was viel schneller läuft!Antworten:
Das Vektorisieren ist in diesen Situationen mit einer Strategie wie der folgenden einfach:
Hier ist ein Beispiel, das die for-Schleife mit einer 15-fachen Beschleunigung für M = 1000 und N = 2000 vektorisiert.
quelle
Ab Octave 3.4.3 sendet der Operator automatisch (verwendet intern bsxfun). So können Sie vorgehen.
Sie können dasselbe mit einer 3D-Matrix tun, aber ich denke, dies ist klarer. D ist eine NxM-Matrix von Entfernungen, jeder Vektor in N gegen jeden Vektor in M.
Hoffe das hilft
quelle