Effiziente Multiplikation von sehr großen Matrizen in MATLAB
Ich habe nicht genug Speicher, um einfach eine Diagonale D-by-D-matrix, da D ist groß. Ich bekomme immer ein "out of memory" - Fehler.
Anstelle der Durchführung M x D x D Operationen in die erste Multiplikation, die ich tun M x D Operationen, aber immer noch mein code dauert ewig zu laufen.
Kann jemand eine effektivere Art und Weise zum ausführen der Multiplikation A'*B*A
? Hier ist, was ich bisher versucht habe:
D=20000
M=25
A = floor(rand(D,M)*10);
B = floor(rand(1,D)*10);
for i=1:D
for j=1:M
result(i,j) = A(i,j) * B(1,j);
end
end
manual = result * A';
auto = A*diag(B)*A';
isequal(manual,auto)
Ich bin verwirrt. Ist die matrix B soll D-by-D oder M-von-M -? Dein Bild sagt der ehemalige, aber dein code suggeriert letzteres.
gut erkannt, nun korrigiert
Auch, versuchen Sie, um zu berechnen, A'BEin, die Ihnen würde eine M-von-M Ergebnis?
ja, das ist es, was ich versuche zu erreichen
gut erkannt, nun korrigiert
Auch, versuchen Sie, um zu berechnen, A'BEin, die Ihnen würde eine M-von-M Ergebnis?
ja, das ist es, was ich versuche zu erreichen
InformationsquelleAutor matcheek | 2010-12-12
Du musst angemeldet sein, um einen Kommentar abzugeben.
Eine option, die sollte dein problem lösen ist die Verwendung sparse-Matrizen. Hier ist ein Beispiel:
Eine andere Möglichkeit wäre die Replikation der D-Elemente entlang der Hauptdiagonale von
B
erstellen Sie ein M-by-D-matrix mit der Funktion REPMAT, dann verwenden Sie element-Weise Multiplikation mitA.'
:Und noch eine Möglichkeit wäre die Verwendung der Funktion BSXFUN:
wenn der Speicher ist ein Problem, das
bsxfun
bevorzugtrepmat
, weil es nicht laichen eine matrix repliziert. Allerdingsbsxfun
nicht verfügbar, bis Matlab 2006 oder so...als erklärt viel, lernen jeden Tag
InformationsquelleAutor gnovice
Vielleicht bin ich ein bisschen ein brainfart hier, aber kann nicht schalten Sie Ihre DxD-matrix in eine DxM-matrix (mit M Kopien des Vektors, die Sie gegeben sind) und dann .* die letzten beiden Matrizen eher als vermehren (und dann, natürlich, normalerweise vermehren sich die erste mit der gefundenen Produkt-Menge)?
Sowohl meine Lösung und gnovice benötigen nur O(DxM) Speicher. Ich sehe nicht ein, warum meine Lösung falsch ist, während er in Ordnung ist. In der Tat, seine repmat Lösung ist mir genau (bis auf Reihenfolge der Multiplikation, das spielt keine Rolle).
danke für deine Antwort. Um es klar zu stellen, ich habe versucht, Ihre Lösung aber nicht überwinden konnte den "out of memory" - Fehler.
InformationsquelleAutor Yonatan N
Du immer "out of memory" da MATLAB nicht finden können, ein Stück der Speicher ist groß genug für die gesamte matrix. Es gibt verschiedene Techniken, um diesen Fehler zu vermeiden beschrieben in der MATLAB-Dokumentation.
In MATLAB, die Sie offensichtlich nicht brauchen explizite Programmierung von Schleifen in den meisten Fällen, weil Sie verwenden können Betreiber
*
. Es gibt eine Technik, wie die Geschwindigkeit-matrix-Multiplikation, wenn es fertig ist mit expliziten Schleifen, hier ist ein Beispiel in C#. Es ist eine gute Idee, wie (potentiell sehr großen) matrix aufgeteilt werden können in kleinere Matrizen. Enthalten diese kleineren Matrizen in MATLAB, die Sie verwenden können, cell-matrix. Es ist viel mehr wahrscheinlich, dass system findet genügend RAM, um Platz für zwei kleinere sub-Matrizen, so werden die daraus resultierenden großen matrix.die Technik der Aufspaltung einer großen matrix in kleinere Einheiten angewendet werden können, um den RAM der gleichen Art, wie es angewendet wird, um den cache. Für Sie cache spielt überhaupt keine Rolle, aber RAM hat.
InformationsquelleAutor Mikhail