1c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath// This file is part of Eigen, a lightweight C++ template library
2c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath// for linear algebra.
3c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath//
4c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath// Copyright (C) 2006-2009 Benoit Jacob <jacob.benoit.1@gmail.com>
5c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath// Copyright (C) 2008 Gael Guennebaud <gael.guennebaud@inria.fr>
6c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath//
7c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath// This Source Code Form is subject to the terms of the Mozilla
8c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath// Public License v. 2.0. If a copy of the MPL was not distributed
9c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath// with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
10c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
11c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath#ifndef EIGEN_MATRIXBASE_H
12c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath#define EIGEN_MATRIXBASE_H
13c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
14c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathnamespace Eigen {
15c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
16c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath/** \class MatrixBase
17c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  * \ingroup Core_Module
18c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  *
19c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  * \brief Base class for all dense matrices, vectors, and expressions
20c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  *
21c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  * This class is the base that is inherited by all matrix, vector, and related expression
22c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  * types. Most of the Eigen API is contained in this class, and its base classes. Other important
23c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  * classes for the Eigen API are Matrix, and VectorwiseOp.
24c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  *
25c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  * Note that some methods are defined in other modules such as the \ref LU_Module LU module
26c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  * for all functions related to matrix inversions.
27c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  *
28c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  * \tparam Derived is the derived type, e.g. a matrix type, or an expression, etc.
29c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  *
30c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  * When writing a function taking Eigen objects as argument, if you want your function
31c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  * to take as argument any matrix, vector, or expression, just let it take a
32c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  * MatrixBase argument. As an example, here is a function printFirstRow which, given
33c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  * a matrix, vector, or expression \a x, prints the first row of \a x.
34c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  *
35c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  * \code
36c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    template<typename Derived>
37c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    void printFirstRow(const Eigen::MatrixBase<Derived>& x)
38c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    {
39c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath      cout << x.row(0) << endl;
40c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    }
41c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  * \endcode
42c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  *
43c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  * This class can be extended with the help of the plugin mechanism described on the page
442b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang  * \ref TopicCustomizing_Plugins by defining the preprocessor symbol \c EIGEN_MATRIXBASE_PLUGIN.
45c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  *
462b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang  * \sa \blank \ref TopicClassHierarchy
47c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  */
48c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathtemplate<typename Derived> class MatrixBase
49c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  : public DenseBase<Derived>
50c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath{
51c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  public:
52c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath#ifndef EIGEN_PARSED_BY_DOXYGEN
53c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    typedef MatrixBase StorageBaseType;
54c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    typedef typename internal::traits<Derived>::StorageKind StorageKind;
552b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang    typedef typename internal::traits<Derived>::StorageIndex StorageIndex;
56c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    typedef typename internal::traits<Derived>::Scalar Scalar;
57c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    typedef typename internal::packet_traits<Scalar>::type PacketScalar;
58c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    typedef typename NumTraits<Scalar>::Real RealScalar;
59c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
60c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    typedef DenseBase<Derived> Base;
61c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    using Base::RowsAtCompileTime;
62c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    using Base::ColsAtCompileTime;
63c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    using Base::SizeAtCompileTime;
64c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    using Base::MaxRowsAtCompileTime;
65c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    using Base::MaxColsAtCompileTime;
66c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    using Base::MaxSizeAtCompileTime;
67c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    using Base::IsVectorAtCompileTime;
68c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    using Base::Flags;
69c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
70c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    using Base::derived;
71c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    using Base::const_cast_derived;
72c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    using Base::rows;
73c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    using Base::cols;
74c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    using Base::size;
75c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    using Base::coeff;
76c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    using Base::coeffRef;
77c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    using Base::lazyAssign;
78c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    using Base::eval;
79c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    using Base::operator+=;
80c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    using Base::operator-=;
81c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    using Base::operator*=;
82c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    using Base::operator/=;
83c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
84c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    typedef typename Base::CoeffReturnType CoeffReturnType;
85c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    typedef typename Base::ConstTransposeReturnType ConstTransposeReturnType;
86c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    typedef typename Base::RowXpr RowXpr;
87c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    typedef typename Base::ColXpr ColXpr;
88c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath#endif // not EIGEN_PARSED_BY_DOXYGEN
89c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
90c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
91c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
92c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath#ifndef EIGEN_PARSED_BY_DOXYGEN
93c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    /** type of the equivalent square matrix */
94c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    typedef Matrix<Scalar,EIGEN_SIZE_MAX(RowsAtCompileTime,ColsAtCompileTime),
95c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath                          EIGEN_SIZE_MAX(RowsAtCompileTime,ColsAtCompileTime)> SquareMatrixType;
96c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath#endif // not EIGEN_PARSED_BY_DOXYGEN
97c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
98c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    /** \returns the size of the main diagonal, which is min(rows(),cols()).
99c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath      * \sa rows(), cols(), SizeAtCompileTime. */
1002b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang    EIGEN_DEVICE_FUNC
1012b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang    inline Index diagonalSize() const { return (numext::mini)(rows(),cols()); }
102c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
1032b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang    typedef typename Base::PlainObject PlainObject;
104c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
105c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath#ifndef EIGEN_PARSED_BY_DOXYGEN
106c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    /** \internal Represents a matrix with all coefficients equal to one another*/
1072b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang    typedef CwiseNullaryOp<internal::scalar_constant_op<Scalar>,PlainObject> ConstantReturnType;
108c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    /** \internal the return type of MatrixBase::adjoint() */
109c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    typedef typename internal::conditional<NumTraits<Scalar>::IsComplex,
110c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath                        CwiseUnaryOp<internal::scalar_conjugate_op<Scalar>, ConstTransposeReturnType>,
111c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath                        ConstTransposeReturnType
112c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath                     >::type AdjointReturnType;
113c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    /** \internal Return type of eigenvalues() */
114c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    typedef Matrix<std::complex<RealScalar>, internal::traits<Derived>::ColsAtCompileTime, 1, ColMajor> EigenvaluesReturnType;
115c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    /** \internal the return type of identity */
1162b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang    typedef CwiseNullaryOp<internal::scalar_identity_op<Scalar>,PlainObject> IdentityReturnType;
117c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    /** \internal the return type of unit vectors */
118c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    typedef Block<const CwiseNullaryOp<internal::scalar_identity_op<Scalar>, SquareMatrixType>,
119c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath                  internal::traits<Derived>::RowsAtCompileTime,
120c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath                  internal::traits<Derived>::ColsAtCompileTime> BasisReturnType;
121c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath#endif // not EIGEN_PARSED_BY_DOXYGEN
122c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
123c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath#define EIGEN_CURRENT_STORAGE_BASE_CLASS Eigen::MatrixBase
1242b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang#define EIGEN_DOC_UNARY_ADDONS(X,Y)
125c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath#   include "../plugins/CommonCwiseUnaryOps.h"
126c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath#   include "../plugins/CommonCwiseBinaryOps.h"
127c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath#   include "../plugins/MatrixCwiseUnaryOps.h"
128c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath#   include "../plugins/MatrixCwiseBinaryOps.h"
129c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath#   ifdef EIGEN_MATRIXBASE_PLUGIN
130c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath#     include EIGEN_MATRIXBASE_PLUGIN
131c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath#   endif
132c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath#undef EIGEN_CURRENT_STORAGE_BASE_CLASS
1332b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang#undef EIGEN_DOC_UNARY_ADDONS
134c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
135c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    /** Special case of the template operator=, in order to prevent the compiler
136c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath      * from generating a default operator= (issue hit with g++ 4.1)
137c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath      */
1382b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang    EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE
139c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    Derived& operator=(const MatrixBase& other);
140c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
141c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    // We cannot inherit here via Base::operator= since it is causing
142c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    // trouble with MSVC.
143c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
144c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    template <typename OtherDerived>
1452b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang    EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE
146c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    Derived& operator=(const DenseBase<OtherDerived>& other);
147c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
148c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    template <typename OtherDerived>
1492b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang    EIGEN_DEVICE_FUNC
150c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    Derived& operator=(const EigenBase<OtherDerived>& other);
151c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
152c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    template<typename OtherDerived>
1532b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang    EIGEN_DEVICE_FUNC
154c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    Derived& operator=(const ReturnByValue<OtherDerived>& other);
155c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
156c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    template<typename OtherDerived>
1572b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang    EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE
158c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    Derived& operator+=(const MatrixBase<OtherDerived>& other);
159c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    template<typename OtherDerived>
1602b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang    EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE
161c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    Derived& operator-=(const MatrixBase<OtherDerived>& other);
162c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
1632b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang#ifdef __CUDACC__
1642b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang    template<typename OtherDerived>
1652b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang    EIGEN_DEVICE_FUNC
1662b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang    const Product<Derived,OtherDerived,LazyProduct>
1672b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang    operator*(const MatrixBase<OtherDerived> &other) const
1682b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang    { return this->lazyProduct(other); }
1692b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang#else
1702b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang
171c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    template<typename OtherDerived>
1722b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang    const Product<Derived,OtherDerived>
173c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    operator*(const MatrixBase<OtherDerived> &other) const;
174c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
1752b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang#endif
1762b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang
177c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    template<typename OtherDerived>
1782b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang    EIGEN_DEVICE_FUNC
1792b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang    const Product<Derived,OtherDerived,LazyProduct>
180c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    lazyProduct(const MatrixBase<OtherDerived> &other) const;
181c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
182c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    template<typename OtherDerived>
183c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    Derived& operator*=(const EigenBase<OtherDerived>& other);
184c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
185c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    template<typename OtherDerived>
186c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    void applyOnTheLeft(const EigenBase<OtherDerived>& other);
187c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
188c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    template<typename OtherDerived>
189c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    void applyOnTheRight(const EigenBase<OtherDerived>& other);
190c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
191c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    template<typename DiagonalDerived>
1922b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang    EIGEN_DEVICE_FUNC
1932b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang    const Product<Derived, DiagonalDerived, LazyProduct>
194c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    operator*(const DiagonalBase<DiagonalDerived> &diagonal) const;
195c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
196c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    template<typename OtherDerived>
1972b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang    EIGEN_DEVICE_FUNC
1982b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang    typename ScalarBinaryOpTraits<typename internal::traits<Derived>::Scalar,typename internal::traits<OtherDerived>::Scalar>::ReturnType
199c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    dot(const MatrixBase<OtherDerived>& other) const;
200c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
2012b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang    EIGEN_DEVICE_FUNC RealScalar squaredNorm() const;
2022b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang    EIGEN_DEVICE_FUNC RealScalar norm() const;
203c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    RealScalar stableNorm() const;
204c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    RealScalar blueNorm() const;
205c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    RealScalar hypotNorm() const;
2062b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang    EIGEN_DEVICE_FUNC const PlainObject normalized() const;
2072b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang    EIGEN_DEVICE_FUNC const PlainObject stableNormalized() const;
2082b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang    EIGEN_DEVICE_FUNC void normalize();
2092b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang    EIGEN_DEVICE_FUNC void stableNormalize();
210c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
2112b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang    EIGEN_DEVICE_FUNC const AdjointReturnType adjoint() const;
2122b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang    EIGEN_DEVICE_FUNC void adjointInPlace();
213c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
214c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    typedef Diagonal<Derived> DiagonalReturnType;
2152b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang    EIGEN_DEVICE_FUNC
216c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    DiagonalReturnType diagonal();
2172b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang
218615d816d068b4d0f5e8df601930b5f160bf7eda1Tim Murray    typedef typename internal::add_const<Diagonal<const Derived> >::type ConstDiagonalReturnType;
2192b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang    EIGEN_DEVICE_FUNC
2207faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez    ConstDiagonalReturnType diagonal() const;
221c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
222c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    template<int Index> struct DiagonalIndexReturnType { typedef Diagonal<Derived,Index> Type; };
223c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    template<int Index> struct ConstDiagonalIndexReturnType { typedef const Diagonal<const Derived,Index> Type; };
224c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
2252b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang    template<int Index>
2262b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang    EIGEN_DEVICE_FUNC
2272b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang    typename DiagonalIndexReturnType<Index>::Type diagonal();
2282b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang
2292b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang    template<int Index>
2302b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang    EIGEN_DEVICE_FUNC
2312b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang    typename ConstDiagonalIndexReturnType<Index>::Type diagonal() const;
2322b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang
233615d816d068b4d0f5e8df601930b5f160bf7eda1Tim Murray    typedef Diagonal<Derived,DynamicIndex> DiagonalDynamicIndexReturnType;
234615d816d068b4d0f5e8df601930b5f160bf7eda1Tim Murray    typedef typename internal::add_const<Diagonal<const Derived,DynamicIndex> >::type ConstDiagonalDynamicIndexReturnType;
235c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
2362b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang    EIGEN_DEVICE_FUNC
237615d816d068b4d0f5e8df601930b5f160bf7eda1Tim Murray    DiagonalDynamicIndexReturnType diagonal(Index index);
2382b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang    EIGEN_DEVICE_FUNC
239615d816d068b4d0f5e8df601930b5f160bf7eda1Tim Murray    ConstDiagonalDynamicIndexReturnType diagonal(Index index) const;
240c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
241c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    template<unsigned int Mode> struct TriangularViewReturnType { typedef TriangularView<Derived, Mode> Type; };
242c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    template<unsigned int Mode> struct ConstTriangularViewReturnType { typedef const TriangularView<const Derived, Mode> Type; };
243c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
2442b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang    template<unsigned int Mode>
2452b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang    EIGEN_DEVICE_FUNC
2462b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang    typename TriangularViewReturnType<Mode>::Type triangularView();
2472b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang    template<unsigned int Mode>
2482b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang    EIGEN_DEVICE_FUNC
2492b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang    typename ConstTriangularViewReturnType<Mode>::Type triangularView() const;
250c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
251c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    template<unsigned int UpLo> struct SelfAdjointViewReturnType { typedef SelfAdjointView<Derived, UpLo> Type; };
252c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    template<unsigned int UpLo> struct ConstSelfAdjointViewReturnType { typedef const SelfAdjointView<const Derived, UpLo> Type; };
253c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
2542b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang    template<unsigned int UpLo>
2552b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang    EIGEN_DEVICE_FUNC
2562b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang    typename SelfAdjointViewReturnType<UpLo>::Type selfadjointView();
2572b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang    template<unsigned int UpLo>
2582b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang    EIGEN_DEVICE_FUNC
2592b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang    typename ConstSelfAdjointViewReturnType<UpLo>::Type selfadjointView() const;
260c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
261c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    const SparseView<Derived> sparseView(const Scalar& m_reference = Scalar(0),
2627faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez                                         const typename NumTraits<Scalar>::Real& m_epsilon = NumTraits<Scalar>::dummy_precision()) const;
2632b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang    EIGEN_DEVICE_FUNC static const IdentityReturnType Identity();
2642b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang    EIGEN_DEVICE_FUNC static const IdentityReturnType Identity(Index rows, Index cols);
2652b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang    EIGEN_DEVICE_FUNC static const BasisReturnType Unit(Index size, Index i);
2662b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang    EIGEN_DEVICE_FUNC static const BasisReturnType Unit(Index i);
2672b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang    EIGEN_DEVICE_FUNC static const BasisReturnType UnitX();
2682b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang    EIGEN_DEVICE_FUNC static const BasisReturnType UnitY();
2692b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang    EIGEN_DEVICE_FUNC static const BasisReturnType UnitZ();
2702b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang    EIGEN_DEVICE_FUNC static const BasisReturnType UnitW();
2712b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang
2722b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang    EIGEN_DEVICE_FUNC
273c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    const DiagonalWrapper<const Derived> asDiagonal() const;
274c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    const PermutationWrapper<const Derived> asPermutation() const;
275c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
2762b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang    EIGEN_DEVICE_FUNC
277c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    Derived& setIdentity();
2782b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang    EIGEN_DEVICE_FUNC
279c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    Derived& setIdentity(Index rows, Index cols);
280c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
2817faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez    bool isIdentity(const RealScalar& prec = NumTraits<Scalar>::dummy_precision()) const;
2827faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez    bool isDiagonal(const RealScalar& prec = NumTraits<Scalar>::dummy_precision()) const;
283c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
2847faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez    bool isUpperTriangular(const RealScalar& prec = NumTraits<Scalar>::dummy_precision()) const;
2857faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez    bool isLowerTriangular(const RealScalar& prec = NumTraits<Scalar>::dummy_precision()) const;
286c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
287c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    template<typename OtherDerived>
288c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    bool isOrthogonal(const MatrixBase<OtherDerived>& other,
2897faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez                      const RealScalar& prec = NumTraits<Scalar>::dummy_precision()) const;
2907faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez    bool isUnitary(const RealScalar& prec = NumTraits<Scalar>::dummy_precision()) const;
291c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
292c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    /** \returns true if each coefficients of \c *this and \a other are all exactly equal.
293c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath      * \warning When using floating point scalar values you probably should rather use a
294c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath      *          fuzzy comparison such as isApprox()
295c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath      * \sa isApprox(), operator!= */
296c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    template<typename OtherDerived>
297c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    inline bool operator==(const MatrixBase<OtherDerived>& other) const
298c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    { return cwiseEqual(other).all(); }
299c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
300c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    /** \returns true if at least one pair of coefficients of \c *this and \a other are not exactly equal to each other.
301c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath      * \warning When using floating point scalar values you probably should rather use a
302c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath      *          fuzzy comparison such as isApprox()
303c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath      * \sa isApprox(), operator== */
304c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    template<typename OtherDerived>
305c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    inline bool operator!=(const MatrixBase<OtherDerived>& other) const
306c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    { return cwiseNotEqual(other).any(); }
307c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
308c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    NoAlias<Derived,Eigen::MatrixBase > noalias();
309c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
3102b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang    // TODO forceAlignedAccess is temporarily disabled
3112b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang    // Need to find a nicer workaround.
3122b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang    inline const Derived& forceAlignedAccess() const { return derived(); }
3132b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang    inline Derived& forceAlignedAccess() { return derived(); }
3142b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang    template<bool Enable> inline const Derived& forceAlignedAccessIf() const { return derived(); }
3152b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang    template<bool Enable> inline Derived& forceAlignedAccessIf() { return derived(); }
316c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
3172b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang    EIGEN_DEVICE_FUNC Scalar trace() const;
318c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
3192b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang    template<int p> EIGEN_DEVICE_FUNC RealScalar lpNorm() const;
320c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
3212b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang    EIGEN_DEVICE_FUNC MatrixBase<Derived>& matrix() { return *this; }
3222b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang    EIGEN_DEVICE_FUNC const MatrixBase<Derived>& matrix() const { return *this; }
323c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
3247faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez    /** \returns an \link Eigen::ArrayBase Array \endlink expression of this matrix
325c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath      * \sa ArrayBase::matrix() */
3262b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang    EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE ArrayWrapper<Derived> array() { return ArrayWrapper<Derived>(derived()); }
3272b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang    /** \returns a const \link Eigen::ArrayBase Array \endlink expression of this matrix
3282b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang      * \sa ArrayBase::matrix() */
3292b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang    EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE const ArrayWrapper<const Derived> array() const { return ArrayWrapper<const Derived>(derived()); }
330c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
331c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath/////////// LU module ///////////
332c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
3332b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang    inline const FullPivLU<PlainObject> fullPivLu() const;
3342b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang    inline const PartialPivLU<PlainObject> partialPivLu() const;
335c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
3362b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang    inline const PartialPivLU<PlainObject> lu() const;
337c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
3382b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang    inline const Inverse<Derived> inverse() const;
339c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
340c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    template<typename ResultType>
3412b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang    inline void computeInverseAndDetWithCheck(
342c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath      ResultType& inverse,
343c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath      typename ResultType::Scalar& determinant,
344c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath      bool& invertible,
345c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath      const RealScalar& absDeterminantThreshold = NumTraits<Scalar>::dummy_precision()
346c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    ) const;
347c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    template<typename ResultType>
3482b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang    inline void computeInverseWithCheck(
349c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath      ResultType& inverse,
350c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath      bool& invertible,
351c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath      const RealScalar& absDeterminantThreshold = NumTraits<Scalar>::dummy_precision()
352c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    ) const;
353c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    Scalar determinant() const;
354c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
355c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath/////////// Cholesky module ///////////
356c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
3572b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang    inline const LLT<PlainObject>  llt() const;
3582b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang    inline const LDLT<PlainObject> ldlt() const;
359c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
360c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath/////////// QR module ///////////
361c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
3622b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang    inline const HouseholderQR<PlainObject> householderQr() const;
3632b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang    inline const ColPivHouseholderQR<PlainObject> colPivHouseholderQr() const;
3642b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang    inline const FullPivHouseholderQR<PlainObject> fullPivHouseholderQr() const;
3652b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang    inline const CompleteOrthogonalDecomposition<PlainObject> completeOrthogonalDecomposition() const;
366c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
3672b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang/////////// Eigenvalues module ///////////
368c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
3692b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang    inline EigenvaluesReturnType eigenvalues() const;
3702b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang    inline RealScalar operatorNorm() const;
371c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
3722b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang/////////// SVD module ///////////
373c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
3742b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang    inline JacobiSVD<PlainObject> jacobiSvd(unsigned int computationOptions = 0) const;
3752b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang    inline BDCSVD<PlainObject>    bdcSvd(unsigned int computationOptions = 0) const;
376c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
377c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath/////////// Geometry module ///////////
378c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
379c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    #ifndef EIGEN_PARSED_BY_DOXYGEN
380c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    /// \internal helper struct to form the return type of the cross product
381c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    template<typename OtherDerived> struct cross_product_return_type {
3822b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang      typedef typename ScalarBinaryOpTraits<typename internal::traits<Derived>::Scalar,typename internal::traits<OtherDerived>::Scalar>::ReturnType Scalar;
383c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath      typedef Matrix<Scalar,MatrixBase::RowsAtCompileTime,MatrixBase::ColsAtCompileTime> type;
384c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    };
385c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    #endif // EIGEN_PARSED_BY_DOXYGEN
386c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    template<typename OtherDerived>
3872b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang    EIGEN_DEVICE_FUNC
3882b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang#ifndef EIGEN_PARSED_BY_DOXYGEN
3892b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang    inline typename cross_product_return_type<OtherDerived>::type
3902b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang#else
3912b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang    inline PlainObject
3922b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang#endif
393c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    cross(const MatrixBase<OtherDerived>& other) const;
3942b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang
395c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    template<typename OtherDerived>
3962b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang    EIGEN_DEVICE_FUNC
3972b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang    inline PlainObject cross3(const MatrixBase<OtherDerived>& other) const;
3982b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang
3992b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang    EIGEN_DEVICE_FUNC
4002b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang    inline PlainObject unitOrthogonal(void) const;
4012b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang
4022b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang    EIGEN_DEVICE_FUNC
4032b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang    inline Matrix<Scalar,3,1> eulerAngles(Index a0, Index a1, Index a2) const;
4042b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang
405c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    // put this as separate enum value to work around possible GCC 4.3 bug (?)
4062b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang    enum { HomogeneousReturnTypeDirection = ColsAtCompileTime==1&&RowsAtCompileTime==1 ? ((internal::traits<Derived>::Flags&RowMajorBit)==RowMajorBit ? Horizontal : Vertical)
4072b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang                                          : ColsAtCompileTime==1 ? Vertical : Horizontal };
408c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    typedef Homogeneous<Derived, HomogeneousReturnTypeDirection> HomogeneousReturnType;
4092b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang    EIGEN_DEVICE_FUNC
4102b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang    inline HomogeneousReturnType homogeneous() const;
4112b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang
412c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    enum {
413c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath      SizeMinusOne = SizeAtCompileTime==Dynamic ? Dynamic : SizeAtCompileTime-1
414c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    };
415c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    typedef Block<const Derived,
416c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath                  internal::traits<Derived>::ColsAtCompileTime==1 ? SizeMinusOne : 1,
417c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath                  internal::traits<Derived>::ColsAtCompileTime==1 ? 1 : SizeMinusOne> ConstStartMinusOne;
4182b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang    typedef EIGEN_EXPR_BINARYOP_SCALAR_RETURN_TYPE(ConstStartMinusOne,Scalar,quotient) HNormalizedReturnType;
4192b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang    EIGEN_DEVICE_FUNC
4202b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang    inline const HNormalizedReturnType hnormalized() const;
421c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
422c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath////////// Householder module ///////////
423c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
424c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    void makeHouseholderInPlace(Scalar& tau, RealScalar& beta);
425c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    template<typename EssentialPart>
426c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    void makeHouseholder(EssentialPart& essential,
427c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath                         Scalar& tau, RealScalar& beta) const;
428c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    template<typename EssentialPart>
429c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    void applyHouseholderOnTheLeft(const EssentialPart& essential,
430c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath                                   const Scalar& tau,
431c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath                                   Scalar* workspace);
432c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    template<typename EssentialPart>
433c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    void applyHouseholderOnTheRight(const EssentialPart& essential,
434c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath                                    const Scalar& tau,
435c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath                                    Scalar* workspace);
436c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
437c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath///////// Jacobi module /////////
438c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
439c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    template<typename OtherScalar>
440c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    void applyOnTheLeft(Index p, Index q, const JacobiRotation<OtherScalar>& j);
441c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    template<typename OtherScalar>
442c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    void applyOnTheRight(Index p, Index q, const JacobiRotation<OtherScalar>& j);
443c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
4442b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang///////// SparseCore module /////////
4452b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang
4462b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang    template<typename OtherDerived>
4472b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang    EIGEN_STRONG_INLINE const typename SparseMatrixBase<OtherDerived>::template CwiseProductDenseReturnType<Derived>::Type
4482b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang    cwiseProduct(const SparseMatrixBase<OtherDerived> &other) const
4492b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang    {
4502b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang      return other.cwiseProduct(derived());
4512b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang    }
4522b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang
453c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath///////// MatrixFunctions module /////////
454c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
455c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    typedef typename internal::stem_function<Scalar>::type StemFunction;
456c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    const MatrixExponentialReturnValue<Derived> exp() const;
457c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    const MatrixFunctionReturnValue<Derived> matrixFunction(StemFunction f) const;
458c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    const MatrixFunctionReturnValue<Derived> cosh() const;
459c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    const MatrixFunctionReturnValue<Derived> sinh() const;
460c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    const MatrixFunctionReturnValue<Derived> cos() const;
461c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    const MatrixFunctionReturnValue<Derived> sin() const;
462c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    const MatrixSquareRootReturnValue<Derived> sqrt() const;
463c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    const MatrixLogarithmReturnValue<Derived> log() const;
4647faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez    const MatrixPowerReturnValue<Derived> pow(const RealScalar& p) const;
4652b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang    const MatrixComplexPowerReturnValue<Derived> pow(const std::complex<RealScalar>& p) const;
466c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
467c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  protected:
4682b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang    EIGEN_DEVICE_FUNC MatrixBase() : Base() {}
469c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
470c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  private:
4712b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang    EIGEN_DEVICE_FUNC explicit MatrixBase(int);
4722b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang    EIGEN_DEVICE_FUNC MatrixBase(int,int);
4732b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang    template<typename OtherDerived> EIGEN_DEVICE_FUNC explicit MatrixBase(const MatrixBase<OtherDerived>&);
474c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  protected:
475c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    // mixing arrays and matrices is not legal
476c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    template<typename OtherDerived> Derived& operator+=(const ArrayBase<OtherDerived>& )
477c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    {EIGEN_STATIC_ASSERT(std::ptrdiff_t(sizeof(typename OtherDerived::Scalar))==-1,YOU_CANNOT_MIX_ARRAYS_AND_MATRICES); return *this;}
478c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    // mixing arrays and matrices is not legal
479c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    template<typename OtherDerived> Derived& operator-=(const ArrayBase<OtherDerived>& )
480c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    {EIGEN_STATIC_ASSERT(std::ptrdiff_t(sizeof(typename OtherDerived::Scalar))==-1,YOU_CANNOT_MIX_ARRAYS_AND_MATRICES); return *this;}
481c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath};
482c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
4837faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez
4847faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez/***************************************************************************
4857faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez* Implementation of matrix base methods
4867faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez***************************************************************************/
4877faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez
4887faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez/** replaces \c *this by \c *this * \a other.
4897faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez  *
4907faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez  * \returns a reference to \c *this
4917faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez  *
4927faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez  * Example: \include MatrixBase_applyOnTheRight.cpp
4937faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez  * Output: \verbinclude MatrixBase_applyOnTheRight.out
4947faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez  */
4957faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandeztemplate<typename Derived>
4967faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandeztemplate<typename OtherDerived>
4977faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandezinline Derived&
4987faaa9f3f0df9d23790277834d426c3d992ac3baCarlos HernandezMatrixBase<Derived>::operator*=(const EigenBase<OtherDerived> &other)
4997faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez{
5007faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez  other.derived().applyThisOnTheRight(derived());
5017faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez  return derived();
5027faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez}
5037faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez
5047faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez/** replaces \c *this by \c *this * \a other. It is equivalent to MatrixBase::operator*=().
5057faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez  *
5067faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez  * Example: \include MatrixBase_applyOnTheRight.cpp
5077faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez  * Output: \verbinclude MatrixBase_applyOnTheRight.out
5087faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez  */
5097faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandeztemplate<typename Derived>
5107faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandeztemplate<typename OtherDerived>
5117faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandezinline void MatrixBase<Derived>::applyOnTheRight(const EigenBase<OtherDerived> &other)
5127faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez{
5137faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez  other.derived().applyThisOnTheRight(derived());
5147faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez}
5157faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez
5167faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez/** replaces \c *this by \a other * \c *this.
5177faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez  *
5187faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez  * Example: \include MatrixBase_applyOnTheLeft.cpp
5197faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez  * Output: \verbinclude MatrixBase_applyOnTheLeft.out
5207faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez  */
5217faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandeztemplate<typename Derived>
5227faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandeztemplate<typename OtherDerived>
5237faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandezinline void MatrixBase<Derived>::applyOnTheLeft(const EigenBase<OtherDerived> &other)
5247faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez{
5257faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez  other.derived().applyThisOnTheLeft(derived());
5267faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez}
5277faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez
528c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath} // end namespace Eigen
529c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
530c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath#endif // EIGEN_MATRIXBASE_H
531