diff options
Diffstat (limited to 'Eigen/src/QR')
-rwxr-xr-x | Eigen/src/QR/HessenbergDecomposition.h | 15 | ||||
-rw-r--r-- | Eigen/src/QR/QR.h | 4 | ||||
-rw-r--r-- | Eigen/src/QR/QrInstantiations.cpp (renamed from Eigen/src/QR/QrInstanciations.cpp) | 8 | ||||
-rw-r--r-- | Eigen/src/QR/SelfAdjointEigenSolver.h | 2 | ||||
-rwxr-xr-x | Eigen/src/QR/Tridiagonalization.h | 91 |
5 files changed, 67 insertions, 53 deletions
diff --git a/Eigen/src/QR/HessenbergDecomposition.h b/Eigen/src/QR/HessenbergDecomposition.h index 0cfd61832..8f4710993 100755 --- a/Eigen/src/QR/HessenbergDecomposition.h +++ b/Eigen/src/QR/HessenbergDecomposition.h @@ -60,11 +60,11 @@ template<typename _MatrixType> class HessenbergDecomposition NestByValue<Block< MatrixType,SizeMinusOne,SizeMinusOne> > > >::RealReturnType SubDiagonalReturnType; - HessenbergDecomposition() - {} - - HessenbergDecomposition(int rows, int cols) - : m_matrix(rows,cols), m_hCoeffs(rows-1) + /** This constructor initializes a HessenbergDecomposition object for + * further use with HessenbergDecomposition::compute() + */ + HessenbergDecomposition(int size = Size==Dynamic ? 2 : Size) + : m_matrix(size,size), m_hCoeffs(size-1) {} HessenbergDecomposition(const MatrixType& matrix) @@ -121,6 +121,7 @@ template<typename _MatrixType> class HessenbergDecomposition CoeffVectorType m_hCoeffs; }; +#ifndef EIGEN_HIDE_HEAVY_CODE /** \internal * Performs a tridiagonal decomposition of \a matA in place. @@ -223,6 +224,8 @@ HessenbergDecomposition<MatrixType>::matrixQ(void) const return matQ; } +#endif // EIGEN_HIDE_HEAVY_CODE + /** constructs and returns the matrix H. * Note that the matrix H is equivalent to the upper part of the packed matrix * (including the lower sub-diagonal). Therefore, it might be often sufficient @@ -233,7 +236,7 @@ typename HessenbergDecomposition<MatrixType>::MatrixType HessenbergDecomposition<MatrixType>::matrixH(void) const { // FIXME should this function (and other similar) rather take a matrix as argument - // and fill it (avoids temporaries) + // and fill it (to avoid temporaries) int n = m_matrix.rows(); MatrixType matH = m_matrix; matH.corner(BottomLeft,n-2, n-2).template part<Lower>().setZero(); diff --git a/Eigen/src/QR/QR.h b/Eigen/src/QR/QR.h index 2bf6c72b2..4f5b4feee 100644 --- a/Eigen/src/QR/QR.h +++ b/Eigen/src/QR/QR.h @@ -75,6 +75,8 @@ template<typename MatrixType> class QR VectorType m_hCoeffs; }; +#ifndef EIGEN_HIDE_HEAVY_CODE + template<typename MatrixType> void QR<MatrixType>::_compute(const MatrixType& matrix) { @@ -157,6 +159,8 @@ MatrixType QR<MatrixType>::matrixQ(void) const return res; } +#endif // EIGEN_HIDE_HEAVY_CODE + /** \return the QR decomposition of \c *this. * * \sa class QR diff --git a/Eigen/src/QR/QrInstanciations.cpp b/Eigen/src/QR/QrInstantiations.cpp index 0c2d66853..dacb05d3d 100644 --- a/Eigen/src/QR/QrInstanciations.cpp +++ b/Eigen/src/QR/QrInstantiations.cpp @@ -22,9 +22,11 @@ // License and a copy of the GNU General Public License along with // Eigen. If not, see <http://www.gnu.org/licenses/>. -#ifdef EIGEN_EXTERN_INSTANCIATIONS -#undef EIGEN_EXTERN_INSTANCIATIONS +#ifndef EIGEN_EXTERN_INSTANTIATIONS +#define EIGEN_EXTERN_INSTANTIATIONS #endif +#include "../../Core" +#undef EIGEN_EXTERN_INSTANTIATIONS #include "../../QR" @@ -36,4 +38,6 @@ template static void ei_tridiagonal_qr_step(double* , double* , int, int, double template static void ei_tridiagonal_qr_step(float* , float* , int, int, std::complex<float>* , int); template static void ei_tridiagonal_qr_step(double* , double* , int, int, std::complex<double>* , int); +EIGEN_QR_MODULE_INSTANTIATE(); + } diff --git a/Eigen/src/QR/SelfAdjointEigenSolver.h b/Eigen/src/QR/SelfAdjointEigenSolver.h index 011ca0c01..262eba4bf 100644 --- a/Eigen/src/QR/SelfAdjointEigenSolver.h +++ b/Eigen/src/QR/SelfAdjointEigenSolver.h @@ -223,7 +223,7 @@ MatrixBase<Derived>::matrixNorm() const ::matrixNorm(derived()); } -#ifndef EIGEN_EXTERN_INSTANCIATIONS +#ifndef EIGEN_EXTERN_INSTANTIATIONS template<typename RealScalar, typename Scalar> static void ei_tridiagonal_qr_step(RealScalar* diag, RealScalar* subdiag, int start, int end, Scalar* matrixQ, int n) { diff --git a/Eigen/src/QR/Tridiagonalization.h b/Eigen/src/QR/Tridiagonalization.h index e76fbad96..1473b5bfa 100755 --- a/Eigen/src/QR/Tridiagonalization.h +++ b/Eigen/src/QR/Tridiagonalization.h @@ -60,11 +60,11 @@ template<typename _MatrixType> class Tridiagonalization NestByValue<Block< MatrixType,SizeMinusOne,SizeMinusOne> > > >::RealReturnType SubDiagonalReturnType; - Tridiagonalization() - {} - - Tridiagonalization(int rows, int cols) - : m_matrix(rows,cols), m_hCoeffs(rows-1) + /** This constructor initializes a Tridiagonalization object for + * further use with Tridiagonalization::compute() + */ + Tridiagonalization(int size = Size==Dynamic ? 2 : Size) + : m_matrix(size,size), m_hCoeffs(size-1) {} Tridiagonalization(const MatrixType& matrix) @@ -90,7 +90,7 @@ template<typename _MatrixType> class Tridiagonalization * * \sa packedMatrix() */ - CoeffVectorType householderCoefficients(void) const { return m_hCoeffs; } + inline CoeffVectorType householderCoefficients(void) const { return m_hCoeffs; } /** \returns the internal result of the decomposition. * @@ -108,7 +108,7 @@ template<typename _MatrixType> class Tridiagonalization * * See LAPACK for further details on this packed storage. */ - const MatrixType& packedMatrix(void) const { return m_matrix; } + inline const MatrixType& packedMatrix(void) const { return m_matrix; } MatrixType matrixQ(void) const; MatrixType matrixT(void) const; @@ -128,6 +128,44 @@ template<typename _MatrixType> class Tridiagonalization CoeffVectorType m_hCoeffs; }; +/** \returns an expression of the diagonal vector */ +template<typename MatrixType> +const typename Tridiagonalization<MatrixType>::DiagonalReturnType +Tridiagonalization<MatrixType>::diagonal(void) const +{ + return m_matrix.diagonal().nestByValue().real(); +} + +/** \returns an expression of the sub-diagonal vector */ +template<typename MatrixType> +const typename Tridiagonalization<MatrixType>::SubDiagonalReturnType +Tridiagonalization<MatrixType>::subDiagonal(void) const +{ + int n = m_matrix.rows(); + return Block<MatrixType,SizeMinusOne,SizeMinusOne>(m_matrix, 1, 0, n-1,n-1) + .nestByValue().diagonal().nestByValue().real(); +} + +/** constructs and returns the tridiagonal matrix T. + * Note that the matrix T is equivalent to the diagonal and sub-diagonal of the packed matrix. + * Therefore, it might be often sufficient to directly use the packed matrix, or the vector + * expressions returned by diagonal() and subDiagonal() instead of creating a new matrix. + */ +template<typename MatrixType> +typename Tridiagonalization<MatrixType>::MatrixType +Tridiagonalization<MatrixType>::matrixT(void) const +{ + // FIXME should this function (and other similar) rather take a matrix as argument + // and fill it (avoids temporaries) + int n = m_matrix.rows(); + MatrixType matT = m_matrix; + matT.corner(TopRight,n-1, n-1).diagonal() = subDiagonal().conjugate(); + matT.corner(TopRight,n-2, n-2).template part<Upper>().setZero(); + matT.corner(BottomLeft,n-2, n-2).template part<Lower>().setZero(); + return matT; +} + +#ifndef EIGEN_HIDE_HEAVY_CODE /** \internal * Performs a tridiagonal decomposition of \a matA in place. @@ -235,43 +273,6 @@ Tridiagonalization<MatrixType>::matrixQ(void) const return matQ; } -/** \returns an expression of the diagonal vector */ -template<typename MatrixType> -const typename Tridiagonalization<MatrixType>::DiagonalReturnType -Tridiagonalization<MatrixType>::diagonal(void) const -{ - return m_matrix.diagonal().nestByValue().real(); -} - -/** \returns an expression of the sub-diagonal vector */ -template<typename MatrixType> -const typename Tridiagonalization<MatrixType>::SubDiagonalReturnType -Tridiagonalization<MatrixType>::subDiagonal(void) const -{ - int n = m_matrix.rows(); - return Block<MatrixType,SizeMinusOne,SizeMinusOne>(m_matrix, 1, 0, n-1,n-1) - .nestByValue().diagonal().nestByValue().real(); -} - -/** constructs and returns the tridiagonal matrix T. - * Note that the matrix T is equivalent to the diagonal and sub-diagonal of the packed matrix. - * Therefore, it might be often sufficient to directly use the packed matrix, or the vector - * expressions returned by diagonal() and subDiagonal() instead of creating a new matrix. - */ -template<typename MatrixType> -typename Tridiagonalization<MatrixType>::MatrixType -Tridiagonalization<MatrixType>::matrixT(void) const -{ - // FIXME should this function (and other similar) rather take a matrix as argument - // and fill it (avoids temporaries) - int n = m_matrix.rows(); - MatrixType matT = m_matrix; - matT.corner(TopRight,n-1, n-1).diagonal() = subDiagonal().conjugate(); - matT.corner(TopRight,n-2, n-2).template part<Upper>().setZero(); - matT.corner(BottomLeft,n-2, n-2).template part<Lower>().setZero(); - return matT; -} - /** Performs a full decomposition in place */ template<typename MatrixType> void Tridiagonalization<MatrixType>::decomposeInPlace(MatrixType& mat, DiagonalType& diag, SubDiagonalType& subdiag, bool extractQ) @@ -337,4 +338,6 @@ void Tridiagonalization<MatrixType>::_decomposeInPlace3x3(MatrixType& mat, Diago } } +#endif // EIGEN_HIDE_HEAVY_CODE + #endif // EIGEN_TRIDIAGONALIZATION_H |