Angenommen, ich habe eine Matrix von Elementen wie so:Effizientes eine 3D-Matrix von äußeren Produkten berechnen - MATLAB
A = reshape(1:25, 5, 5)
A =
1 6 11 16 21
2 7 12 17 22
3 8 13 18 23
4 9 14 19 24
5 10 15 20 25
ich effizient eine 3D berechnen Matrix von äußeren Produkten, so dass die i th möchte Schicht dieser Ausgangsmatrix ist das äußere Produkt der Spalte A
mit sich selbst. Das äußere Produkt zwischen zwei Vektoren u
und v
ist einfach u*v.'
, wenn u
und v
beide Spaltenvektoren sind.
Daher wird jede Scheibe von dieser Ausgangsmatrix B
sollte so aufgebaut sein, dass:
B(:,:,1) = A(:,1) * A(:,1).';
B(:,:,2) = A(:,2) * A(:,2).';
...
...
B(:,:,5) = A(:,5) * A(:,5).';
My aktuellen Methode ist die folgende. Ich habe es auf diese Weise zu tun unter Verwendung arrayfun
und cell2mat
:
cellmatr = arrayfun(@(x) A(:,x) * A(:,x).', 1:size(A,2), 'uni', 0);
out = reshape(cell2mat(cellmatr), size(A,1), size(A,1), size(A,2));
I einfach Schleife über eine lineare Indexanordnung zwischen 1
und so vielen Spalten wir in A
haben, und für jedes Element in diesem Array zugreifen I die entsprechende Spalte und berechne das äußere Produkt. Die Ausgabe ergibt somit ein 1D-Gitter aus Zellen, das ich dann zurück in eine 2D-Matrix umwandle, um dann in eine 3D-Matrix umzuformen, um die 3D-Matrix der äußeren Produkte zu finden.
Für große Matrizen ist dies jedoch ziemlich langsam. Ich habe auch versucht, das Matrixprodukt durch kron
(d. H. kron(A(:,x), A(:,x))
) innerhalb meiner arrayfun
Aufforderung zu ersetzen, aber das ist immer noch ziemlich langsam für meine Zwecke.
Kennt jemand eine effiziente Möglichkeit, diese 3D-Matrix von äußeren Produkten auf diese Weise zu berechnen? Diese
haben Sie in diesen sehen: http://www.mathworks.com/matlabcentral/fileexchange/25977-mtimesx- Fast-Matrix-Multiply-mit-multi-dimensionale Unterstützung – bla
@natan - Ich habe nicht, aber danke für den Link zu FEX! – rayryeng
Ich frage mich, wie effizient wäre das vs Divakar Antwort ... – bla