diff --git a/Eigen/src/QR/EigenSolver.h b/Eigen/src/QR/EigenSolver.h index e9da5d941..3c7ed0e82 100644 --- a/Eigen/src/QR/EigenSolver.h +++ b/Eigen/src/QR/EigenSolver.h @@ -53,9 +53,18 @@ template class EigenSolver typedef Matrix RealVectorType; typedef Matrix RealVectorTypeX; + /** + * \brief Default Constructor. + * + * The default constructor is useful in cases in which the user intends to + * perform decompositions via EigenSolver::compute(const MatrixType&). + */ + EigenSolver() : m_eivec(), m_eivalues(), m_isInitialized(false) {} + EigenSolver(const MatrixType& matrix) : m_eivec(matrix.rows(), matrix.cols()), - m_eivalues(matrix.cols()) + m_eivalues(matrix.cols()), + m_isInitialized(false) { compute(matrix); } @@ -94,12 +103,20 @@ template class EigenSolver * * \sa pseudoEigenvalueMatrix() */ - const MatrixType& pseudoEigenvectors() const { return m_eivec; } + const MatrixType& pseudoEigenvectors() const + { + ei_assert(m_isInitialized && "EigenSolver is not initialized."); + return m_eivec; + } MatrixType pseudoEigenvalueMatrix() const; /** \returns the eigenvalues as a column vector */ - EigenvalueType eigenvalues() const { return m_eivalues; } + EigenvalueType eigenvalues() const + { + ei_assert(m_isInitialized && "EigenSolver is not initialized."); + return m_eivalues; + } void compute(const MatrixType& matrix); @@ -111,6 +128,7 @@ template class EigenSolver protected: MatrixType m_eivec; EigenvalueType m_eivalues; + bool m_isInitialized; }; /** \returns the real block diagonal matrix D of the eigenvalues. @@ -120,6 +138,7 @@ template class EigenSolver template MatrixType EigenSolver::pseudoEigenvalueMatrix() const { + ei_assert(m_isInitialized && "EigenSolver is not initialized."); int n = m_eivec.cols(); MatrixType matD = MatrixType::Zero(n,n); for (int i=0; i::pseudoEigenvalueMatrix() const template typename EigenSolver::EigenvectorType EigenSolver::eigenvectors(void) const { + ei_assert(m_isInitialized && "EigenSolver is not initialized."); int n = m_eivec.cols(); EigenvectorType matV(n,n); for (int j=0; j::compute(const MatrixType& matrix) // Reduce Hessenberg to real Schur form. hqr2(matH); + + m_isInitialized = true; } // Nonsymmetric reduction to Hessenberg form. diff --git a/test/eigensolver_generic.cpp b/test/eigensolver_generic.cpp index b3a43b639..915f73ee5 100644 --- a/test/eigensolver_generic.cpp +++ b/test/eigensolver_generic.cpp @@ -61,6 +61,17 @@ template void eigensolver(const MatrixType& m) } +template void eigensolver_verify_assert() +{ + MatrixType tmp; + + EigenSolver eig; + VERIFY_RAISES_ASSERT(eig.eigenvectors()) + VERIFY_RAISES_ASSERT(eig.pseudoEigenvectors()) + VERIFY_RAISES_ASSERT(eig.pseudoEigenvalueMatrix()) + VERIFY_RAISES_ASSERT(eig.eigenvalues()) +} + void test_eigensolver_generic() { for(int i = 0; i < g_repeat; i++) { @@ -73,5 +84,9 @@ void test_eigensolver_generic() CALL_SUBTEST( eigensolver(Matrix()) ); CALL_SUBTEST( eigensolver(Matrix()) ); } -} + CALL_SUBTEST( eigensolver_verify_assert() ); + CALL_SUBTEST( eigensolver_verify_assert() ); + CALL_SUBTEST( eigensolver_verify_assert() ); + CALL_SUBTEST( eigensolver_verify_assert() ); +}