Eigen3'ü yerinde bir Cholesky ayrıştırma ile doğrusal bir sistem A * X = B
çözmek için almaya çalışıyorum. Yığının üzerine itilmiş olan A
boyutundaki herhangi bir zamansa sahip olduğumu göze alamıyorum, ancak süreçte A
'u yok etmekte özgürüm. A.llt()
örtülü yığın A
büyüklüğünün geçici matrisi iter beri Eigen LDLT Cholesky ayrıştırması yerinde yerinde
Maalesef
,A.llt().solveInPlace(B);
, söz konusu bile olamaz. Bu iyi çalışır
// solve A * X = B in-place for positive-definite A
template <typename AType, typename BType>
void AllInPlaceSolve(AType& A, BType& B)
{
typedef Eigen::internal::LLT_Traits<AType, Eigen::Upper> TraitsType;
TraitsType::inplace_decomposition(A);
TraitsType::getL(A).solveInPlace(B);
TraitsType::getU(A).solveInPlace(B);
}
ama endişeli olduğunu duyuyorum: LLT
durumda, ben şöyle gerekli işlevselliğine erişim alabilir hangi sadece
- Benim matrisleri
A
olabilir pozitif yarı kesin bir henüz oluşmamıştır ayrışma gerekli olduğu durumlarda LLT
ayrıştırma sistemi çözümü için gereksizsqrt()
hesaplar
Kod çok farklı şekilde yapılandırıldığı için Eigen'in LDLT işlevselliğine yukarıdaki kodla benzer şekilde kancalama yöntemini bulamadım.
Benim sorum şu: Eigen3, köşegen matris D
'dan daha fazla çizik alanı kullanmadan LDLT ayrıştırmalarını kullanarak doğrusal bir sistemi çözümlemenin bir yolu var mı?
Maalesef, kendi belleğimi kullanmak zorundayım, bu yüzden bu çalışmaların hiçbiri. İhtiyacım olan şey, iç :: ldlt_inplace :: engeli kaldırılmadı() 'dır, ancak kurulumun LLT durumundan daha az olduğu açıktır. –
Stefan
Ayrıca, 'unblocked() 'kurulumunu alabildiğim durumda, matrislerimiz A'dır, ancak A' simetrik olduğundan, sadece' a .transpose() 'nı kullanabilmeliyiz, değil mi? – Stefan
Eğer matris tamamlanmışsa, evet, bir sütun-büyük alt üçgen olarak bir satır-büyük üst üçgen parçası görebilirsiniz. Yalnızca iç :: ldlt_inplace :: engellemesiz() 'ye geçirmek için bir PermutationMatrix ayırmanız gerekir. Asıl mesele, çözme adımını tekrar yazmanız gerektiğidir. –
ggael