Cepat, dan The Mundur-Stabil (kiri)

10

Saya perlu untuk menghitung banyak 3×3 invers matriks (untuk Newton iterasi dekomposisi polar), dengan jumlah yang sangat kecil dari kasus degenerasi ( <0.1% ).

Pembalikan eksplisit (melalui matriks anak di bawah umur dibagi dengan penentu) tampaknya berfungsi, dan sekitar ~ 32 ~ 40 jepit menyatu (tergantung pada bagaimana saya menghitung kebalikan dari penentu). Tidak mempertimbangkan faktor skala det, itu hanya 18 fisting flops (masing-masing dari 9 elemen adalah dari bentuk ab-cd, 2 fused flop).

Pertanyaan:

  • Apakah ada cara untuk menghitung invers 3×3 menggunakan kurang dari 18 (dengan skala arbitrer) atau 32 (dengan skala yang tepat, mempertimbangkan timbal balik 1 op) jepit menyatu?
  • Apakah ada cara yang ekonomis (menggunakan ~ 50 f-jepit) untuk menghitung mundur-stabil meninggalkan terbalik dari 3×3 matriks?

Saya menggunakan pelampung presisi tunggal (game iOS). Stabilitas mundur adalah konsep baru yang menarik bagi saya dan saya ingin bereksperimen. Inilah artikel yang memancing pemikiran itu.

Sergiy Migdalskiy
sumber
Bagaimana dengan menggunakan teorema Cayley-Hamilton untuk kebalikannya?
nicoguaro
1
Jika ini merupakan hambatan bagi Anda, dapatkah algoritma lain untuk dekomposisi kutub lebih cepat dalam kasus ini? Melalui SVD, misalnya? Atau mempercepat metode Newton seperti dalam 3.3 dari eprints.ma.man.ac.uk/694/01/covered/MIMS_ep2007_9.pdf ?
Kirill

Jawaban:

5

3×3

A=[adgbehcfi]

1/det(A)Aa,,i

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

Namun, beberapa perhitungan dapat digunakan kembali untuk perhitungan . Jika saya memperluasnya di kolom pertama (ada 5 pilihan lain): Perhatikan, bahwa (* ) telah dihitung selama evaluasi . Jadi, kebalikan dari determinan dapat dihitung dalam 4 tambahan flop flop (jika timbal balik dianggap sebagai 1 flop).det(A)

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

Sekarang, setiap 9 elemen dari harus diskalakan dengan kebalikan dari determinan yang telah diperoleh, dengan menambahkan 9 flop jepit lainnya.adj(A)

Begitu,

  1. Hitung dalam 18 jepit menyatuadj(A)
  2. Hitung dalam 3 jepit menyatu menggunakan entri yang sudah dihitungdet(A)adj(A)
  3. Temukan (dengan asumsi 1 gagal).1det(A)
  4. Skala setiap elemen dari sudah dikomputasi oleh di 9 flop jepit lainnya.adj(A)1det(A)

Menghasilkan 18 + 3 + 1 + 9 = 31 jepit menyatu . Anda tidak menjelaskan cara Anda menghitung determinan, tetapi saya kira 1 kegagalan tambahan dapat disimpan. Atau dapat digunakan untuk melakukan pemeriksaan pada langkah 3, di mana adalah toleransi untuk kasus degenerasi (tidak dapat dibalikkan), menghasilkan 32 flop yang menyatu (dengan asumsi 1 flop).|det(A)|>ϵϵif

Saya tidak berpikir ada cara yang lebih cepat untuk menghitung kebalikan dari matriks umum karena semua perhitungan yang tersisa adalah unik. Menggunakan Cayley-Hamilton seharusnya tidak membantu dari perspektif kecepatan, seperti secara umum, itu akan memerlukan perhitungan untuk matriks selain beberapa operasi lainnya.3×3A23×3

NB:

  • jawaban ini tidak berurusan dengan stabilitas numerik
  • kemungkinan potensi vektorisasi dan optimalisasi pola akses memori juga tidak dibahas
Anton Menshov
sumber