diff options
Diffstat (limited to 'Eigen/src/Eigenvalues')
-rw-r--r-- | Eigen/src/Eigenvalues/ComplexEigenSolver.h | 4 | ||||
-rw-r--r-- | Eigen/src/Eigenvalues/HessenbergDecomposition.h | 6 | ||||
-rw-r--r-- | Eigen/src/Eigenvalues/Tridiagonalization.h | 42 |
3 files changed, 27 insertions, 25 deletions
diff --git a/Eigen/src/Eigenvalues/ComplexEigenSolver.h b/Eigen/src/Eigenvalues/ComplexEigenSolver.h index 08276c5c0..7bf1d140e 100644 --- a/Eigen/src/Eigenvalues/ComplexEigenSolver.h +++ b/Eigen/src/Eigenvalues/ComplexEigenSolver.h @@ -291,8 +291,8 @@ void ComplexEigenSolver<MatrixType>::doComputeEigenvectors(RealScalar matrixnorm ComplexScalar z = m_schur.matrixT().coeff(i,i) - m_schur.matrixT().coeff(k,k); if(z==ComplexScalar(0)) { - // If the i-th and k-th eigenvalue are equal, then z equals 0. - // Use a small value instead, to prevent division by zero. + // If the i-th and k-th eigenvalue are equal, then z equals 0. + // Use a small value instead, to prevent division by zero. ei_real_ref(z) = NumTraits<RealScalar>::epsilon() * matrixnorm; } m_matX.coeffRef(i,k) = m_matX.coeff(i,k) / z; diff --git a/Eigen/src/Eigenvalues/HessenbergDecomposition.h b/Eigen/src/Eigenvalues/HessenbergDecomposition.h index 0f2b78e27..79554187a 100644 --- a/Eigen/src/Eigenvalues/HessenbergDecomposition.h +++ b/Eigen/src/Eigenvalues/HessenbergDecomposition.h @@ -130,7 +130,7 @@ template<typename _MatrixType> class HessenbergDecomposition { if(matrix.rows()<2) { - m_isInitialized = true; + m_isInitialized = true; return; } m_hCoeffs.resize(matrix.rows()-1,1); @@ -160,7 +160,7 @@ template<typename _MatrixType> class HessenbergDecomposition m_matrix = matrix; if(matrix.rows()<2) { - m_isInitialized = true; + m_isInitialized = true; return *this; } m_hCoeffs.resize(matrix.rows()-1,1); @@ -360,7 +360,7 @@ template<typename MatrixType> struct HessenbergDecompositionMatrixHReturnType result = m_hess.packedMatrix(); Index n = result.rows(); if (n>2) - result.bottomLeftCorner(n-2, n-2).template triangularView<Lower>().setZero(); + result.bottomLeftCorner(n-2, n-2).template triangularView<Lower>().setZero(); } Index rows() const { return m_hess.packedMatrix().rows(); } diff --git a/Eigen/src/Eigenvalues/Tridiagonalization.h b/Eigen/src/Eigenvalues/Tridiagonalization.h index 611b89730..4211981af 100644 --- a/Eigen/src/Eigenvalues/Tridiagonalization.h +++ b/Eigen/src/Eigenvalues/Tridiagonalization.h @@ -384,7 +384,9 @@ void ei_tridiagonalization_inplace(MatrixType& matA, CoeffVectorType& hCoeffs) } // forward declaration, implementation at the end of this file -template<typename MatrixType, int Size=MatrixType::ColsAtCompileTime> +template<typename MatrixType, + int Size=MatrixType::ColsAtCompileTime, + bool IsComplex=NumTraits<typename MatrixType::Scalar>::IsComplex> struct ei_tridiagonalization_inplace_selector; /** \brief Performs a full tridiagonalization in place @@ -439,7 +441,7 @@ void ei_tridiagonalization_inplace(MatrixType& mat, DiagonalType& diag, SubDiago /** \internal * General full tridiagonalization */ -template<typename MatrixType, int Size> +template<typename MatrixType, int Size, bool IsComplex> struct ei_tridiagonalization_inplace_selector { typedef typename Tridiagonalization<MatrixType>::CoeffVectorType CoeffVectorType; @@ -458,11 +460,11 @@ struct ei_tridiagonalization_inplace_selector }; /** \internal - * Specialization for 3x3 matrices. + * Specialization for 3x3 real matrices. * Especially useful for plane fitting. */ template<typename MatrixType> -struct ei_tridiagonalization_inplace_selector<MatrixType,3> +struct ei_tridiagonalization_inplace_selector<MatrixType,3,false> { typedef typename MatrixType::Scalar Scalar; typedef typename MatrixType::RealScalar RealScalar; @@ -470,14 +472,14 @@ struct ei_tridiagonalization_inplace_selector<MatrixType,3> template<typename DiagonalType, typename SubDiagonalType> static void run(MatrixType& mat, DiagonalType& diag, SubDiagonalType& subdiag, bool extractQ) { - diag[0] = ei_real(mat(0,0)); + diag[0] = mat(0,0); RealScalar v1norm2 = ei_abs2(mat(2,0)); - if (ei_isMuchSmallerThan(v1norm2, RealScalar(1))) + if(v1norm2 == RealScalar(0)) { - diag[1] = ei_real(mat(1,1)); - diag[2] = ei_real(mat(2,2)); - subdiag[0] = ei_real(mat(1,0)); - subdiag[1] = ei_real(mat(2,1)); + diag[1] = mat(1,1); + diag[2] = mat(2,2); + subdiag[0] = mat(1,0); + subdiag[1] = mat(2,1); if (extractQ) mat.setIdentity(); } @@ -485,18 +487,18 @@ struct ei_tridiagonalization_inplace_selector<MatrixType,3> { RealScalar beta = ei_sqrt(ei_abs2(mat(1,0)) + v1norm2); RealScalar invBeta = RealScalar(1)/beta; - Scalar m01 = ei_conj(mat(1,0)) * invBeta; - Scalar m02 = ei_conj(mat(2,0)) * invBeta; - Scalar q = RealScalar(2)*m01*ei_conj(mat(2,1)) + m02*(mat(2,2) - mat(1,1)); - diag[1] = ei_real(mat(1,1) + m02*q); - diag[2] = ei_real(mat(2,2) - m02*q); + Scalar m01 = mat(1,0) * invBeta; + Scalar m02 = mat(2,0) * invBeta; + Scalar q = RealScalar(2)*m01*mat(2,1) + m02*(mat(2,2) - mat(1,1)); + diag[1] = mat(1,1) + m02*q; + diag[2] = mat(2,2) - m02*q; subdiag[0] = beta; - subdiag[1] = ei_real(ei_conj(mat(2,1)) - m01 * q); + subdiag[1] = mat(2,1) - m01 * q; if (extractQ) { mat << 1, 0, 0, - 0, m01, m02, - 0, m02, -m01; + 0, m01, m02, + 0, m02, -m01; } } } @@ -505,8 +507,8 @@ struct ei_tridiagonalization_inplace_selector<MatrixType,3> /** \internal * Trivial specialization for 1x1 matrices */ -template<typename MatrixType> -struct ei_tridiagonalization_inplace_selector<MatrixType,1> +template<typename MatrixType, bool IsComplex> +struct ei_tridiagonalization_inplace_selector<MatrixType,1,IsComplex> { typedef typename MatrixType::Scalar Scalar; |