Saya melakukan ini untuk pertama kalinya baru-baru ini, menggunakan saran dari mathSE.
SVD direkomendasikan oleh sebagian besar saya, tetapi saya memilih untuk kesederhanaan Cholesky:
Jika matriks , maka saya menguraikan M ke matriks segitiga L menggunakan Cholesky, sehingga M = L L ⊤ . Saya kemudian menggunakan substitusi balik atau substitusi ke depan (tergantung pada apakah saya memilih L menjadi segitiga atas atau bawah), untuk membalikkan L , sehingga saya memiliki L - 1 . Dari sini, saya dapat dengan cepat menghitung M - 1 = ( L L ⊤ ) - 1 = L - ⊤ L - 1 .M=AA⊤MLM=LL⊤LL−1M−1=(LL⊤)−1=L−⊤L−1
Dimulai dari:
, di mana M diketahui dan secara implisit simetris dan juga positif-pasti.M=AA⊤M
Factorisation Cholesky:
, di mana L adalah persegi dan non-tunggalM→LL⊤L
Substitusi kembali:
, mungkin cara tercepat untuk membalikkan L (jangan mengutip saya tentang itu)L→L−1L
Perkalian:
M−1=(LL⊤)−1=L−⊤L−1
Notasi yang digunakan:
Indeks yang lebih rendah adalah baris, indeks atas adalah kolom dan adalah transposes dari L - 1L−⊤L−1
Algoritma Cholesky saya (mungkin dari Numerical Recipes atau Wikipedia)
Lji=Mji−Mi⋅MjMii−Mi⋅Mi
Ini hampir dapat dilakukan di tempat (Anda hanya perlu penyimpanan sementara untuk elemen diagonal, akumulator dan beberapa iterator integer).
Algoritma back-substitusi saya (dari Numerical Recipes, periksa versinya karena saya mungkin telah membuat kesalahan dengan markup LaTeX)
(L−1)ji=⎧⎩⎨1/Lii(−Li⋅(L−T)j)/Liiif i=jotherwise
L−T