L'ho fatto per la prima volta di recente, usando i suggerimenti di MathSE.
SVD è stato raccomandato dalla maggior parte di me, ma ho optato per la semplicità di Cholesky:
Se la matrice , allora decompongo in una matrice triangolare usando Cholesky, in modo tale che . Quindi uso backsubstitution o forwardsstitution (a seconda che scelga L come triangolare superiore o inferiore), per invertire , in modo da avere . Da questo, posso calcolare rapidamente .M=AA⊤MLM=LL⊤LL−1M−1=(LL⊤)−1=L−⊤L−1
Iniziare con:
M=AA⊤ , dove è noto ed è implicitamente simmetrico ed è anche definito positivo.M
Fattorizzazione di Cholesky:
M→LL⊤ , dove è quadrata e non singolareL
Back-sostituzione:
L→L−1 , probabilmente il modo più veloce per invertire (non citarmi su questo però)L
Moltiplicazione:
M−1=(LL⊤)−1=L−⊤L−1
Notazione utilizzata: gli
indici inferiori sono righe, gli indici superiori sono colonne e è la trasposizione diL−⊤L−1
Il mio algoritmo Cholesky (probabilmente da Ricette numeriche o Wikipedia)
Lji=Mji−Mi⋅MjMii−Mi⋅Mi
Questo può quasi essere fatto sul posto (è necessario solo spazio temporaneo per gli elementi diagonali, un accumulatore e alcuni iteratori interi).
Il mio algoritmo di sostituzione sostitutiva (da Ricette numeriche, controlla la loro versione poiché potrei aver fatto un errore con il markup LaTeX)
(L−1)ji=⎧⎩⎨1/Lii(−Li⋅(L−T)j)/Liiif i=jotherwise
Poiché appare nell'espressione, l'ordine in cui si itera sulla matrice è importante (alcune parti della matrice dei risultati dipendono da altre parti di essa che devono essere calcolate in anticipo). Controlla il codice Ricette numeriche per un esempio completo nel codice. [Modifica]: in realtà, controlla l'esempio delle ricette numeriche. Ho semplificato troppo usando i punti-prodotti, al punto che l'equazione di cui sopra ha una dipendenza ciclica, indipendentemente dall'ordine in cui iterate ...L−T