diff options
author | Jitse Niesen <jitse@maths.leeds.ac.uk> | 2010-06-03 22:59:57 +0100 |
---|---|---|
committer | Jitse Niesen <jitse@maths.leeds.ac.uk> | 2010-06-03 22:59:57 +0100 |
commit | 9178e2bd54f64febb43025b9710387d2e98fea34 (patch) | |
tree | 0f0a4c7c4e9091c070ef167fd8678244a6d2926c /Eigen/src/Eigenvalues/EigenSolver.h | |
parent | ed73a195e0a6b840993e31f0d8f5082296feb6bc (diff) |
Add info() method which can be queried to check whether iteration converged.
Diffstat (limited to 'Eigen/src/Eigenvalues/EigenSolver.h')
-rw-r--r-- | Eigen/src/Eigenvalues/EigenSolver.h | 56 |
1 files changed, 33 insertions, 23 deletions
diff --git a/Eigen/src/Eigenvalues/EigenSolver.h b/Eigen/src/Eigenvalues/EigenSolver.h index f745413a8..04caee658 100644 --- a/Eigen/src/Eigenvalues/EigenSolver.h +++ b/Eigen/src/Eigenvalues/EigenSolver.h @@ -26,6 +26,7 @@ #ifndef EIGEN_EIGENSOLVER_H #define EIGEN_EIGENSOLVER_H +#include "./EigenvaluesCommon.h" #include "./RealSchur.h" /** \eigenvalues_module \ingroup Eigenvalues_Module @@ -286,6 +287,12 @@ template<typename _MatrixType> class EigenSolver */ EigenSolver& compute(const MatrixType& matrix, bool computeEigenvectors = true); + ComputationInfo info() const + { + ei_assert(m_isInitialized && "ComplexEigenSolver is not initialized."); + return m_realSchur.info(); + } + private: void doComputeEigenvectors(); @@ -358,33 +365,36 @@ EigenSolver<MatrixType>& EigenSolver<MatrixType>::compute(const MatrixType& matr // Reduce to real Schur form. m_realSchur.compute(matrix, computeEigenvectors); - m_matT = m_realSchur.matrixT(); - if (computeEigenvectors) - m_eivec = m_realSchur.matrixU(); - - // Compute eigenvalues from matT - m_eivalues.resize(matrix.cols()); - Index i = 0; - while (i < matrix.cols()) + if (m_realSchur.info() == Success) { - if (i == matrix.cols() - 1 || m_matT.coeff(i+1, i) == Scalar(0)) - { - m_eivalues.coeffRef(i) = m_matT.coeff(i, i); - ++i; - } - else + m_matT = m_realSchur.matrixT(); + if (computeEigenvectors) + m_eivec = m_realSchur.matrixU(); + + // Compute eigenvalues from matT + m_eivalues.resize(matrix.cols()); + Index i = 0; + while (i < matrix.cols()) { - Scalar p = Scalar(0.5) * (m_matT.coeff(i, i) - m_matT.coeff(i+1, i+1)); - Scalar z = ei_sqrt(ei_abs(p * p + m_matT.coeff(i+1, i) * m_matT.coeff(i, i+1))); - m_eivalues.coeffRef(i) = ComplexScalar(m_matT.coeff(i+1, i+1) + p, z); - m_eivalues.coeffRef(i+1) = ComplexScalar(m_matT.coeff(i+1, i+1) + p, -z); - i += 2; + if (i == matrix.cols() - 1 || m_matT.coeff(i+1, i) == Scalar(0)) + { + m_eivalues.coeffRef(i) = m_matT.coeff(i, i); + ++i; + } + else + { + Scalar p = Scalar(0.5) * (m_matT.coeff(i, i) - m_matT.coeff(i+1, i+1)); + Scalar z = ei_sqrt(ei_abs(p * p + m_matT.coeff(i+1, i) * m_matT.coeff(i, i+1))); + m_eivalues.coeffRef(i) = ComplexScalar(m_matT.coeff(i+1, i+1) + p, z); + m_eivalues.coeffRef(i+1) = ComplexScalar(m_matT.coeff(i+1, i+1) + p, -z); + i += 2; + } } + + // Compute eigenvectors. + if (computeEigenvectors) + doComputeEigenvectors(); } - - // Compute eigenvectors. - if (computeEigenvectors) - doComputeEigenvectors(); m_isInitialized = true; m_eigenvectorsOk = computeEigenvectors; |