2016-07-20 11 views
1

Ich habe nicht genügend Speicherfehler beim Versuch, eine bestimmte lineare Gleichung zu lösen (ich werde den Code unten setzen). Da ich es gewohnt bin, in C zu schreiben, wo Sie jede Kontrolle über die von Ihnen erstellten Objekte haben, frage ich mich, ob ich Matlab ineffizient verwende. Hier ist der relevante Teil des CodesSpeicherfehler in Matlab beim Lösen einer linearen Gleichung

myData(n).AMatrix = sparse(fscanf(fid2, '%f', [2*M, 2*M])); 
myData(n).AMatrix = transpose(myData(n).AMatrix); 

%Read the covariance^2 matrix 
myData(n).CovMatrix = sparse(fscanf(fid2, '%f', [2*M,2*M])); 
myData(n).CovMatrix = reshape(myData(n).CovMatrix, [4*M*M,1]); 

%Kronecker sum of A with itself 
I=sparse(eye(2*M)); 
myData(n).AA=kron(I, myData(n).AMatrix)+kron(myData(n).AMatrix,I); 
myData(n).AMatrix=[]; 
I=[]; 

%Solve (A+A)x = Vec(CovMatrix) 
x=myData(n).CovMatrix\myData(n).AA; 

Der Versuch, diesen Code zu verwenden ich den Fehler

Error using \ 
Out of memory. Type HELP MEMORY for your options. 

Error in COV (line 62) 
x=myData(n).CovMatrix\myData(n).AA; 

Vor diesem Stück Code ich nur einige Dateien öffnen (die zwei 100x100-Array von Schwimmern enthalten) also glaube ich nicht, dass sie zu diesem Fehler beitragen. Das Element AMatrix ist ein 100 x 100-Array. Also hat die in Frage stehende lineare Gleichung Dimensionen 10000 x 10000. Auch AA hat einen eindimensionalen Kern, ich weiß nicht, ob dies die numerischen Berechnungen beeinflusst. Später projiziere ich die erhaltene Lösung auf das orthogonale Komplement des Kernels, um die "gute" Lösung zu erhalten, aber sie kommt nach dem Fehler. Für Leute, die damit vertraut sind, ist dies nur eine Lösung für die Lyapunov-Gleichung AX + XA = Cov. Die Matrix A ist spärlich, sie hat 4 50x50-Sublocks, von denen die eine Nullen ist, die andere ist Identität, die andere ist diagonal und die andere hat weniger als 1000 Nicht-Null-Elemente. Die Matrix CovMatrix ist diagonal mit 50 Nicht-Null-Elementen in der Diagonalen.

Das Problem ist im Moment kann ich nur die Berechnungen auf einem kleinen PC mit 2GB RAM mit 2,5-6GB virtuellen Speicher machen. Wenn ich memmory auf Matlab laufen gibt es

>> memory 
Maximum possible array: 311 MB (3.256e+08 bytes) * 
Memory available for all arrays: 930 MB (9.749e+08 bytes) ** 
Memory used by MATLAB: 677 MB (7.102e+08 bytes) 
Physical Memory (RAM): 1931 MB (2.025e+09 bytes) 

Ich bin nicht sehr kenntnisreich, wenn es um Speicher kommt, damit ich offen bin selbst einfache Ratschläge. Vielen Dank.

+0

Ist 'AA', die Ausgabe von' kron', noch spärlich? Im Sinne von 'issparse'? –

+0

Minor Note: 'spärlich (Auge (2 * M))' kann mit 'speye (2 * M)' gemacht werden. –

+0

Es wäre schön, wenn Sie einen Code schreiben könnten, um AMatrix und CovMatrix zu erstellen (auch wenn mit zufälligen Werten), oder die beiden Dateien irgendwo posten, weil ich versuche, Ihre Arrays aus Ihrer Beschreibung neu zu erstellen, und ich bin mir nicht sicher Ich mache es richtig. Danke für's Nachdenken. –

Antwort

1

Komplexe Funktionen weisen normalerweise während der Berechnung einen temporären Speicher zu. 10000x10000 sieht ziemlich groß aus, wenn während der Berechnung eine temporäre Matrix mit dieser Größe zugewiesen wird. Sie könnten ein paar kleinere Problemgrößen ausprobieren und die obere Grenze Ihres aktuellen Computers herausfinden.

Verwandte Themen