diff options
Diffstat (limited to 'Eigen/src/Eigenvalues/Tridiagonalization.h')
-rw-r--r-- | Eigen/src/Eigenvalues/Tridiagonalization.h | 27 |
1 files changed, 23 insertions, 4 deletions
diff --git a/Eigen/src/Eigenvalues/Tridiagonalization.h b/Eigen/src/Eigenvalues/Tridiagonalization.h index 02917f2e6..e204c30ea 100644 --- a/Eigen/src/Eigenvalues/Tridiagonalization.h +++ b/Eigen/src/Eigenvalues/Tridiagonalization.h @@ -109,7 +109,9 @@ template<typename _MatrixType> class Tridiagonalization * \sa compute() for an example. */ Tridiagonalization(Index size = Size==Dynamic ? 2 : Size) - : m_matrix(size,size), m_hCoeffs(size > 1 ? size-1 : 1) + : m_matrix(size,size), + m_hCoeffs(size > 1 ? size-1 : 1), + m_isInitialized(false) {} /** \brief Constructor; computes tridiagonal decomposition of given matrix. @@ -123,9 +125,12 @@ template<typename _MatrixType> class Tridiagonalization * Output: \verbinclude Tridiagonalization_Tridiagonalization_MatrixType.out */ Tridiagonalization(const MatrixType& matrix) - : m_matrix(matrix), m_hCoeffs(matrix.cols() > 1 ? matrix.cols()-1 : 1) + : m_matrix(matrix), + m_hCoeffs(matrix.cols() > 1 ? matrix.cols()-1 : 1), + m_isInitialized(false) { _compute(m_matrix, m_hCoeffs); + m_isInitialized = true; } /** \brief Computes tridiagonal decomposition of given matrix. @@ -149,6 +154,7 @@ template<typename _MatrixType> class Tridiagonalization m_matrix = matrix; m_hCoeffs.resize(matrix.rows()-1, 1); _compute(m_matrix, m_hCoeffs); + m_isInitialized = true; } /** \brief Returns the Householder coefficients. @@ -167,7 +173,11 @@ template<typename _MatrixType> class Tridiagonalization * * \sa packedMatrix(), \ref Householder_Module "Householder module" */ - inline CoeffVectorType householderCoefficients() const { return m_hCoeffs; } + inline CoeffVectorType householderCoefficients() const + { + ei_assert(m_isInitialized && "Tridiagonalization is not initialized."); + return m_hCoeffs; + } /** \brief Returns the internal representation of the decomposition * @@ -200,7 +210,11 @@ template<typename _MatrixType> class Tridiagonalization * * \sa householderCoefficients() */ - inline const MatrixType& packedMatrix() const { return m_matrix; } + inline const MatrixType& packedMatrix() const + { + ei_assert(m_isInitialized && "Tridiagonalization is not initialized."); + return m_matrix; + } /** \brief Returns the unitary matrix Q in the decomposition * @@ -219,6 +233,7 @@ template<typename _MatrixType> class Tridiagonalization */ HouseholderSequenceType matrixQ() const { + ei_assert(m_isInitialized && "Tridiagonalization is not initialized."); return HouseholderSequenceType(m_matrix, m_hCoeffs.conjugate(), false, m_matrix.rows() - 1, 1); } @@ -312,12 +327,14 @@ template<typename _MatrixType> class Tridiagonalization MatrixType m_matrix; CoeffVectorType m_hCoeffs; + bool m_isInitialized; }; template<typename MatrixType> const typename Tridiagonalization<MatrixType>::DiagonalReturnType Tridiagonalization<MatrixType>::diagonal() const { + ei_assert(m_isInitialized && "Tridiagonalization is not initialized."); return m_matrix.diagonal(); } @@ -325,6 +342,7 @@ template<typename MatrixType> const typename Tridiagonalization<MatrixType>::SubDiagonalReturnType Tridiagonalization<MatrixType>::subDiagonal() const { + ei_assert(m_isInitialized && "Tridiagonalization is not initialized."); Index n = m_matrix.rows(); return Block<MatrixType,SizeMinusOne,SizeMinusOne>(m_matrix, 1, 0, n-1,n-1).diagonal(); } @@ -335,6 +353,7 @@ Tridiagonalization<MatrixType>::matrixT() const { // FIXME should this function (and other similar ones) rather take a matrix as argument // and fill it ? (to avoid temporaries) + ei_assert(m_isInitialized && "Tridiagonalization is not initialized."); Index n = m_matrix.rows(); MatrixType matT = m_matrix; matT.topRightCorner(n-1, n-1).diagonal() = subDiagonal().template cast<Scalar>().conjugate(); |