Bunu ilk defa mathSE'in önerilerini kullanarak yaptım.
SVD sanırım çoğu kişi tarafından önerildi, ancak Cholesky'nin basitliğini seçtim:
Eğer matris , Cholesky kullanarak, üçgen matris . Daha sonra ters için (üst ya da alt üçgen olduğu bir L tercih bağlı olarak) backsubstitution veya forwardsubstitution kullanmak ı sahip olduğu biçimde, . Bundan hızlı bir şekilde hesaplayabilir .M=AA⊤MLM=LL⊤LL−1M−1=(LL⊤)−1=L−⊤L−1
İle başla:
M=AA⊤ , ki burada bilinir ve dolaylı olarak simetriktir ve ayrıca pozitif-kesindir.M
Cholesky faktoringi:
M→LL⊤ , burada kare ve tekil olmayanL
Back-ikamesi:
L→L−1 , muhtemelen yi ters çevirmenin en hızlı yolu (bu konuda bana alıntı yapma)L
Çarpma işlemi:
M−1=(LL⊤)−1=L−⊤L−1
Kullanılan gösterim:
Alt indeksler satırlar, üst indeksler sütunlar ve , in devridir.L−⊤L−1
Cholesky algoritmam (muhtemelen Nümerik Tarifler veya Wikipedia'dan)
Lji=Mji−Mi⋅MjMii−Mi⋅Mi
Bu neredeyse yerinde yapılabilir (diyagonal elemanlar, bir akümülatör ve bazı tamsayı yineleyiciler için geçici olarak depolamaya ihtiyacınız vardır).
Geri ikame algoritmam (Numerical Recipes'dan, LaTeX işaretlemesinde bir hata yapmış olabileceğim için sürümlerini kontrol et)
(L−1)ji=⎧⎩⎨1/Lii(−Li⋅(L−T)j)/Liiif i=jotherwise
Olarak matrisi üzerine Eğer yineleme önemli olduğu düzeni (sonuç matrisinin bazı parçalar önceden hesaplanmalıdır bunun diğer parçalar bağlıdır), ifade görünür. Koddaki eksiksiz bir örnek için Sayısal Tarifler kodunu kontrol edin. [Düzenle]: Aslında, Nümerik Tarifler örneğini kontrol etmen yeterli. Nokta-ürünlerini kullanarak çok fazla sadeleştirdim, yukarıdaki denklemin hangi sırayla yinelemelisiniz olursa olsun döngüsel bir bağımlılığı olduğu noktaya gelince ...L−T