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::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::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::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::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