1 // This file is part of Eigen, a lightweight C++ template library
2 // for linear algebra.
3 //
4 // Copyright (C) 2008 Gael Guennebaud <g.gael@free.fr>
5 // Copyright (C) 2011 Benoit Jacob <jacob.benoit.1@gmail.com>
6 //
7 // This Source Code Form is subject to the terms of the Mozilla
8 // Public License v. 2.0. If a copy of the MPL was not distributed
9 // with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
10
11 #ifndef EIGEN2_QR_H
12 #define EIGEN2_QR_H
13
14 namespace Eigen {
15
16 template<typename MatrixType>
17 class QR : public HouseholderQR<MatrixType>
18 {
19 public:
20
21 typedef HouseholderQR<MatrixType> Base;
22 typedef Block<const MatrixType, MatrixType::ColsAtCompileTime, MatrixType::ColsAtCompileTime> MatrixRBlockType;
23
QR()24 QR() : Base() {}
25
26 template<typename T>
QR(const T & t)27 explicit QR(const T& t) : Base(t) {}
28
29 template<typename OtherDerived, typename ResultType>
solve(const MatrixBase<OtherDerived> & b,ResultType * result)30 bool solve(const MatrixBase<OtherDerived>& b, ResultType *result) const
31 {
32 *result = static_cast<const Base*>(this)->solve(b);
33 return true;
34 }
35
matrixQ(void)36 MatrixType matrixQ(void) const {
37 MatrixType ret = MatrixType::Identity(this->rows(), this->cols());
38 ret = this->householderQ() * ret;
39 return ret;
40 }
41
isFullRank()42 bool isFullRank() const {
43 return true;
44 }
45
46 const TriangularView<MatrixRBlockType, UpperTriangular>
matrixR(void)47 matrixR(void) const
48 {
49 int cols = this->cols();
50 return MatrixRBlockType(this->matrixQR(), 0, 0, cols, cols).template triangularView<UpperTriangular>();
51 }
52 };
53
54 /** \return the QR decomposition of \c *this.
55 *
56 * \sa class QR
57 */
58 template<typename Derived>
59 const QR<typename MatrixBase<Derived>::PlainObject>
qr()60 MatrixBase<Derived>::qr() const
61 {
62 return QR<PlainObject>(eval());
63 }
64
65 } // end namespace Eigen
66
67 #endif // EIGEN2_QR_H
68