[eigen] LDLt and LLt fixes

[ Thread Index | Date Index | More lists.tuxfamily.org/eigen Archives ]


Hi,

the thread with Bill inspired me... so now (trunk revision 947097),
LDLt supports the negative semidefinite case.

There's a couple of things to discuss.

First, the floating-point comparisons in both LLt and LDLt had issues. LLt did

   if(x < eps)

and LDLt did

   if(Djj <= 0)

and replacing these by proper fuzzy comparisons (experimenting with a
few different ones) resulted in a big improvement in the accuracy of
some methods, like LDLt::rank() which used to be untested and had
typically 3% imprecision, and now is exact in 95% of cases (However
for an exact rank computation, it's still not nearly as reliable as
the full-pivoting LU which can be explained by the different between
bi-directional pivoting and the diagonal pivoting that's all one can
do with Cholesky).

The other issue is that LLt and LDLt have claims in their dox that
they use only a triangular half of the matrix and don't need the other
half to be initialized, well that's not currently the case, one can
check that by uncommenting a line I added to the cholesky.cpp
unit-test. Help fixing this welcome...

Cheers,
Benoit



Mail converted by MHonArc 2.6.19+ http://listengine.tuxfamily.org/