diff options
Diffstat (limited to 'Eigen')
-rw-r--r-- | Eigen/CMakeLists.txt | 2 | ||||
-rw-r--r-- | Eigen/EigenSolver | 74 | ||||
-rw-r--r-- | Eigen/LeastSquares | 2 | ||||
-rw-r--r-- | Eigen/QR | 19 | ||||
-rw-r--r-- | Eigen/src/CMakeLists.txt | 1 | ||||
-rw-r--r-- | Eigen/src/EigenSolver/CMakeLists.txt | 6 | ||||
-rw-r--r-- | Eigen/src/EigenSolver/ComplexEigenSolver.h (renamed from Eigen/src/QR/ComplexEigenSolver.h) | 1 | ||||
-rw-r--r-- | Eigen/src/EigenSolver/ComplexSchur.h (renamed from Eigen/src/QR/ComplexSchur.h) | 1 | ||||
-rw-r--r-- | Eigen/src/EigenSolver/EigenSolver.h (renamed from Eigen/src/QR/EigenSolver.h) | 18 | ||||
-rw-r--r-- | Eigen/src/EigenSolver/HessenbergDecomposition.h (renamed from Eigen/src/QR/HessenbergDecomposition.h) | 4 | ||||
-rw-r--r-- | Eigen/src/EigenSolver/SelfAdjointEigenSolver.h (renamed from Eigen/src/QR/SelfAdjointEigenSolver.h) | 8 | ||||
-rw-r--r-- | Eigen/src/EigenSolver/Tridiagonalization.h (renamed from Eigen/src/QR/Tridiagonalization.h) | 2 | ||||
-rw-r--r-- | Eigen/src/QR/QrInstantiations.cpp | 5 |
13 files changed, 105 insertions, 38 deletions
diff --git a/Eigen/CMakeLists.txt b/Eigen/CMakeLists.txt index b692cdc51..ebdf57812 100644 --- a/Eigen/CMakeLists.txt +++ b/Eigen/CMakeLists.txt @@ -1,4 +1,4 @@ -set(Eigen_HEADERS Core LU Cholesky QR Geometry Sparse Array SVD LeastSquares QtAlignedMalloc StdVector Householder Jacobi) +set(Eigen_HEADERS Core LU Cholesky QR Geometry Sparse Array SVD LeastSquares QtAlignedMalloc StdVector Householder Jacobi EigenSolver) if(EIGEN_BUILD_LIB) set(Eigen_SRCS diff --git a/Eigen/EigenSolver b/Eigen/EigenSolver new file mode 100644 index 000000000..fd126d282 --- /dev/null +++ b/Eigen/EigenSolver @@ -0,0 +1,74 @@ +#ifndef EIGEN_EIGEN_SOLVER_MODULE_H +#define EIGEN_EIGEN_SOLVER_MODULE_H + +#include "Core" + +#include "src/Core/util/DisableMSVCWarnings.h" + +#include "Cholesky" +#include "Jacobi" +#include "Householder" + +// Note that EIGEN_HIDE_HEAVY_CODE has to be defined per module +#if (defined EIGEN_EXTERN_INSTANTIATIONS) && (EIGEN_EXTERN_INSTANTIATIONS>=2) + #ifndef EIGEN_HIDE_HEAVY_CODE + #define EIGEN_HIDE_HEAVY_CODE + #endif +#elif defined EIGEN_HIDE_HEAVY_CODE + #undef EIGEN_HIDE_HEAVY_CODE +#endif + +namespace Eigen { + +/** \defgroup EigenSolver_Module Eigen Solver module + * + * \nonstableyet + * + * This module mainly provides various eigen value solvers. + * This module also provides some MatrixBase methods, including: + * - MatrixBase::eigenvalues(), + * - MatrixBase::operatorNorm() + * + * \code + * #include <Eigen/EigenSolver> + * \endcode + */ + +#include "src/EigenSolver/Tridiagonalization.h" +#include "src/EigenSolver/EigenSolver.h" +#include "src/EigenSolver/SelfAdjointEigenSolver.h" +#include "src/EigenSolver/HessenbergDecomposition.h" +#include "src/EigenSolver/ComplexSchur.h" +#include "src/EigenSolver/ComplexEigenSolver.h" + +// declare all classes for a given matrix type +#define EIGEN_EIGEN_SOLVER_MODULE_INSTANTIATE_TYPE(MATRIXTYPE,PREFIX) \ + PREFIX template class Tridiagonalization<MATRIXTYPE>; \ + PREFIX template class HessenbergDecomposition<MATRIXTYPE>; \ + PREFIX template class SelfAdjointEigenSolver<MATRIXTYPE> + +// removed because it does not support complex yet +// PREFIX template class EigenSolver<MATRIXTYPE> + +// declare all class for all types +#define EIGEN_EIGEN_SOLVER_MODULE_INSTANTIATE(PREFIX) \ + EIGEN_EIGEN_SOLVER_MODULE_INSTANTIATE_TYPE(Matrix2f,PREFIX); \ + EIGEN_EIGEN_SOLVER_MODULE_INSTANTIATE_TYPE(Matrix2d,PREFIX); \ + EIGEN_EIGEN_SOLVER_MODULE_INSTANTIATE_TYPE(Matrix3f,PREFIX); \ + EIGEN_EIGEN_SOLVER_MODULE_INSTANTIATE_TYPE(Matrix3d,PREFIX); \ + EIGEN_EIGEN_SOLVER_MODULE_INSTANTIATE_TYPE(Matrix4f,PREFIX); \ + EIGEN_EIGEN_SOLVER_MODULE_INSTANTIATE_TYPE(Matrix4d,PREFIX); \ + EIGEN_EIGEN_SOLVER_MODULE_INSTANTIATE_TYPE(MatrixXf,PREFIX); \ + EIGEN_EIGEN_SOLVER_MODULE_INSTANTIATE_TYPE(MatrixXd,PREFIX); \ + EIGEN_EIGEN_SOLVER_MODULE_INSTANTIATE_TYPE(MatrixXcf,PREFIX); \ + EIGEN_EIGEN_SOLVER_MODULE_INSTANTIATE_TYPE(MatrixXcd,PREFIX) + +#ifdef EIGEN_EXTERN_INSTANTIATIONS + EIGEN_EIGEN_SOLVER_MODULE_INSTANTIATE(extern); +#endif // EIGEN_EXTERN_INSTANTIATIONS + +} // namespace Eigen + +#include "src/Core/util/EnableMSVCWarnings.h" + +#endif // EIGEN_EIGEN_SOLVER_MODULE_H diff --git a/Eigen/LeastSquares b/Eigen/LeastSquares index 573a13cb4..db620f548 100644 --- a/Eigen/LeastSquares +++ b/Eigen/LeastSquares @@ -5,7 +5,7 @@ #include "src/Core/util/DisableMSVCWarnings.h" -#include "QR" +#include "EigenSolver" #include "Geometry" namespace Eigen { @@ -24,11 +24,9 @@ namespace Eigen { * * \nonstableyet * - * This module mainly provides QR decomposition and an eigen value solver. + * This module provides various QR decompositions * This module also provides some MatrixBase methods, including: * - MatrixBase::qr(), - * - MatrixBase::eigenvalues(), - * - MatrixBase::operatorNorm() * * \code * #include <Eigen/QR> @@ -38,22 +36,10 @@ namespace Eigen { #include "src/QR/HouseholderQR.h" #include "src/QR/FullPivotingHouseholderQR.h" #include "src/QR/ColPivotingHouseholderQR.h" -#include "src/QR/Tridiagonalization.h" -#include "src/QR/EigenSolver.h" -#include "src/QR/SelfAdjointEigenSolver.h" -#include "src/QR/HessenbergDecomposition.h" -#include "src/QR/ComplexSchur.h" -#include "src/QR/ComplexEigenSolver.h" // declare all classes for a given matrix type #define EIGEN_QR_MODULE_INSTANTIATE_TYPE(MATRIXTYPE,PREFIX) \ PREFIX template class HouseholderQR<MATRIXTYPE>; \ - PREFIX template class Tridiagonalization<MATRIXTYPE>; \ - PREFIX template class HessenbergDecomposition<MATRIXTYPE>; \ - PREFIX template class SelfAdjointEigenSolver<MATRIXTYPE> - -// removed because it does not support complex yet -// PREFIX template class EigenSolver<MATRIXTYPE> // declare all class for all types #define EIGEN_QR_MODULE_INSTANTIATE(PREFIX) \ @@ -76,4 +62,7 @@ namespace Eigen { #include "src/Core/util/EnableMSVCWarnings.h" +// FIXME for compatibility we include EigenSolver here: +#include "EigenSolver" + #endif // EIGEN_QR_MODULE_H diff --git a/Eigen/src/CMakeLists.txt b/Eigen/src/CMakeLists.txt index 2f6a83a1b..6b1333860 100644 --- a/Eigen/src/CMakeLists.txt +++ b/Eigen/src/CMakeLists.txt @@ -9,3 +9,4 @@ ADD_SUBDIRECTORY(LeastSquares) ADD_SUBDIRECTORY(Sparse) ADD_SUBDIRECTORY(Jacobi) ADD_SUBDIRECTORY(Householder) +ADD_SUBDIRECTORY(EigenSolver) diff --git a/Eigen/src/EigenSolver/CMakeLists.txt b/Eigen/src/EigenSolver/CMakeLists.txt new file mode 100644 index 000000000..63bc75e0c --- /dev/null +++ b/Eigen/src/EigenSolver/CMakeLists.txt @@ -0,0 +1,6 @@ +FILE(GLOB Eigen_EIGENSOLVER_SRCS "*.h") + +INSTALL(FILES + ${Eigen_EIGENSOLVER_SRCS} + DESTINATION ${INCLUDE_INSTALL_DIR}/Eigen/src/EigenSolver COMPONENT Devel + ) diff --git a/Eigen/src/QR/ComplexEigenSolver.h b/Eigen/src/EigenSolver/ComplexEigenSolver.h index 6caa6bc2d..2ea7464a6 100644 --- a/Eigen/src/QR/ComplexEigenSolver.h +++ b/Eigen/src/EigenSolver/ComplexEigenSolver.h @@ -79,6 +79,7 @@ template<typename _MatrixType> class ComplexEigenSolver template<typename MatrixType>
void ComplexEigenSolver<MatrixType>::compute(const MatrixType& matrix)
{
+ // this code is inspired from Jampack
assert(matrix.cols() == matrix.rows());
int n = matrix.cols();
m_eivalues.resize(n,1);
diff --git a/Eigen/src/QR/ComplexSchur.h b/Eigen/src/EigenSolver/ComplexSchur.h index b60be5430..915f351fc 100644 --- a/Eigen/src/QR/ComplexSchur.h +++ b/Eigen/src/EigenSolver/ComplexSchur.h @@ -120,6 +120,7 @@ std::complex<RealScalar> ei_sqrt(const std::complex<RealScalar> &z) template<typename MatrixType> void ComplexSchur<MatrixType>::compute(const MatrixType& matrix) { + // this code is inspired from Jampack assert(matrix.cols() == matrix.rows()); int n = matrix.cols(); diff --git a/Eigen/src/QR/EigenSolver.h b/Eigen/src/EigenSolver/EigenSolver.h index 79d73db7e..1046780c6 100644 --- a/Eigen/src/QR/EigenSolver.h +++ b/Eigen/src/EigenSolver/EigenSolver.h @@ -25,7 +25,7 @@ #ifndef EIGEN_EIGENSOLVER_H #define EIGEN_EIGENSOLVER_H -/** \ingroup QR_Module +/** \ingroup EigenSolver_Module * \nonstableyet * * \class EigenSolver @@ -53,7 +53,7 @@ template<typename _MatrixType> class EigenSolver typedef Matrix<RealScalar, MatrixType::ColsAtCompileTime, 1> RealVectorType; typedef Matrix<RealScalar, Dynamic, 1> RealVectorTypeX; - /** + /** * \brief Default Constructor. * * The default constructor is useful in cases in which the user intends to @@ -103,19 +103,19 @@ template<typename _MatrixType> class EigenSolver * * \sa pseudoEigenvalueMatrix() */ - const MatrixType& pseudoEigenvectors() const - { + const MatrixType& pseudoEigenvectors() const + { ei_assert(m_isInitialized && "EigenSolver is not initialized."); - return m_eivec; + return m_eivec; } MatrixType pseudoEigenvalueMatrix() const; /** \returns the eigenvalues as a column vector */ - EigenvalueType eigenvalues() const - { + EigenvalueType eigenvalues() const + { ei_assert(m_isInitialized && "EigenSolver is not initialized."); - return m_eivalues; + return m_eivalues; } EigenSolver& compute(const MatrixType& matrix); @@ -265,7 +265,7 @@ void EigenSolver<MatrixType>::orthes(MatrixType& matH, RealVectorType& ort) ort.segment(m+1, high-m) = matH.col(m-1).segment(m+1, high-m); int bSize = high-m+1; - m_eivec.block(m, m, bSize, bSize).noalias() += ( (ort.segment(m, bSize) / (matH.coeff(m,m-1) * ort.coeff(m))) + m_eivec.block(m, m, bSize, bSize).noalias() += ( (ort.segment(m, bSize) / (matH.coeff(m,m-1) * ort.coeff(m))) * (ort.segment(m, bSize).transpose() * m_eivec.block(m, m, bSize, bSize)) ); } } diff --git a/Eigen/src/QR/HessenbergDecomposition.h b/Eigen/src/EigenSolver/HessenbergDecomposition.h index 6b261a8a7..f782cef30 100644 --- a/Eigen/src/QR/HessenbergDecomposition.h +++ b/Eigen/src/EigenSolver/HessenbergDecomposition.h @@ -25,7 +25,7 @@ #ifndef EIGEN_HESSENBERGDECOMPOSITION_H #define EIGEN_HESSENBERGDECOMPOSITION_H -/** \ingroup QR_Module +/** \ingroup EigenSolver_Module * \nonstableyet * * \class HessenbergDecomposition @@ -156,7 +156,7 @@ void HessenbergDecomposition<MatrixType>::_compute(MatrixType& matA, CoeffVector // Apply similarity transformation to remaining columns, // i.e., compute A = H A H' - + // A = H A matA.corner(BottomRight, remainingSize, remainingSize) .applyHouseholderOnTheLeft(matA.col(i).end(remainingSize-1), h, &temp.coeffRef(0)); diff --git a/Eigen/src/QR/SelfAdjointEigenSolver.h b/Eigen/src/EigenSolver/SelfAdjointEigenSolver.h index 580b042f6..40b06df2c 100644 --- a/Eigen/src/QR/SelfAdjointEigenSolver.h +++ b/Eigen/src/EigenSolver/SelfAdjointEigenSolver.h @@ -25,7 +25,7 @@ #ifndef EIGEN_SELFADJOINTEIGENSOLVER_H #define EIGEN_SELFADJOINTEIGENSOLVER_H -/** \qr_module \ingroup QR_Module +/** \eigensolver_module \ingroup EigenSolver_Module * \nonstableyet * * \class SelfAdjointEigenSolver @@ -137,7 +137,7 @@ template<typename _MatrixType> class SelfAdjointEigenSolver /** \internal * - * \qr_module + * \eigensolver_module * * Performs a QR step on a tridiagonal symmetric matrix represented as a * pair of two vectors \a diag and \a subdiag. @@ -266,7 +266,7 @@ compute(const MatrixType& matA, const MatrixType& matB, bool computeEigenvectors #endif // EIGEN_HIDE_HEAVY_CODE -/** \qr_module +/** \eigensolver_module * * \returns a vector listing the eigenvalues of this matrix. */ @@ -307,7 +307,7 @@ template<typename Derived> struct ei_operatorNorm_selector<Derived, false> } }; -/** \qr_module +/** \eigensolver_module * * \returns the matrix norm of this matrix. */ diff --git a/Eigen/src/QR/Tridiagonalization.h b/Eigen/src/EigenSolver/Tridiagonalization.h index 2053505f6..e0bff17b9 100644 --- a/Eigen/src/QR/Tridiagonalization.h +++ b/Eigen/src/EigenSolver/Tridiagonalization.h @@ -25,7 +25,7 @@ #ifndef EIGEN_TRIDIAGONALIZATION_H #define EIGEN_TRIDIAGONALIZATION_H -/** \ingroup QR_Module +/** \ingroup EigenSolver_Module * \nonstableyet * * \class Tridiagonalization diff --git a/Eigen/src/QR/QrInstantiations.cpp b/Eigen/src/QR/QrInstantiations.cpp index 38b0a57da..695377d69 100644 --- a/Eigen/src/QR/QrInstantiations.cpp +++ b/Eigen/src/QR/QrInstantiations.cpp @@ -33,11 +33,6 @@ namespace Eigen { -template static void ei_tridiagonal_qr_step(float* , float* , int, int, float* , int); -template static void ei_tridiagonal_qr_step(double* , double* , int, int, double* , int); -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(); } |