2016-06-15 26 views
1

Ich weiß, dass Sparse-Matrix in Gürteltier ist noch in der vorläufigen Unterstützung. Ich benutze Armadillo Lib in meiner Quantensystemforschung und ich habe Probleme, sparse Mat in effektiver RAM-Weise zu konstruieren.Armadillo: effiziente RAM sparse Batch-Insertion

Bisher habe ich meine eigene Implementierung von Sparse-Matrizen verwendet, aber ich möchte eine optimierte Matrixklasse haben.

Ich Elemente im Batch-Modus Füllung:

umat loc(2,size); 
cx_vec val(size); 

// calculate loc and val 
... 
// 

sp_cx_mat Hamiltonian(loc, val); 

Diese Art von Aktion Kopie Werte von loc, val Konstruktor von Hamilton-und für einige wenige Sekunden benötigen 2x RAM. Ich berechne eine riesige Matrix (Größe ist ungefähr 2 ** L, wobei L = 22, 24, ...), also wünschte ich, ich hätte den Code im Speicher gut optimiert. Zum Vergleich Matrixgröße: 705432x705432 - RAM und "Füllzeit":

  • meiner Implementierung (COO-Format): Zeit 7.95s, Speicher 317668kB

  • Gürteltier (CSC-Format): Zeit 5.32s, Speicher 715000kB

Ist es möglich, Fragmente von Vektoren ausplanen: loc, val on the fly durch Elementspeicher, Element zu retten?

Antwort

2

Die Antwort wird sein, die andere Sparse Matrix Konstruktor zu verwenden, die das CSC-Format nimmt, so dass Sie Ihre // calculate loc and val Code ändern müssen, stattdessen die folgenden drei Felder ausfüllen:

  • values (Länge gleich Anzahl der Punkte)
  • row_indices (Länge, die gleich Anzahl der Punkte)
  • col_ptrs (Länge, die gleich Anzahl der Spalten plus eins)

Die Punkte sollten in den Ordnungen values und row_indices in der Reihenfolge der Reihenfolge der Spalten angeordnet sein, und der Vektor col_ptrs enthält die Anzahl der Elemente ungleich Null vor dem Beginn der Spalte. Das heißt, col_ptrs[0] enthält immer 0, col_ptrs[1] enthält die Anzahl der Elemente ungleich Null in der ersten Spalte, col_ptrs[2] enthält die Anzahl der Elemente ungleich Null in der ersten und zweiten Spalte und col_ptrs[n_cols + 1] enthält die Anzahl der Elemente ungleich Null in der Matrix.

Weitere Dokumentation zu diesem Konstruktor finden Sie im Abschnitt "Batch-Konstruktoren" von http://arma.sourceforge.net/docs.html#SpMat; Dies ist der vierte Eintrag in dieser Liste.

Wenn Sie Ihren Berechnungscode nicht einfach ändern können, um dieses Format einzuhalten, sollten Sie besser versuchen, sort_locations = false für den verwendeten Konstruktor anzugeben, wenn Sie dies nicht bereits tun.

+0

Also wenn ich mein Verständnis richtig ist, hat Konstruktor mit COO-Format RAM "Verbrauch" in CSC-Format zu konvertieren, wenn ich Konstruktor mit CSC-Format verwende ich RAM sparen, weil ich nicht solche Umwandlung tun werde? – andywiecko