2013-08-09 2 views
2

Я выполняю линейную алгебру с очень большими симметричными матрицами (~ 800 мб), и я пробую несколько разных разложений. В настоящее время я реализую LDLT, и я хотел бы воспользоваться этим, чтобы сократить вдвое мои требования к памяти, переписав верхний треугольник моей матрицы с помощью L^T. Хотя документация Eigen не перечисляет все равно, чтобы сделать это, во внутреннем пространстве имен есть некоторые скрытые методы, которые могут делать то, что я хочу.Inplace LDLT декомпозиция с Eigen

Методы могут быть найдены в следующих структурах: template<> struct ldlt_inplace<Lower> и template<> struct ldlt_inplace<Upper> в http://eigen.tuxfamily.org/dox/LDLT_8h_source.html

Правильно ли я, что эти методы являются то, что я хочу? Как их использовать? Должен ли я избегать их использования, потому что они являются внутренними и, следовательно, могут быть изменены и отменены?

ответ

1

Внутренний действительно означает, что прототип этой функции может измениться в будущих версиях. метод LDLT :: вычисления() является хорошим примером того, как использовать его:

Transpositions<Dynamic> T(mat.cols()); 
VectorXd temp(mat.cols()); 
int sign; 
Eigen::internal::ldlt_inplace<Eigen::Lower>::unblocked(mat, T, temp, &sign); 

EDIT

В Эйгеном 3.3, вы можете использовать LDLT<Ref<MatrixXd> >:

MatrixXd A; 
LDLT<Ref<MatrixXd> > ldlt(A); 

ldlt будет затем разложить A в пределах A. Подробности см. На странице doc.

+0

Спасибо! На самом деле это довольно просто. Есть ли какие-либо меры предосторожности, которые я могу предпринять, чтобы защитить себя от будущих изменений? – nitrous

+1

Теперь это официально поддерживается: http://eigen.tuxfamily.org/dox-devel/group__InplaceDecomposition.html – ggael