A matriz inversa rápida e estável (esquerda)


10

Preciso para calcular uma série de 3×3 matriz inversa (por Newton iteração decomposição polar), com muito pequeno número de casos degenerados ( <0,1% ).

Inverso explícito (via menores de matriz divididos por determinante) parece funcionar e tem cerca de ~ 32 ~ 40 fracassos fundidos (dependendo de como eu calculo o inverso do determinante). Sem considerar o fator de escala de detecção, são apenas 18 flops fundidos (cada um dos 9 elementos tem a forma ab-cd, 2 flops fundidos).

Questão:

  • Existe uma maneira de calcular inversos de 3×3 usando menos de 18 (com escala arbitrária) ou 32 (com escala adequada, considerando 1 op op) falhanços fundidos?
  • Existe uma forma económica (utilizando 50 ~ f-flops) para calcular uma retro-estável deixado inversa de um 3×3 matriz?

Estou usando carros alegóricos de precisão única (jogo para iOS). A estabilidade para trás é um novo conceito interessante para mim e quero experimentar. Aqui está o artigo que provocou o pensamento.


Que tal usar o teorema de Cayley-Hamilton para o inverso?
nicoguaro

11
Se esse é um gargalo para você, outro algoritmo para decomposição polar pode ser mais rápido nesse caso? Através do SVD, por exemplo? Ou acelerando o método de Newton como em 3.3 de eprints.ma.man.ac.uk/694/01/covered/MIMS_ep2007_9.pdf ?
Kirill

Respostas:


5

Tentarei refletir sobre a primeira pergunta sobre o inverso rápido 3×3 . Considerar

UMA=[umadgbehcfEu]

Como as matrizes são pequenas e muito gerais (não apresentam nenhuma estrutura conhecida, zeros, escalas relativas dos elementos), acho que seria impossível fornecer um algoritmo para escala arbitrária (sem ) inversa que seja mais rápido do que 18 fracassos fundidos, como cada um de 9 elementos requer 2 fracassos fundidos, e todos os produtos são únicos, desde nenhuma informação prévia sobre a entradas de um , ... , i . A - 1 det ( A ) = adj ( A ) = [ e i - f1 1/det(UMA)UMAuma,...,Eu Aqui,adj(A)indica o adjugado (transposição de cofatores), que é essencialmente um inverso com "escala arbitrária" (desde que exista o inverso).

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

det(UMA)

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

adj(A)

Assim,

  1. adj(UMA)
  2. det(UMA)adj(UMA)
  3. 1 1det(UMA)
  4. adj(UMA)1 1det(UMA)

|det(UMA)|>ϵϵif

3×3UMA23×3

NB:

  • esta resposta não lida com a estabilidade numérica
  • o possível potencial de vetorização e otimização do padrão de acesso à memória também não é discutido
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.