O matrice rară este o matrice cu în mare parte zero elemente. În caz contrar, dacă majoritatea elementelor matricei sunt diferite de zero, matricea este considerată a fi densă .
Printre experți, nu există o unitate în a determina exact câte elemente diferite de zero fac o matrice rară. Diferiți autori oferă opțiuni diferite. Pentru o matrice de ordin n, numărul de elemente nenule [1] :
Matrici uriașe rare apar adesea atunci când se rezolvă probleme precum ecuațiile cu diferențe parțiale .
Atunci când stocați și convertiți matrici rare într-un computer , este util și adesea necesar să folosiți algoritmi speciali și structuri de date care iau în considerare structura matricei rare. Operațiile și algoritmii utilizați pentru a lucra cu matrici obișnuite, dense, în raport cu matricele rare și mari, sunt relativ lente și necesită cantități semnificative de memorie. Cu toate acestea, matricele rare pot fi comprimate cu ușurință prin scrierea doar a elementelor lor diferite de zero, ceea ce reduce cerințele de memorie ale computerului .
Există mai multe moduri de a stoca (reprezenta) matrici rare, care diferă:
Un dicționar de chei (DOK - Dictionary of Keys) este construit ca un dicționar, unde cheia este o pereche ( rând, coloană ), iar valoarea este elementul matricei corespunzător rândului și coloanei.
O listă de liste (LIL - List of Lists) este construită ca o listă de șiruri, unde un șir este o listă de noduri de forma ( coloană, valoare ).
Lista de coordonate (COO - Lista de coordonate) este o listă de elemente din formular (linie, coloană, valoare).
Stocare pe rând comprimat (CSR - Rând rar comprimat, CRS - Stocare pe rând comprimat, format Yale)
Reprezentăm matricea originală care conține valori diferite de zero ca trei tablouri:
Exemple:
Lasă atunci
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 } -- stocați primul 0 ca element de blocareLasă atunci
matrice_de_valori = { 1 , 2 , 3 , 4 , 1 , 11 } matrice de indici_coloană = { 0 , 1 , 3 , 2 , 1 , 3 } matrice_de_rânduri_de_index = { 0 , 3 , 4 , 6 primul } -- stochează 0 ca element de blocarePentru a restabili matricea originală, trebuie să luați o anumită valoare în prima matrice și indexul corespunzător , apoi numărul coloanei , iar numărul rândului este găsit ca cel mai mic , pentru care , acest lucru este convenabil, de exemplu, atunci când matricea înmulțirea cu un vector dens
void smdv ( const crsm * A , double * b , const double * v ) // b += Av { // crsm este o structură {int n, int m, int nnz, double aval[], double aicol[], double airrow[]}; pentru ( int rând = 0 ; rând < n ; ++ rând ) pentru ( int i = A -> aer [ rând ]; i < A -> aer [ rând + 1 ]; ++ i ) b [ rând ] += A -> aval [ i ] * v [ A -> aicol [ i ]]; }Stocare pe coloană comprimată (CSС - Coloană rară comprimată, CСS - Stocare pe coloană comprimată)
La fel ca CRS, doar rândurile și coloanele își schimbă rolurile - stocăm valori pe coloane, putem determina rândul din a doua matrice, după calcule cu a treia matrice - recunoaștem coloanele.
Pentru calcule cu matrici rare, au fost create o serie de biblioteci pentru diferite limbaje de programare, printre care: