aboutsummaryrefslogtreecommitdiffhomepage
diff options
context:
space:
mode:
authorGravatar Gael Guennebaud <g.gael@free.fr>2016-07-13 18:37:54 +0200
committerGravatar Gael Guennebaud <g.gael@free.fr>2016-07-13 18:37:54 +0200
commit5ea0864c81ef3a6fee0d5a45623589bbfc60d123 (patch)
tree9471499859076e8c766ccc7e89e36ad1126f62f2
parent20f7ef2f89abb1773366459bf02d2382f5e2912a (diff)
Fix regression in a previous commit: some diagonal entry might not be treated by the 2x2 real preconditioner.
-rw-r--r--Eigen/src/SVD/JacobiSVD.h30
1 files changed, 16 insertions, 14 deletions
diff --git a/Eigen/src/SVD/JacobiSVD.h b/Eigen/src/SVD/JacobiSVD.h
index 44beaf1c0..a0e8cf27a 100644
--- a/Eigen/src/SVD/JacobiSVD.h
+++ b/Eigen/src/SVD/JacobiSVD.h
@@ -694,16 +694,6 @@ JacobiSVD<MatrixType, QRPreconditioner>::compute(const MatrixType& matrix, unsig
/*** step 2. The main Jacobi SVD iteration. ***/
RealScalar maxDiagEntry = m_workMatrix.cwiseAbs().diagonal().maxCoeff();
- // For a 1x1 complex matrix this boils down in cancelling the imaginary part
- // This needs to be done explicitly because the "svd_precondition_2x2_block_to_be_real"
- // wont't be applied as there is no 2x2 blocks!
- if(NumTraits<Scalar>::IsComplex && m_diagSize==1 && abs(numext::imag(m_workMatrix.coeff(0,0)))>considerAsZero)
- {
- RealScalar z = abs(m_workMatrix.coeff(0,0));
- if(computeU()) m_matrixU.col(0) *= m_workMatrix.coeff(0,0)/z;
- m_workMatrix.coeffRef(0,0) = z;
- }
-
bool finished = false;
while(!finished)
{
@@ -748,10 +738,22 @@ JacobiSVD<MatrixType, QRPreconditioner>::compute(const MatrixType& matrix, unsig
for(Index i = 0; i < m_diagSize; ++i)
{
- // At this stage, m_workMatrix.coeff(i,i) is supposed to be real.
- RealScalar a = numext::real(m_workMatrix.coeff(i,i));
- m_singularValues.coeffRef(i) = abs(a);
- if(computeU() && (a<RealScalar(0))) m_matrixU.col(i) = -m_matrixU.col(i);
+ // For a complex matrix, some diagonal coefficients might note have been
+ // treated by svd_precondition_2x2_block_to_be_real, and the imaginary part
+ // of some diagonal entry might not be null.
+ if(NumTraits<Scalar>::IsComplex && abs(numext::imag(m_workMatrix.coeff(i,i)))>considerAsZero)
+ {
+ RealScalar a = abs(m_workMatrix.coeff(i,i));
+ m_singularValues.coeffRef(i) = abs(a);
+ if(computeU()) m_matrixU.col(i) *= m_workMatrix.coeff(i,i)/a;
+ }
+ else
+ {
+ // m_workMatrix.coeff(i,i) is already real, no difficulty:
+ RealScalar a = numext::real(m_workMatrix.coeff(i,i));
+ m_singularValues.coeffRef(i) = abs(a);
+ if(computeU() && (a<RealScalar(0))) m_matrixU.col(i) = -m_matrixU.col(i);
+ }
}
m_singularValues *= scale;