2016-09-27 1 views
0

Ich habe zwei Matrizen vom Typ float:
A der Abmessungen 7000x100000 und
B der Abmessungen 100000x20.
Wenn ich sie multipliziere, verbraucht mein Code meinen gesamten RAM, obwohl die Ausgabe klein ist.
Gibt es eine Möglichkeit, dies effizienter zu machen?
Ich habe versucht, this from Matlab help page zu tun, aber es hat nicht geholfen.effiziente Methode zwei nicht schwach besetzte Matrizen des Multiplizierens

+0

Haben die Matrizen denselben numerischen Typ? Wenn "A" ein Integer-Typ ist, aber "B" ein Gleitkommatyp ist, dann gibt es eine implizite Umwandlung von "A" in Fließkomma-Punkt, der mehr Speicher als erwartet aufnehmen würde. Ich bin ein wenig verwirrt darüber, ob deine Matrizen spärlich sind oder nicht. Der Tag sagt 'Sparse-Matrix', aber der Titel sagt nicht spärlich. – jez

+0

Beide sind Float. Es tut mir leid, dass ich erwähnt haben sollte, dass – iLoveCamelCase

+0

Sie beide Matrizen 'A' und' B' im Speicher halten können, bevor Sie sie multiplizieren? bekommst du "aus dem mem" nur, wenn du versuchst zu multiplizieren? – Shai

Antwort

0

Sie können versuchen, und teilen sich in Blöcke:

durch Reihen von A:

row_blk = 1000; 
C = zeros(size(A,1), size(B,2), class(A)); 
f = 1; t = row_blk; 
while t <= size(A,1) 
    C(f:t,:) = A(f,t,:)*B; 
    f = t+1; 
    t = min(size(A,1), f+row_blk-1); 
end 

von Spalten von A:

col_blk = 10000; 
C = zeros(size(A,1), size(B,2), class(A)); 
f = 1; t = col_blk; 
while t <= size(A,2) 
    C = C + A(:,f:t)*B(f:t,:); 
    f = t+1; 
    t = min(size(A,2), f+col_blk-1); 
end 
0

ich diesen Code in GNU laufen Oktave und Speicherverbrauch dieses Codes:

a= rand(7000,100000); 
b = rand(100000,20); 

ist:

Absolute running time: 10.05 sec, cpu time: 9.97 sec, memory peak: 5375 Mb 

und Speicherverbrauch dieser Code:

a= rand(7000,100000); 
b = rand(100000,20); 
c = a * b; 

ist:

Absolute running time: 14.26 sec, cpu time: 14.19 sec, memory peak: 5376 Mb 

so kein signifikanter Unterschied beobachtet!

+0

Sogar die Erstellung der Matrizen belegt meinen RAM – iLoveCamelCase

+0

@iLoveCamelCase Wie in anderen Antwort mit einer Schleife notiert können Sie Teilmatrizen erstellen, multiplizieren, speichern Ergebnisse und dann mit dem restlichen Teil der Matrizen fortfahren – rahnema1

+0

Ich benutze 32-Bit-Version von Octave. Es ist nicht möglich, eine Matrix a (7000,100000) zu erstellen. Der Fehler ist - "Fehler: zu wenig Arbeitsspeicher oder zu große Abmessungen für Octaves Indextyp". Um mit einer solchen Matrix zu arbeiten, benötigen Sie eine 64-Bit-Version von Matlab/Octave. Ist deine Oktave 64-Bit? – SergV

Verwandte Themen