2016-03-29 30 views
0

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 gereksiz sqrt() 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ı?

cevap

0

Seçeneklerden biri hesaplama yöntemi sadece bir kez LDLT çözücü tahsis ve çağrı şudur:

: bu da bir seçenek değilse

LDLT<MatType> ldlt(size); 
// ... 
ldlt.compute(A); 
x = ldlt.solve(b); 

, sen LDLT nesnesi tarafından saklanan matris döküm const olabilir sonra

LDLT<MatType> ldlt(MatType::Identity(size,size)); 
MatType& A = const_cast<MatType&>(ldlt.matrixLDLT()); 

A ile oynadığını ve:

ldlt.compute(A); 
x = ldlt.solve(b); 

Bu çirkin, ama bu MatType sütun büyük olduğu sürece çalışmalıdır.

+0

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

+0

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

+0

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