Search code examples
eigen

In place modification of an Eigen's LDLT object


Given a matrix's LDLT decomposition, I would like to modify the diagonal - for example floor all the values. Is there a way to do this with eigen?

To be clear, I can do:

auto ldlt_ = matrix.ldlt();

and I would like to follow up with:

ldlt_.vectorD().cwiseMax(Vector::Constant(n,epsilon))

before solving a problem:

ldlt_.solve(a)

I don't see any non const accessors to the vectorD member - what am I missing?


Solution

  • No, you cannot do that, and I don't think that's a good idea to increase small (or negative) diagonal entries this way. If there are too small entries, the usual approach is either to ignore them (default behavior of LDLT::solve), or to redo the factorization with matrix+eps*I. Anyway, if you really want to tweak D yourself, then you have to implement your own solve function.