Я делаю некоторую линейную алгебру с очень большими симметричными матрицами (~ 800 МБ), и я пробую несколько разных разложений. В настоящее время я реализую LDLT, и я хотел бы воспользоваться этим, чтобы вдвое сократить требования к памяти, переписав верхний треугольник моей матрицы с помощью L ^ T. Хотя в документации Eigen ничего не говорится, чтобы сделать это, во внутреннем пространстве имен есть некоторые скрытые методы, которые могут делать то, что я хочу.
Методы могут быть найдены в этих структурах: template<> struct ldlt_inplace<Lower>
а также template<> struct ldlt_inplace<Upper>
в
http://eigen.tuxfamily.org/dox/LDLT_8h_source.html
Прав ли я, что эти методы — то, что я хочу? Как я могу их использовать? Должен ли я избегать их использования, потому что они являются внутренними, и, следовательно, могут быть изменены и устарели?
Внутренний действительно означает, что прототип этой функции может измениться в будущих версиях. метод LDLT :: compute () является хорошим примером того, как его использовать:
Transpositions<Dynamic> T(mat.cols());
VectorXd temp(mat.cols());
int sign;
Eigen::internal::ldlt_inplace<Eigen::Lower>::unblocked(mat, T, temp, &sign);
РЕДАКТИРОВАТЬ
В Eigen 3.3 вы можете использовать LDLT<Ref<MatrixXd> >
:
MatrixXd A;
LDLT<Ref<MatrixXd> > ldlt(A);
ldlt
затем будет факторизовать A
в A
сам. Увидеть доктор для деталей.
Других решений пока нет …