Fix LeastSquareDiagonalPreconditioner for complexes (issue introduced in previous commit)

(grafted from a7be4cd1b1ea4d85165f003d793f1d46b199b7bd
)
This commit is contained in:
Gael Guennebaud 2017-06-09 11:57:53 +02:00
parent 676a7a3271
commit 72f3e20e74

View File

@ -158,18 +158,18 @@ class LeastSquareDiagonalPreconditioner : public DiagonalPreconditioner<_Scalar>
for(Index j=0; j<mat.outerSize(); ++j) for(Index j=0; j<mat.outerSize(); ++j)
{ {
for(typename MatType::InnerIterator it(mat,j); it; ++it) for(typename MatType::InnerIterator it(mat,j); it; ++it)
m_invdiag(it.index()) += it.value(); m_invdiag(it.index()) += numext::abs2(it.value());
} }
for(Index j=0; j<mat.cols(); ++j) for(Index j=0; j<mat.cols(); ++j)
if(m_invdiag(j)>0) if(numext::real(m_invdiag(j))>RealScalar(0))
m_invdiag(j) = RealScalar(1)/m_invdiag(j); m_invdiag(j) = RealScalar(1)/numext::real(m_invdiag(j));
} }
else else
{ {
for(Index j=0; j<mat.outerSize(); ++j) for(Index j=0; j<mat.outerSize(); ++j)
{ {
RealScalar sum = mat.innerVector(j).squaredNorm(); RealScalar sum = mat.innerVector(j).squaredNorm();
if(sum>0) if(sum>RealScalar(0))
m_invdiag(j) = RealScalar(1)/sum; m_invdiag(j) = RealScalar(1)/sum;
else else
m_invdiag(j) = RealScalar(1); m_invdiag(j) = RealScalar(1);