1 // This file is part of Eigen, a lightweight C++ template library 2 // for linear algebra. 3 // 4 // Copyright (C) 2011 Benoit Jacob <jacob.benoit.1 (at) gmail.com> 5 // 6 // This Source Code Form is subject to the terms of the Mozilla 7 // Public License v. 2.0. If a copy of the MPL was not distributed 8 // with this file, You can obtain one at http://mozilla.org/MPL/2.0/. 9 10 #ifndef EIGEN2_LU_H 11 #define EIGEN2_LU_H 12 13 namespace Eigen { 14 15 template<typename MatrixType> 16 class LU : public FullPivLU<MatrixType> 17 { 18 public: 19 20 typedef typename MatrixType::Scalar Scalar; 21 typedef typename NumTraits<typename MatrixType::Scalar>::Real RealScalar; 22 typedef Matrix<int, 1, MatrixType::ColsAtCompileTime, MatrixType::Options, 1, MatrixType::MaxColsAtCompileTime> IntRowVectorType; 23 typedef Matrix<int, MatrixType::RowsAtCompileTime, 1, MatrixType::Options, MatrixType::MaxRowsAtCompileTime, 1> IntColVectorType; 24 typedef Matrix<Scalar, 1, MatrixType::ColsAtCompileTime, MatrixType::Options, 1, MatrixType::MaxColsAtCompileTime> RowVectorType; 25 typedef Matrix<Scalar, MatrixType::RowsAtCompileTime, 1, MatrixType::Options, MatrixType::MaxRowsAtCompileTime, 1> ColVectorType; 26 27 typedef Matrix<typename MatrixType::Scalar, 28 MatrixType::ColsAtCompileTime, // the number of rows in the "kernel matrix" is the number of cols of the original matrix 29 // so that the product "matrix * kernel = zero" makes sense 30 Dynamic, // we don't know at compile-time the dimension of the kernel 31 MatrixType::Options, 32 MatrixType::MaxColsAtCompileTime, // see explanation for 2nd template parameter 33 MatrixType::MaxColsAtCompileTime // the kernel is a subspace of the domain space, whose dimension is the number 34 // of columns of the original matrix 35 > KernelResultType; 36 37 typedef Matrix<typename MatrixType::Scalar, 38 MatrixType::RowsAtCompileTime, // the image is a subspace of the destination space, whose dimension is the number 39 // of rows of the original matrix 40 Dynamic, // we don't know at compile time the dimension of the image (the rank) 41 MatrixType::Options, 42 MatrixType::MaxRowsAtCompileTime, // the image matrix will consist of columns from the original matrix, 43 MatrixType::MaxColsAtCompileTime // so it has the same number of rows and at most as many columns. 44 > ImageResultType; 45 46 typedef FullPivLU<MatrixType> Base; 47 48 template<typename T> 49 explicit LU(const T& t) : Base(t), m_originalMatrix(t) {} 50 51 template<typename OtherDerived, typename ResultType> 52 bool solve(const MatrixBase<OtherDerived>& b, ResultType *result) const 53 { 54 *result = static_cast<const Base*>(this)->solve(b); 55 return true; 56 } 57 58 template<typename ResultType> 59 inline void computeInverse(ResultType *result) const 60 { 61 solve(MatrixType::Identity(this->rows(), this->cols()), result); 62 } 63 64 template<typename KernelMatrixType> 65 void computeKernel(KernelMatrixType *result) const 66 { 67 *result = static_cast<const Base*>(this)->kernel(); 68 } 69 70 template<typename ImageMatrixType> 71 void computeImage(ImageMatrixType *result) const 72 { 73 *result = static_cast<const Base*>(this)->image(m_originalMatrix); 74 } 75 76 const ImageResultType image() const 77 { 78 return static_cast<const Base*>(this)->image(m_originalMatrix); 79 } 80 81 const MatrixType& m_originalMatrix; 82 }; 83 84 #if EIGEN2_SUPPORT_STAGE < STAGE20_RESOLVE_API_CONFLICTS 85 /** \lu_module 86 * 87 * Synonym of partialPivLu(). 88 * 89 * \return the partial-pivoting LU decomposition of \c *this. 90 * 91 * \sa class PartialPivLU 92 */ 93 template<typename Derived> 94 inline const LU<typename MatrixBase<Derived>::PlainObject> 95 MatrixBase<Derived>::lu() const 96 { 97 return LU<PlainObject>(eval()); 98 } 99 #endif 100 101 #ifdef EIGEN2_SUPPORT 102 /** \lu_module 103 * 104 * Synonym of partialPivLu(). 105 * 106 * \return the partial-pivoting LU decomposition of \c *this. 107 * 108 * \sa class PartialPivLU 109 */ 110 template<typename Derived> 111 inline const LU<typename MatrixBase<Derived>::PlainObject> 112 MatrixBase<Derived>::eigen2_lu() const 113 { 114 return LU<PlainObject>(eval()); 115 } 116 #endif 117 118 } // end namespace Eigen 119 120 #endif // EIGEN2_LU_H 121