Compressed Row Storage

Aus testwiki
Version vom 22. November 2023, 14:14 Uhr von imported>Aka (https, Kleinkram)
(Unterschied) ← Nächstältere Version | Aktuelle Version (Unterschied) | Nächstjüngere Version → (Unterschied)
Zur Navigation springen Zur Suche springen

Compressed Row Storage (CRS) oder Compressed Sparse Row (CSR) ist ein häufig genutztes Verfahren zum Speichern dünnbesetzter Matrizen. In der numerischen Mathematik bezeichnet man damit eine Matrix, bei der so viele Einträge aus Nullen bestehen, dass es sich lohnt, dies auszunutzen.

Beim CRS-Verfahren werden nur die von Null verschiedenen Einträge einer (m×n)-Matrix A gespeichert: In Form eines Arrays val, also an aufeinanderfolgenden Stellen im Speicher. Die für die Abbildung zwischen Positionen in der Matrix und dem Array val benötigten Informationen werden in zwei weiteren Arrays rowPtr und colInd gespeichert. In colInd ist zu jedem Eintrag aus val der Index seiner Spalte gespeichert. Er umfasst daher gleich viele Elemente wie val. Die Werte in rowPtr legen fest, welche Werte von val zu welcher Zeile gehören.

Der formale Zusammenhang zwischen der Matrix A und ihrer Darstellung unter Verwendung von CRS lautet:

Ai,j=val[k](colInd[k]=j)(rowPtr[i]k<rowPtr[i+1]).

Beispiel:
(Die blauen Zahlen geben die Zeilen und die grünen die Spalten der Matrix A an. Die Indizes beginnen wie in vielen Computersprachen üblich mit 0.)

A=(10(0,0)0012(0,3)00011(1,2)013(1,4)016(2,1)0000011(3,2)013(3,4))

In diesem Beispiel sind in den drei Vektoren folgende Werte gespeichert:

val=(10(0,0)12(0,3)11(1,2)13(1,4)16(2,1)11(3,2)13(3,4))colInd=(0(03 )2(14 )1(2)2(34 ))rowPtr=(0(0)2(1)4(2)5(3)7(4))

Sowohl val als auch colInd enthalten 7 Elemente, dies entspricht immer der Anzahl der Nichtnullelemente in A. rowPtr hat 5 Elemente; die Anzahl der Elemente ist immer um 1 größer als die Anzahl der Zeilen von A. Das Element 0 hat den Wert 0, das letzte Element gibt die Größe von colInd an, in diesem Fall 7.

Die Rekonstruktion der Zeile 1 der Matrix aus der komprimierten Speicherform geschieht folgendermaßen: Die Elemente 1 und 2 des Vektors rowPtr zeigen an, dass an der Stelle 2 der Vektoren val und colInd die Zeile 1 und an der Stelle 4 die folgende Zeile beginnt. Die Zeile 1 hat also zwei von 0 verschiedene Elemente. Ihre Spaltenindizes stehen an den Stellen 2 und 3 von colInd, ihre Werte an den entsprechenden Stellen in val: 11 in der Spalte 2 und 13 in der Spalte 4.

Literatur