diff options
author | Miao Wang <miaowang@google.com> | 2017-07-06 22:33:01 +0000 |
---|---|---|
committer | android-build-merger <android-build-merger@google.com> | 2017-07-06 22:33:01 +0000 |
commit | 2468c2ff45d4443b07440c4063f5f1cabe4da65a (patch) | |
tree | 28a6fbea7c5a1e9a0f1a209f8d33e6d72f1df851 /Eigen/src/IterativeLinearSolvers/BasicPreconditioners.h | |
parent | 457e53bce95b3700e984cffd2ef8cfba1789ec6d (diff) | |
parent | 63687fa8cbebcbae3d0a48a6c5d63677ffa6160e (diff) | |
download | eigen-2468c2ff45d4443b07440c4063f5f1cabe4da65a.tar.gz |
Merge "Rebase Eigen to 3.3.4" am: c905f05b1b
am: 63687fa8cb
Change-Id: Id4ec05eaa5243187830cb5826b13b94ffcff64ba
Diffstat (limited to 'Eigen/src/IterativeLinearSolvers/BasicPreconditioners.h')
-rw-r--r-- | Eigen/src/IterativeLinearSolvers/BasicPreconditioners.h | 27 |
1 files changed, 21 insertions, 6 deletions
diff --git a/Eigen/src/IterativeLinearSolvers/BasicPreconditioners.h b/Eigen/src/IterativeLinearSolvers/BasicPreconditioners.h index 358444aff..facdaf890 100644 --- a/Eigen/src/IterativeLinearSolvers/BasicPreconditioners.h +++ b/Eigen/src/IterativeLinearSolvers/BasicPreconditioners.h @@ -152,13 +152,28 @@ class LeastSquareDiagonalPreconditioner : public DiagonalPreconditioner<_Scalar> { // Compute the inverse squared-norm of each column of mat m_invdiag.resize(mat.cols()); - for(Index j=0; j<mat.outerSize(); ++j) + if(MatType::IsRowMajor) { - RealScalar sum = mat.innerVector(j).squaredNorm(); - if(sum>0) - m_invdiag(j) = RealScalar(1)/sum; - else - m_invdiag(j) = RealScalar(1); + m_invdiag.setZero(); + for(Index j=0; j<mat.outerSize(); ++j) + { + for(typename MatType::InnerIterator it(mat,j); it; ++it) + m_invdiag(it.index()) += numext::abs2(it.value()); + } + for(Index j=0; j<mat.cols(); ++j) + if(numext::real(m_invdiag(j))>RealScalar(0)) + m_invdiag(j) = RealScalar(1)/numext::real(m_invdiag(j)); + } + else + { + for(Index j=0; j<mat.outerSize(); ++j) + { + RealScalar sum = mat.innerVector(j).squaredNorm(); + if(sum>RealScalar(0)) + m_invdiag(j) = RealScalar(1)/sum; + else + m_invdiag(j) = RealScalar(1); + } } Base::m_isInitialized = true; return *this; |