La matrice


10

Ho bisogno di calcolare molte inversioni di matrici (per la decomposizione polare di iterazione di Newton), con un numero molto piccolo di casi degeneri ( ).< 0,1 %3×3<0.1%

L'inverso esplicito (tramite matrici minori divise per determinante) sembra funzionare ed è circa 32 ~ 40 flop fusi (a seconda di come computo il reciproco del determinante). Non considerando il fattore di scala det, sono solo 18 flop fusi (ciascuno dei 9 elementi ha la forma ab-cd, 2 flop fusi).

Domanda:

  • C'è un modo per calcolare l'inverso di usando meno di 18 (con scala arbitraria) o 32 (con scala adeguata, considerando le reciproche 1 op) flop fusi?3×3
  • C'è un modo economico (usando ~ 50 f-flop) per calcolare un inverso sinistro stabile all'indietro di una matrice ?3×3

Sto usando float a precisione singola (gioco iOS). La stabilità all'indietro è un nuovo concetto interessante per me e voglio sperimentare. Ecco l'articolo che ha provocato il pensiero.


Che dire dell'utilizzo del teorema di Cayley-Hamilton per l'inverso?
Nicoguaro

1
Se questo è un collo di bottiglia per te, un altro algoritmo per la decomposizione polare potrebbe essere più veloce in questo caso? Tramite SVD, ad esempio? O accelerare il metodo di Newton come in 3.3 di eprints.ma.man.ac.uk/694/01/covered/MIMS_ep2007_9.pdf ?
Kirill

Risposte:


5

Proverò a dare il mio pensiero sulla prima domanda riguardante l' inverso rapido 3×3 . Prendere in considerazione

A=[adgbehcfi]

1/det(A)a , , i A - 1 det ( A ) = adj ( A ) = [ e i - f h d i - f g g e - d h b i - c h a i - c g a h - b g c e - b f a f - c d aAa,,i

A1det(A)=adj(A)=[eifhdifggedhbichaicgahbgcebfafcdaebd]
adj(A)

Tuttavia, alcuni calcoli possono essere riutilizzati per il calcolo di . Se lo espanderò sulla prima colonna (ci sono altre 5 scelte): Nota che (* ) è già stato calcolato durante la valutazione di . Quindi, il reciproco del determinante può essere calcolato in 4 flop fusi aggiuntivi (se reciproco è considerato come 1 flop).det(A) adj(A)1/det(A)

det(A)=a(eifh)+b(fgdi)+c(dhge)=a(eifh)b(difg)c(gedh)
adj(A)1/det(A)

Ora, ogni 9 elementi di dovrebbero essere ridimensionati dal reciproco già ottenuto del determinante, aggiungendo altri 9 flop fusi.adj(A)

Così,

  1. Calcola in 18 flop fusiadj(A)
  2. Calcola in 3 flop fusi usando le voci di già calcolatoagg ( A )det(A)adj(A)
  3. Trova (presupponendo 1 flop).1det(A)
  4. Scala ogni elemento di già calcolato di in altri 9 flop fusi.1adj(A)1det(A)

Il risultato è 18 + 3 + 1 + 9 = 31 flop fusi . Non hai descritto il tuo modo di calcolare il determinante, ma immagino che sia possibile salvare 1 flop aggiuntivo. Oppure può essere usato per eseguire il controllo al punto 3, dove è la tolleranza per il caso degenerato (non invertibile), con conseguente 32 flop fusi (supponendo che sia 1 flop).ϵ|det(A)|>ϵϵif

Non penso che ci sia un modo più veloce per calcolare l'inverso di una matrice generale poiché tutti i calcoli rimanenti sono unici. L'uso di Cayley-Hamilton non dovrebbe essere d'aiuto dal punto di vista della velocità, poiché in generale richiederà il calcolo di per una matrice oltre ad altre operazioni.3×3 3 × 3A23×3

NB:

  • questa risposta non riguarda la stabilità numerica
  • anche il possibile potenziale di vettorializzazione e ottimizzazione del modello di accesso alla memoria non viene discusso
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.