AdamátorZápiskyHlášky

Metody pro řídké matice ⬩ 01MRMMI

Přednášejícíprof. Ing. Jiří Mikyška, Ph.D.
Semestrzima 2025

Na konci se bude psát zápočtový test prověřující praktické znalosti. Není potřeba umět důkazy.

  1. Úvod
    1. Reprezentace řídkých matic v počítači
      1. Souřadnicový formát
        1. Komprimované řídké řádky (CSR)
          1. Modifikované komprimované řídké řádky (MSR)
            1. Ellpack
              1. Diagonální uložení
              2. Přímé metody řešení soustav
                1. Popis struktury řídkých matic
                  1. Přeuspořádání matic
                    1. Algoritmy pro vytvoření pásu/profilu
                      1. Uspořádání minimalizující zaplněnost
                        1. Uspořádání přizpůsobující matici počítačové architektuře
                          1. Frontální metoda
                          2. Poznámky k obecnějším systémům
                            1. Indefinitní symetrické matice
                              1. Obecné regulární matice

                              Úvod

                              Definice Matice An×n je řídká, pokud obsahuje málo nenulových prvků. Mluvíme-li o nějaké třídě matic, slovem „málo“ se většinou myslí 𝒪(n).
                              Definice alternativní Matice An×n je řídká, pokud jsme schopni využít znalosti struktury nenulových prvků k účinnému řešení soustavy.

                              Soustavy s řídkými maticemi často vznikají z řešení parciálních diferenciálních rovnic metodou sítí, konečných objemů nebo konečných prvků.

                              Příklad Mějme metodu konečných diferencí pro dvourozměrnou Poissonovu rovnici:
                              u=f,Ω=(0,1)2,u|Ω=0.
                              Zvolíme mřížku xi,j[ihx,jhy] a aproximujeme
                              u(xi,j)ui+1,j2ui,j+ui1,jhx2ui,j+12ui,j+ui,j1hy2.
                              Soustavu potom můžeme zapsat jako matici, která má v každém řádku nanejvýš pět nenulových prvků. (Detaily viz NM2.)

                              Kdybychom měli jemnost třeba 106 a chtěli to řešit naivně, na matici bychom potřebovali 8 TB paměti. Ovšem pokud ji uložíme jako řídkou, potřebujeme jen několik MB. A jelikož dokonce známe její přesný tvar, můžeme ji uložit jako implicitní a to nezabere téměř žádnou paměť.

                              Reprezentace řídkých matic v počítači

                              Chceme řídkou matici uložit tak, aby zabrala co nejméně paměti a efektivně se s ní počítalo.

                              Souřadnicový formát

                              Příklad Matici
                              (1002034050607890010110000012)
                              uložíme jako
                              {123456789101112112223333445141241345345}.

                              Nevýhoda je, že v takové reprezentaci je těžké například najít prvek na dané pozici.

                              Komprimované řídké řádky (CSR)

                              Příklad Matici
                              (1002034050607890010110000012)
                              uložíme jako
                              {123456789101112141241345345136101213}.

                              Oproti souřadnicovému formátu to šetří paměť. Nevýhodou ovšem je, že je obtížné přidávat nové nenulové prvky, což může být důležité třeba u metod založených na Gaussově eliminaci.

                              Analogicky můžeme mít komprimované řídké sloupce (CSC).

                              Modifikované komprimované řídké řádky (MSR)

                              Motivací je, že často potřebujeme efektivnější přístup k prvkům na hlavní diagonále.

                              Příklad Matici
                              (1002034050607890010110000012)
                              uložíme jako
                              {14711122356891078101314144141453}.

                              Kromě efektivního přístupu k diagonále má stejné výhody a nevýhody jako CSR.

                              Ellpack

                              Tento formát je populární na vektorových počítačích.

                              Využívá se pro matice, kde počet nenulových prvků v jednom řádku je omezený nějakou konstantou Nd.

                              Příklad Matici (jinou než v předchozích příkladech)
                              (1020034050067080091000001112)
                              uložíme jako
                              ([123456789101112],[131242353445]).

                              Formát je jednoduchý a většinou se s ním dobře pracuje, akorát nejde použít, když má matice nějaké husté řádky.

                              Diagonální uložení

                              Vhodné pro matice, které mají nenulové prvky pouze podél několika málo diagonál (například ty vzniklé z metody konečných diferencí).

                              Prostě uložíme hodnoty těchto diagonál a k tomu si poznamenáme, kolikáté jsou.

                              Příklad Matici
                              (1020034050067080091000001112)
                              uložíme jako
                              ([0,2,1],[147101225836911]).

                              Přímé metody řešení soustav

                              Mějme soustavu Ax=b, kde An×n. Z NMA víme, že řešením soustavy řádkovými úpravami pro silně regulární matici vznikne rozklad A=LU, kde L je dolní trojúhelníková a U je horní trojúhelníková. Získáme-li tento rozklad, můžeme snadno řešit jakoukoli soustavu s tou samou maticí: stačí spočítat y podle Ly=b a x podle Ux=y.

                              Je-li A pozitivně definitní, potom U=L𝖳, takže jde o Choleského rozklad: A=LL𝖳.

                              TBD

                              Popis struktury řídkých matic

                              Definice Graf matice An×n je graf G(A)(V,E), kde Vn^ a
                              E{(i,j)n^×n^|ij,Ai,j0}.
                              Příklad
                              A(××00×××00××××0××)
                              %37427 4 4 3 3 4->3 1 1 4->1 3->4 2 2 3->2 2->3 2->1 1->2
                              Příklad Je-li matice strukturálně symetrická, můžeme uvažovat neorientovaný graf:
                              A(××0××××00××××0××)
                              %37461 4 4 3 3 4--3 2 2 3--2 1 1 2--1 1--4

                              Vznik zaplnění

                              Mějme matici A, na kterou aplikujeme první krok podmaticového algoritmu. Tím se změní její zaplnění:

                              A=(××××0××000×0×00×00××000××)A(1)=(××××0××××0××××0×××××000××).
                              %37489 1 1 2 2 1--2 3 3 1--3 4 4 1--4 2--3 3--4 4--2 5 5 4--5

                              Obecně to funguje tak, že v k-tém kroku se všechny sousední vrcholy k propojí do kliky. To je formálně vyjádřeno v následujícím lemmatu:

                              Lemma o zaplnění Nechť An×n je pozitivně definitní, i,jn^,i>j,kn^. Potom
                              Ai,j(k)0Ai,j(k1)0(Ai,k(k1)0Ak,j(k1)0).
                              Důkaz Triviálně plyne z podmaticového algoritmu.
                              Věta o zaplnění Nechť An×n je pozitivně definitní, i,jn^,i>j. Potom Ai,j(n1)0, právě když v G(A) existuje cesta ip1ptj taková, že pro všechna lt je pl<j. (Jinými slovy, cesta musí ležet v podgrafu indukovaném vrchholy j^.)
                              Důkaz Indukcí podle předchozího lemmatu. TBD

                              Eliminační strom

                              Definice Eliminační strom matice An×n s Choleského rozkladem A=LL𝖳 je strom T=(V,ET), kde V=n^ a
                              ET{(min{i>j|Li,j0},j)|jn^}.
                              Jinými slovy, předkem j-tého vrcholu je vrchol s indexem odpovídajícím řádku, v němž je první nenulový prvek pod diagonálou v j-tém sloupci L.
                              Příklad
                              A=(×00×00×00×00××××0××00××0×)L=(×00000×00000×00×0××00××××)
                              %37521 5 5 4 4 5->4 2 2 5->2 1 1 4->1 3 3 4->3
                              Pozorování Kořen eliminačního stromu je prvek s nejvyšším indexem, tedy n.
                              Věta Je-li Li,j0 pro i>j, potom i je předek j v T.
                              Důkaz Pokud i je nejmenší i>j splňující Li,j0, potom je z definice stromu přímý předek. TBD
                              Poznámka Implikaci nelze obrátit. V předchozím příkladě je 5 předkem 1, ale A5,1=0.
                              Důsledek Jsou-li Ti a Tj disjunktní podstromy T s kořeny i,j, potom pro všechny rTi,sTj,r>s je Lr,s=0.
                              Věta Nechť An×n je pozitivně definitní, i,jn^,i>j. Potom Li,j0, právě když j je předkem nějakého k takového, že Ai,k0.
                              Důkaz TBD
                              Definice Struktura j-tého sloupce matice A je
                              struct(A,j){in^|ij,Ai,j0}.
                              Věta Pro matici L v Choleského rozkladu platí
                              struct(L,j)=struct(A,j)kT[j]struct(L,k)j1^.

                              Přeuspořádání matic

                              Příklad Mějme matici ve tvaru
                              A(×××××××××00000×0×0000×00×000×000×00×0000×0×00000×).
                              Již po jednom kroku eliminace se zaplní všechny prvky pod diagonálou:
                              A(1)=(×××××××××00000×××0000××××000×××××00××××××0×××××××).
                              Co kdybychom ale nejdřív permutovali řádky a sloupce? Vezměme permutační matici
                              P(0000001010000000100000001000000010000000101000000).
                              Potom budeme pracovat s maticí
                              A~PAP𝖳=(×00000×0×0000×00×000×000×00×0000×0×00000×××××××××).
                              V té se v žádném kroku nic nezaplní. Permutací jsme tedy výrazně zvýšili efektivitu. Všimněme si také, že G(A) %37535 1 1 2 2 1--2 3 3 1--3 4 4 1--4 5 5 1--5 6 6 1--6 7 7 1--7 se liší jen označením vrcholů od G(A~): %37551 7 7 2 2 7--2 3 3 7--3 4 4 7--4 5 5 7--5 6 6 7--6 1 1 7--1
                              Pozorování Je-li A symetrická matice a P permutační matice odpovídající permutaci π, potom A~PAP𝖳 je symetrická a platíGrafy A a A~ se tedy liší jen označením vrcholů.

                              Je otázkou, jakou permutaci zvolit, abychom si usnadnili práci co nejvíce. K tomu je několik různých přístupů.

                              Algoritmy pro vytvoření pásu/profilu

                              Definice Pro danou matici An×n a in^ označme
                              fimin{jn^|Ai,j0}.
                              Šířka profilu i-tého řádku je δiifi. Profil matice je
                              Profil(A){(i,j)n^×n^|fiji}.
                              Šířka pásu je δmaxiδi. Pás matice je
                              Pás(A){(i,j)n^×n^|iδji}.
                              Příklad %37567 1 1 2 2 1--2 3 3 2--3 6 6 2--6 4 4 3--4 7 7 3--7 8 8 4--8 8--7 7--6 5 5 6--5 5--1
                              A(××00×000×××00×000×××00×000××000××000××000×00×××000×00×××000×00××)
                              Profil(A):(××00×000×××00×000×××00×000××000××000××000×00×××000×00×××000×00××)
                              Pás(A):(××00×000×××00×000×××00×000××000××000××000×00×××000×00×××000×00××)
                              Přeuspořádáme pro vytvoření lepšího profilu a pásu: %37589 1 1 3 3 1--3 5 5 3--5 4 4 3--4 7 7 5--7 6 6 5--6 8 8 7--8 8--6 6--4 2 2 4--2 2--1
                              A~(×××00000××0×0000×0×××0000×××0×0000×0×××0000×××0×0000×0××00000×××)
                              Profil(A~)=Pás(A~):(×××00000××0×0000×0×××0000×××0×0000×0×××0000×××0×0000×0××00000×××)
                              Algoritmus Cathill–McKee [CMK]
                              1. Zvol libovolný vrchol x, přidej ho do permutace a nastav L0{x},k0.
                              2. Dokud j=0kLjV(G(A)):
                                1. Lk+1Adj(Lk)j=0kLk.
                                2. Přidej do permutace všechny vrcholy Lk+1.
                                3. kk+1.
                              Příklad %37611 cluster2 L₂ cluster4 L₄ cluster3 L₃ cluster0 L₀ cluster5 L₅ cluster6 L₆ cluster1 L₁ 1 1 2 2 1--2 3 3 1--3 5 5 2--5 3--5 4 4 3--4 6 6 5--6 7 7 5--7 4--6 8 8 6--8 7--8 9 9 7--9 11 11 8--11 9--11 10 10 9--10 12 12 9--12 10--11 13 13 10--13 12--13
                              A~=(×××0000000000××00×00000000×0×××0000000000××0×00000000××0×××000000000×××0×000000000×0×××000000000×××00×00000000×0××××000000000××00×0000000××0××000000000×0×××000000000×0××)
                              Všimněme si, že tato matice má oproti jiným možným permutacím hodně hezký profil a pás.

                              Aby vznikl úzký pás, chceme mít hodně malých úrovní. Jako počáteční vrchol je tedy vhodné zvolit jeden z periferních vrcholů – těch, u kterých se nabývá maximální vzdálenosti mezi dvěma vrcholy (tedy průměru grafu). Ovšem hledání takových vrcholů je moc náročné (Θ(n3)), takže se většinou hledá aproximace – pseudoperiferní vrcholy.

                              Pro hledání pseudoperiferních vrcholů můžeme využít GPS algoritmus. Zvolíme libovolný počáteční vrchol a pomocí CMK algoritmu k němu najdeme nějaký koncový vrchol (vrchol z poslední vrstvy). Ten si zvolíme jako nový počáteční vrchol a opakujeme. Zjevně se v žádném kroku nesníží vzdálenost, takže můžeme opakovat, až se ustálí.

                              Nápříklad v obdélníkové síti, začneme-li někde uprostřed, již v prvním kroku se dostaneme do rohu a v druhém kroku do opačného grafu, což nám dá periferní vrcholy.

                              Někdy se taky v CMK vyplatí číslovat opačně, čímž vznikne RCM (Reverse Cathill-McKee).

                              Uspořádání minimalizující zaplněnost

                              Chceme najít permutační matici P takovou, že |struct(LPAP𝖳)| je minimální.

                              Není známý efektivní algoritmus, který by vždy nalezl optimální řešení.

                              Algoritmus minimálního stupně
                              1. G0G(A),A0A.
                              2. Pro každé i=1,,n:
                                1. V Gi1 najdi vrchol s nejmenším stupněm a očísluj ho i.
                                2. Odeliminuj i z Gi1, čímž vznikne Gi.
                              Myšlenka je, že vrchol s nejmenším stupněm většinou způsobí nejmenší zaplnění.
                              Příklad Mějme matici s následujícím grafem: %37651 9 10 9--10 8 9--8 7 9--7 8--10 1 8--1 2 8--2 6 8--6 5 7--5 6--7 3 6--3 4 6--4 Vrcholy budeme eliminovat například v tomto pořadí, čímž vznikne jen jedna nová hrana: %37717 9 9 10 10 9--10 8 8 9--8 7 7 9--7 8--10 1 1 8--1 2 2 8--2 6 6 8--6 7--8 5 5 7--5 6--7 3 3 6--3 4 4 6--4
                              Poznámka Existuje varianta zvaná aproximovaný minimální stupeň, která nepočítá stupně vrcholů, ale pouze je odhaduje.

                              Uspořádání přizpůsobující matici počítačové architektuře

                              Máme paralelní počítač a chceme vrcholy eliminovat v takovém pořadí, aby se to dalo dobře paralelizovat.

                              Mějme graf, který se po odstranění nějaké malé podmnožiny vrcholů (separátoru S) rozdělí na dvě podobně velké komponenty C1 a C2. Potom coloki, co budeme dělat s jednou z komponent, ovlivní jen tuto komponentu a separátor. Pro paralelizaci se tedy vyplatí očíslovat vrcholy v pořadí C1C2S, takže C1 a C2 potom můžeme eliminovat paralelně.

                              Rozdělování můžeme rekurzivně opakovat, dokud jsou komponenty dostatečně velké, aby se to vyplatilo. Tomu se říká metoda vnořených řezů (nested dissection method).

                              Frontální metoda

                              Místo abychom uspořádání stanovili předem, budeme ho hledat dynamicky za běhu eliminace.

                              V každém kroku přehodíme řádky a sloupce tak, aby nenulové prvky šly co nejblíž k diagonále.

                              Často tím vzniknou malé husté podmatice, které můžeme řešit standardními metodami.

                              Nevýhoda je, že permutování za běhu může být náročné.

                              Výhoda je, že můžeme konstruovat Choleského rozklad matice, i když ji ještě nemáme celou spočtenou. To se může vyplatit například u metody konečných prvků, kde počítání matice je náročné.

                              Poznámky k obecnějším systémům

                              Zatím jsme se zabývali metodami pro pozitivně definitní matice. Jak se tyto poznatky dají zobecnit na jiné třídy matic?

                              Indefinitní symetrické matice

                              Příklad Mějme symetrickou indefinitní matici (0110). Kdybychom se pokoušeli spočítat Choleského rozklad, narazili bychom na to, že máme dělit nulou. Ani žádná symetrická permutace nám s tím nepomůže. Mohli bychom použít asymetrickou permutaci, ale tím bychom obecně ztratili symetrii matice.

                              Symetrické indefinitní matice v praxi vznikají při použití smíšené formulace metody konečných prvků na eliptickou úlohu druhého řádu nebo také při hledání vázaných extrémů metodou Lagrangeových multiplikátorů. V obou těchto případech vznikne matice tvaru A=(BCC𝖳0), kde Bm×m je pozitivně definitní, Cm×(nm),mnm,h(C)=nm. Soustava je tedy ve tvaru

                              Bx+Cy=b1,C𝖳x+Cy=b2.

                              Jelikož B je pozitivně definitní, můžeme najít její Choleského rozklad B=LL𝖳. Podle první rovnice je x=B1(b1Cy). Dosazením do druhé rovnice máme

                              C𝖳B1(b1Cy)=b2;
                              C𝖳B1CSy=b2+C𝖳B1b1,

                              kde S(nm)×(nm) je Schurův doplněk. Dokážeme, že S je pozitivně definitní. Pro yms{0} je

                              y|Sy=C𝖳B1Cy|y=B1Cy|Cy=L𝖳L1Cy|Cy=L1Cy|L1Cy=L1Cy2>0.

                              Soustavu s maticí S tedy můžeme řešit Choleského rozkladem. Akorát je problém v tom, že může být hustá, i když A je řídká. Vyplatí se to tedy, jenom když je malá. V opačném případě je možné to nějak prokletě zkombinovat s iterační metodou (typicky konjugované gradienty). Potom nemusíme S explicitně sestavovat, ale stačí s ní umět násobit vektory. K tomu nám stačí na vektor postupně aplikovat C,L1,L𝖳,C𝖳.

                              Obecné regulární matice

                              U matice, která není symetrická, nemáme Choleského rozklad, ale jen LU rozklad. Ten navíc nnexistuje, když matice není silně regulární; v takovém případě ještě navíc potřebujeme pivotaci. Pivotace by ideálně neměla způsobit velké zaplnění, což je ale často v rozporu s požadavky výše uvedených metod. Navíc výběr pivota obvyklým způsobem závisí na numerických hodnotách, takže není možné analyzovat strukturu předem.

                              Místo pivotace za běhu můžeme zkusit najít takovou permutaci, která přesune absolutně velké prvky na diagonálu.

                              Příklad Mějme matici ve tvaru
                              (×00000××0000000×0000000×0000000×0000000×0000000××).
                              Vytvoříme k ní bipartitní graf, kde budeme mít zvlášť vrcholy pro řádky a pro sloupce. %37787 1 1 1′ 1′ 1--1′ 7′ 7′ 1--7′ 2 2 2--1′ 3 3 2′ 2′ 3--2′ 4 4 3′ 3′ 4--3′ 5 5 4′ 4′ 5--4′ 6 6 5′ 5′ 6--5′ 7 7 6′ 6′ 7--6′ 7--7′ Přesunutí nenulových prvků na diagonálu odpovídá maximálnímu párování v tomto grafu. Přitom hrany budou ohodnocené prvky matice a váhu párování budeme počítat jako součin vah hran. Problém je, že to může způsobit velké zaplnění.