Sparse matrix

En matrix gemmes typisk som et todimensionelt array. Hver post i arrayet repræsenterer et element ai,j i matrixen og tilgås ved hjælp af de to indekser i og j. Konventionelt er i rækkeindekset, nummereret fra top til bund, og j er kolonneindekset, nummereret fra venstre til højre. For en m × n-matrix er den mængde hukommelse, der kræves for at lagre matrixen i dette format, proportional med m × n (uden at tage hensyn til, at matrixens dimensioner også skal lagres).

I tilfælde af en sparsom matrix kan der opnås en væsentlig reduktion af hukommelsesbehovet ved kun at lagre de poster, der ikke er nul, ved at lagre de poster, der ikke er nul. Afhængigt af antallet og fordelingen af de poster, der ikke er nul, kan der anvendes forskellige datastrukturer, som giver store hukommelsesbesparelser i forhold til den grundlæggende fremgangsmåde. Kompromiset er, at adgangen til de enkelte elementer bliver mere kompleks, og der er behov for yderligere strukturer for at kunne genfinde den oprindelige matrix entydigt.

Formater kan opdeles i to grupper:

  • De, der understøtter effektiv ændring, som f.eks. DOK (Dictionary of keys), LIL (List of lists) eller COO (Coordinate list). Disse anvendes typisk til at konstruere matricerne.
  • De, der understøtter effektiv adgang og matrixoperationer, såsom CSR (Compressed Sparse Row) eller CSC (Compressed Sparse Column).

Dictionary of keys (DOK)Rediger

DOK består af en ordbog, der kortlægger (række, kolonne)-par til værdien af elementerne. Elementer, der mangler i ordbogen, anses for at være nul. Formatet er godt til inkrementel opbygning af en sparsom matrix i tilfældig rækkefølge, men dårligt til iterering over værdier, der ikke er nul, i leksikografisk rækkefølge. Man konstruerer typisk en matrix i dette format og konverterer derefter til et andet mere effektivt format til behandling.

List of lists (LIL)Rediger

LIL gemmer en liste pr. række, hvor hver post indeholder kolonneindekset og værdien. Typisk opbevares disse poster sorteret efter kolonneindeks for hurtigere opslag. Dette er et andet format, der er godt til inkrementel matrixkonstruktion.

Koordinatliste (COO)Rediger

COO gemmer en liste af (række, kolonne, værdi)-tupler. Ideelt set sorteres posterne først efter rækkeindeks og derefter efter kolonneindeks for at forbedre tilfældige adgangstider. Dette er et andet format, der er godt til inkrementel matrixkonstruktion.

Compressed sparse row (CSR, CRS eller Yale-format)Rediger

Det komprimerede sparse row (CSR) eller compressed row storage (CRS) eller Yale-formatet repræsenterer en matrix M ved hjælp af tre (endimensionale) arrays, der henholdsvis indeholder værdier, der ikke er nul, rækkernes udstrækninger og kolonneindekser. Det svarer til COO, men komprimerer rækkeindeksene, deraf navnet. Dette format giver mulighed for hurtig rækkeadgang og matrix-vektor-multiplikationer (Mx). CSR-formatet har været i brug i hvert fald siden midten af 1960’erne, og den første fuldstændige beskrivelse blev offentliggjort i 1967.

CSR-formatet gemmer en sparsom m × n-matrix M i rækkeform ved hjælp af tre (endimensionale) arrays (V, COL_INDEX, ROW_INDEX). Lad NNZ betegne antallet af poster uden nul i M. (Bemærk, at nulbaserede indekser skal anvendes her.)

  • Arrays V og COL_INDEX er af længde NNZ og indeholder henholdsvis værdierne uden nul og kolonneindeksene for disse værdier.
  • Array ROW_INDEX er af længde m + 1 og koder indekset i V og COL_INDEX, hvor den givne række starter. Det sidste element er NNZ , dvs, det fiktive indeks i V umiddelbart efter det sidste gyldige indeks NNZ – 1.

For eksempel matrix

( 5 0 0 0 0 0 0 0 8 0 0 0 0 0 0 0 3 0 0 0 0 6 0 0 0 ) {\displaystyle {\begin{pmatrix}5&0&0&0&0\0&8&0&0&0&0&3&0\0&6&0&0&0\\end{pmatrix}}}

{\displaystyle {\begin{pmatrix}}5000\0800\0030\0600\end{pmatrix}}}}

er en 4 × 4-matrix med 4 elementer, der ikke er nul, og derfor

 V = COL_INDEX = ROW_INDEX = 

forudsætter et nul-indekseret sprog.

For at udtrække en række definerer vi først:

 row_start = ROW_INDEX row_end = ROW_INDEX

Dernæst tager vi skiver fra V og COL_INDEX, der starter ved row_start og slutter ved row_end.

For at udtrække række 1 (den anden række) i denne matrix indstiller vi row_start=1 og row_end=2. Derefter laver vi skiverne V = og COL_INDEX = . Vi ved nu, at vi i række 1 har et element i kolonne 1 med værdien 8.

I dette tilfælde indeholder CSR-repræsentationen 13 poster, sammenlignet med 16 i den oprindelige matrix. CSR-formatet sparer kun på hukommelsen, når NNZ < (m (n (n – 1) – 1) – 1) / 2.Et andet eksempel, matricen

( 10 20 0 0 0 0 0 0 0 30 0 0 40 0 0 0 0 0 0 50 60 70 0 0 0 0 0 0 0 0 0 80 ) {\displaystyle {\begin{pmatrix}10&20&0&0&0&0\\0&30&0&40&0&0\\0&0&50&60&70&0\\0&0&0&0&0&80\\\end{pmatrix}}}

{\begin{pmatrix}}10200000\\03004000\005060700\0000080\\end{pmatrix}}}

er en 4 × 6-matrix (24 poster) med 8 elementer, der ikke er nul, så

 V = COL_INDEX = ROW_INDEX = 

det hele gemmes som 21 poster.

  • ROW_INDEX opdeler arrayet V i rækker: (10, 20) (30, 40) (50, 60, 70) (80);
  • COL_INDEX justerer værdierne i kolonnerne: (10, 20, ...) (0, 30, 0, 40, ...)(0, 0, 50, 60, 70, 0) (0, 0, 0, 0, 0, 80).

Bemærk, at i dette format er den første værdi af ROW_INDEX altid nul og den sidste værdi altid NNZ, så de er på en måde overflødige (selv om NNZ ikke ville være overflødig i programmeringssprog, hvor arraylængden skal lagres eksplicit,). Ikke desto mindre undgår man på denne måde at skulle håndtere et undtagelsestilfælde ved beregning af længden af hver række, da det garanterer, at formlen ROW_INDEX – ROW_INDEX virker for enhver række i. Desuden er hukommelsesomkostningerne ved denne redundante lagring sandsynligvis ubetydelige for en tilstrækkelig stor matrix.

De (gamle og nye) Yale sparse matrixformater er eksempler på CSR-ordningen. Det gamle Yale-format fungerer nøjagtigt som beskrevet ovenfor med tre arrays; det nye format kombinerer ROW_INDEX og COL_INDEX i et enkelt array og håndterer matrixens diagonal separat.

For logiske adjacensmatricer kan dataarrayet udelades, da eksistensen af en post i row-arrayet er tilstrækkelig til at modellere en binær adjacensrelation.

Det er sandsynligvis kendt som Yale-formatet, fordi det blev foreslået i rapporten Yale Sparse Matrix Package fra 1977 fra Department of Computer Science ved Yale University.

Compressed sparse column (CSC eller CCS)Edit

CSC svarer til CSR, bortset fra at værdierne læses først kolonnevis, der gemmes et rækkeindeks for hver værdi, og der gemmes kolonnevisere. CSC er f.eks. (val, row_ind, col_ptr), hvor val er et array af matrixens værdier (fra top til bund og derefter fra venstre til højre), der ikke er nul, row_ind er de rækkeindekser, der svarer til værdierne, og col_ptr er listen over val-indekser, hvor hver kolonne starter. Navnet er baseret på det faktum, at kolonneindeksoplysningerne er komprimeret i forhold til COO-formatet. Man bruger typisk et andet format (LIL, DOK, COO) til opbygning. Dette format er effektivt til aritmetiske operationer, kolonneopdeling og matrix-vektorprodukter. Se scipy.sparse.csc_matrix. dette er det traditionelle format til angivelse af en sparsom matrix i MATLAB (via funktionen sparse).