Inplace LDLT разложение с помощью Eigen

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

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

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

2

Решение

Внутренний действительно означает, что прототип этой функции может измениться в будущих версиях. метод 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 сам. Увидеть доктор для деталей.

1

Другие решения

Других решений пока нет …

По вопросам рекламы ammmcru@yandex.ru
Adblock
detector