En gles matris är en matris med mestadels noll element. Annars, om de flesta av matriselementen är icke-noll, anses matrisen vara tät .
Bland experter finns det ingen enhet i att bestämma exakt hur många icke-nollelement som gör en matris gles. Olika författare erbjuder olika alternativ. För en matris av ordningen n, antalet element som inte är noll [1] :
Enorma glesa matriser uppstår ofta när man löser problem som partiella differentialekvationer .
När man lagrar och konverterar glesa matriser i en dator är det användbart, och ofta nödvändigt, att använda speciella algoritmer och datastrukturer som tar hänsyn till den glesa matrisstrukturen. Operationer och algoritmer som används för att arbeta med vanliga, täta matriser, i förhållande till stora glesa matriser, är relativt långsamma och kräver betydande mängder minne. Men glesa matriser kan enkelt komprimeras genom att bara skriva deras icke-noll-element, vilket minskar datorns minneskrav .
Det finns flera sätt att lagra (representera) glesa matriser, som skiljer sig åt:
En Dictionary of Keys (DOK - Dictionary of Keys) är byggd som en ordbok, där nyckeln är ett par ( rad, kolumn ), och värdet är matriselementet som motsvarar raden och kolumnen.
En lista med listor (LIL - List of Lists) är byggd som en lista med strängar, där en sträng är en lista med noder av formen ( kolumn, värde ).
Koordinatlistan (COO - Koordinatlista) är en lista med element i formuläret (rad, kolumn, värde).
Compressed Row Storage (CSR - Compressed Sparse Row, CRS - Compressed Row Storage, Yale-format)
Vi representerar den ursprungliga matrisen som innehåller icke-nollvärden som tre arrayer:
Exempel:
Låt då
array_of_values = { 1 , 2 , 4 , 2 , 6 } array of column_indexes = { 0 , 1 , 1 , 1 , 2 } array of_row_indexing = { 0 , 2 , 3 , 5 } -- lagra 0 först som låselementLåt då
array_of_values = { 1 , 2 , 3 , 4 , 1 , 11 } array of column_indexes = { 0 , 1 , 3 , 2 , 1 , 3 } array_of_index_rows = { 0 , 3 , 4 , 0 first } _ som ett låselementFör att återställa den ursprungliga matrisen måste du ta något värde i den första matrisen och motsvarande index , sedan kolumnnumret och radnumret hittas som det minsta , för vilket detta är praktiskt, till exempel när matrisen multiplikation med en tät vektor
void smdv ( const crsm * A , double * b , const double * v ) // b += Av { // crsm är en struktur {int n, int m, int nnz, double aval[], double aicol[], double airow[]}; för ( int rad = 0 ; rad < n ; ++ rad ) för ( int i = A -> airow [ rad ]; i < A -> airow [ rad + 1 ]; ++ i ) b [ rad ] += A -> aval [ i ] * v [ A -> aicol [ i ]]; }Komprimerad kolumnlagring (CSС - Compressed Sparse Column, CСS - Compressed Column Storage)
Samma som CRS, bara rader och kolumner ändrar roller - vi lagrar värden efter kolumner, vi kan bestämma raden från den andra matrisen, efter beräkningar med den tredje matrisen - vi känner igen kolumnerna.
För beräkningar med glesa matriser har ett antal bibliotek skapats för olika programmeringsspråk, bland annat: