使用Eigen进行LDLT分解

时间:2013-08-09 18:29:07

标签: c++ matrix linear-algebra eigen eigen3

我正在做一些非常大的对称矩阵(~800mb)的线性代数,我正在尝试几种不同的分解。目前,我正在实现LDLT,我想通过用L ^ T覆盖矩阵的上三角形来利用这个来减半我的内存需求。虽然Eigen的文档无论如何都没有列出这样做,但是内部命名空间中有一些隐藏的方法可以做我想要的。

这些方法可以在这些结构中找到:template<> struct ldlt_inplace<Lower>template<> struct ldlt_inplace<Upper> in http://eigen.tuxfamily.org/dox/LDLT_8h_source.html

我认为这些方法是我想要的吗?我该如何使用它们?我应该避免使用它们,因为它们是内部的,因此可能会有变化和弃用吗?

1 个答案:

答案 0 :(得分:1)

内部确实意味着此功能的原型可能会在将来的版本中更改。 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进行因子分解。有关详细信息,请参阅doc