Angenommen, ich kenne die erwartete Sparsamkeit einer Matrix (dh die Anzahl der Nicht-Nullen / die insgesamt mögliche Anzahl der Nicht-Nullen). Gibt es eine Faustregel (möglicherweise eine ungefähre Angabe) für die Entscheidung, ob ein spärlicher Matrixspeicher (insbesondere ein komprimierter Zeilenspeicher) verwendet oder als dichte Matrix gespeichert werden soll?
- Geschwindigkeit ist in meiner Anwendung wichtiger als Speicher. Aus allgemeiner Neugier bin ich jedoch an Antworten aus Sicht der Geschwindigkeit und des Gedächtnisses interessiert.
- Nach dem Generieren der Matrix wende ich nur Additions- und Multiplikationsoperationen darauf an.
- Ich konnte nur qualitative Antworten finden, zB diese Frage und diese Frage, aber ich suche nach so etwas
... wenn die Sparsity mehr als ungefähr beträgt , verwenden Sie dichten Speicher.
Für zufällige spärliche Matrizen der Größe 10.000 x 10.000 im Vergleich zu dichten Matrizen der gleichen Größe war auf meiner Xeon-Workstation mit MATLAB und Intel MKL als BLAS die Multiplikation des spärlichen Matrixvektors bei Dichten von 15% schneller oder weniger. Mit 67% (wie in einer anderen Antwort vorgeschlagen ) war die dichte Matrix-Vektor-Multiplikation etwa dreimal schneller.
quelle
Selbst wenn eine Matrix sehr dünn ist, kann ihr Matrixprodukt mit sich selbst dicht sein. Nehmen Sie zum Beispiel eine Diagonalmatrix und füllen Sie ihre erste Zeile und Spalte mit Einträgen ungleich Null. sein Produkt mit sich selbst wird vollständig dicht sein. Eine solche Matrix kann beispielsweise als Graph Laplace eines Graphen entstehen, in dem sich ein Scheitelpunkt befindet, der mit allen anderen Scheitelpunkten verbunden ist. In der Praxis reicht es aus, wenn es nur wenige Eckpunkte mit ziemlich hoher Konnektivität zum Rest des Netzwerks gibt. Für die Matrixvektormultiplikation ist dieses Phänomen weniger relevant, obwohl es zu Ungleichgewichten führen kann, wenn versucht wird, die Matrixvektormultiplikation zu parallelisieren.
Was ich hervorheben möchte: Es hängt wirklich vom Sparsity-Muster ab und davon, was Sie mit der Matrix machen möchten. Die beste Definition einer spärlichen Matrix, die ich finden kann (die gleichzeitig ziemlich nutzlos ist), lautet also wie folgt:
Die Lektion zu lernen: Es hängt wirklich davon ab, was Sie damit machen möchten , welchen Algorithmus Sie verwenden und (wie andere bereits betont haben) welche Hard- und Software Sie verwenden, ob eine bestimmte Matrix spärlich ist oder nicht (lesen Sie als: ob Sie eine spärliche oder dichte Matrixdatenstruktur verwenden sollten). Es kann keine rein prozentuale Regel geben, wenn es nicht nur um das Speichern von Daten oder die Multiplikation von Matrixvektoren geht. Der beste Weg, um herauszufinden, ob Ihre Matrizen spärlich sind, besteht darin, es zu versuchen und mit Methoden mit dichter Matrix zu vergleichen.
quelle