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
44c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  * \ref TopicCustomizingEigen by defining the preprocessor symbol \c EIGEN_MATRIXBASE_PLUGIN.
45c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  *
46c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  * \sa \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;
55c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    typedef typename internal::traits<Derived>::Index Index;
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    using Base::CoeffReadCost;
70c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
71c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    using Base::derived;
72c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    using Base::const_cast_derived;
73c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    using Base::rows;
74c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    using Base::cols;
75c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    using Base::size;
76c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    using Base::coeff;
77c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    using Base::coeffRef;
78c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    using Base::lazyAssign;
79c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    using Base::eval;
80c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    using Base::operator+=;
81c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    using Base::operator-=;
82c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    using Base::operator*=;
83c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    using Base::operator/=;
84c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
85c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    typedef typename Base::CoeffReturnType CoeffReturnType;
86c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    typedef typename Base::ConstTransposeReturnType ConstTransposeReturnType;
87c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    typedef typename Base::RowXpr RowXpr;
88c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    typedef typename Base::ColXpr ColXpr;
89c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath#endif // not EIGEN_PARSED_BY_DOXYGEN
90c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
91c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
92c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
93c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath#ifndef EIGEN_PARSED_BY_DOXYGEN
94c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    /** type of the equivalent square matrix */
95c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    typedef Matrix<Scalar,EIGEN_SIZE_MAX(RowsAtCompileTime,ColsAtCompileTime),
96c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath                          EIGEN_SIZE_MAX(RowsAtCompileTime,ColsAtCompileTime)> SquareMatrixType;
97c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath#endif // not EIGEN_PARSED_BY_DOXYGEN
98c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
99c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    /** \returns the size of the main diagonal, which is min(rows(),cols()).
100c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath      * \sa rows(), cols(), SizeAtCompileTime. */
101c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    inline Index diagonalSize() const { return (std::min)(rows(),cols()); }
102c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
103c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    /** \brief The plain matrix type corresponding to this expression.
104c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath      *
105c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath      * This is not necessarily exactly the return type of eval(). In the case of plain matrices,
106c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath      * the return type of eval() is a const reference to a matrix, not a matrix! It is however guaranteed
107c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath      * that the return type of eval() is either PlainObject or const PlainObject&.
108c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath      */
109c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    typedef Matrix<typename internal::traits<Derived>::Scalar,
110c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath                internal::traits<Derived>::RowsAtCompileTime,
111c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath                internal::traits<Derived>::ColsAtCompileTime,
112c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath                AutoAlign | (internal::traits<Derived>::Flags&RowMajorBit ? RowMajor : ColMajor),
113c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath                internal::traits<Derived>::MaxRowsAtCompileTime,
114c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath                internal::traits<Derived>::MaxColsAtCompileTime
115c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath          > PlainObject;
116c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
117c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath#ifndef EIGEN_PARSED_BY_DOXYGEN
118c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    /** \internal Represents a matrix with all coefficients equal to one another*/
119c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    typedef CwiseNullaryOp<internal::scalar_constant_op<Scalar>,Derived> ConstantReturnType;
120c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    /** \internal the return type of MatrixBase::adjoint() */
121c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    typedef typename internal::conditional<NumTraits<Scalar>::IsComplex,
122c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath                        CwiseUnaryOp<internal::scalar_conjugate_op<Scalar>, ConstTransposeReturnType>,
123c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath                        ConstTransposeReturnType
124c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath                     >::type AdjointReturnType;
125c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    /** \internal Return type of eigenvalues() */
126c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    typedef Matrix<std::complex<RealScalar>, internal::traits<Derived>::ColsAtCompileTime, 1, ColMajor> EigenvaluesReturnType;
127c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    /** \internal the return type of identity */
128c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    typedef CwiseNullaryOp<internal::scalar_identity_op<Scalar>,Derived> IdentityReturnType;
129c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    /** \internal the return type of unit vectors */
130c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    typedef Block<const CwiseNullaryOp<internal::scalar_identity_op<Scalar>, SquareMatrixType>,
131c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath                  internal::traits<Derived>::RowsAtCompileTime,
132c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath                  internal::traits<Derived>::ColsAtCompileTime> BasisReturnType;
133c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath#endif // not EIGEN_PARSED_BY_DOXYGEN
134c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
135c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath#define EIGEN_CURRENT_STORAGE_BASE_CLASS Eigen::MatrixBase
136c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath#   include "../plugins/CommonCwiseUnaryOps.h"
137c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath#   include "../plugins/CommonCwiseBinaryOps.h"
138c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath#   include "../plugins/MatrixCwiseUnaryOps.h"
139c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath#   include "../plugins/MatrixCwiseBinaryOps.h"
140c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath#   ifdef EIGEN_MATRIXBASE_PLUGIN
141c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath#     include EIGEN_MATRIXBASE_PLUGIN
142c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath#   endif
143c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath#undef EIGEN_CURRENT_STORAGE_BASE_CLASS
144c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
145c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    /** Special case of the template operator=, in order to prevent the compiler
146c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath      * from generating a default operator= (issue hit with g++ 4.1)
147c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath      */
148c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    Derived& operator=(const MatrixBase& other);
149c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
150c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    // We cannot inherit here via Base::operator= since it is causing
151c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    // trouble with MSVC.
152c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
153c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    template <typename OtherDerived>
154c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    Derived& operator=(const DenseBase<OtherDerived>& other);
155c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
156c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    template <typename OtherDerived>
157c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    Derived& operator=(const EigenBase<OtherDerived>& other);
158c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
159c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    template<typename OtherDerived>
160c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    Derived& operator=(const ReturnByValue<OtherDerived>& other);
161c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
162c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath#ifndef EIGEN_PARSED_BY_DOXYGEN
163c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    template<typename ProductDerived, typename Lhs, typename Rhs>
164c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    Derived& lazyAssign(const ProductBase<ProductDerived, Lhs,Rhs>& other);
1657faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez
1667faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez    template<typename MatrixPower, typename Lhs, typename Rhs>
1677faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez    Derived& lazyAssign(const MatrixPowerProduct<MatrixPower, Lhs,Rhs>& other);
168c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath#endif // not EIGEN_PARSED_BY_DOXYGEN
169c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
170c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    template<typename OtherDerived>
171c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    Derived& operator+=(const MatrixBase<OtherDerived>& other);
172c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    template<typename OtherDerived>
173c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    Derived& operator-=(const MatrixBase<OtherDerived>& other);
174c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
175c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    template<typename OtherDerived>
176c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    const typename ProductReturnType<Derived,OtherDerived>::Type
177c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    operator*(const MatrixBase<OtherDerived> &other) const;
178c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
179c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    template<typename OtherDerived>
180c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    const typename LazyProductReturnType<Derived,OtherDerived>::Type
181c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    lazyProduct(const MatrixBase<OtherDerived> &other) const;
182c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
183c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    template<typename OtherDerived>
184c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    Derived& operator*=(const EigenBase<OtherDerived>& other);
185c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
186c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    template<typename OtherDerived>
187c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    void applyOnTheLeft(const EigenBase<OtherDerived>& other);
188c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
189c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    template<typename OtherDerived>
190c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    void applyOnTheRight(const EigenBase<OtherDerived>& other);
191c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
192c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    template<typename DiagonalDerived>
193c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    const DiagonalProduct<Derived, DiagonalDerived, OnTheRight>
194c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    operator*(const DiagonalBase<DiagonalDerived> &diagonal) const;
195c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
196c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    template<typename OtherDerived>
197c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    typename internal::scalar_product_traits<typename internal::traits<Derived>::Scalar,typename internal::traits<OtherDerived>::Scalar>::ReturnType
198c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    dot(const MatrixBase<OtherDerived>& other) const;
199c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
200c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    #ifdef EIGEN2_SUPPORT
201c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath      template<typename OtherDerived>
202c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath      Scalar eigen2_dot(const MatrixBase<OtherDerived>& other) const;
203c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    #endif
204c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
205c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    RealScalar squaredNorm() const;
206c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    RealScalar norm() const;
207c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    RealScalar stableNorm() const;
208c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    RealScalar blueNorm() const;
209c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    RealScalar hypotNorm() const;
210c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    const PlainObject normalized() const;
211c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    void normalize();
212c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
213c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    const AdjointReturnType adjoint() const;
214c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    void adjointInPlace();
215c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
216c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    typedef Diagonal<Derived> DiagonalReturnType;
217c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    DiagonalReturnType diagonal();
2187faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez	typedef typename internal::add_const<Diagonal<const Derived> >::type ConstDiagonalReturnType;
2197faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez    ConstDiagonalReturnType diagonal() const;
220c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
221c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    template<int Index> struct DiagonalIndexReturnType { typedef Diagonal<Derived,Index> Type; };
222c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    template<int Index> struct ConstDiagonalIndexReturnType { typedef const Diagonal<const Derived,Index> Type; };
223c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
224c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    template<int Index> typename DiagonalIndexReturnType<Index>::Type diagonal();
225c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    template<int Index> typename ConstDiagonalIndexReturnType<Index>::Type diagonal() const;
226c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
227c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    // Note: The "MatrixBase::" prefixes are added to help MSVC9 to match these declarations with the later implementations.
228c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    // On the other hand they confuse MSVC8...
229c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    #if (defined _MSC_VER) && (_MSC_VER >= 1500) // 2008 or later
2307faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez    typename MatrixBase::template DiagonalIndexReturnType<DynamicIndex>::Type diagonal(Index index);
2317faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez    typename MatrixBase::template ConstDiagonalIndexReturnType<DynamicIndex>::Type diagonal(Index index) const;
232c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    #else
2337faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez    typename DiagonalIndexReturnType<DynamicIndex>::Type diagonal(Index index);
2347faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez    typename ConstDiagonalIndexReturnType<DynamicIndex>::Type diagonal(Index index) const;
235c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    #endif
236c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
237c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    #ifdef EIGEN2_SUPPORT
238c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    template<unsigned int Mode> typename internal::eigen2_part_return_type<Derived, Mode>::type part();
239c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    template<unsigned int Mode> const typename internal::eigen2_part_return_type<Derived, Mode>::type part() const;
240c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
241c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    // huuuge hack. make Eigen2's matrix.part<Diagonal>() work in eigen3. Problem: Diagonal is now a class template instead
242c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    // of an integer constant. Solution: overload the part() method template wrt template parameters list.
2437faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez    template<template<typename T, int N> class U>
244c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    const DiagonalWrapper<ConstDiagonalReturnType> part() const
245c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    { return diagonal().asDiagonal(); }
246c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    #endif // EIGEN2_SUPPORT
247c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
248c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    template<unsigned int Mode> struct TriangularViewReturnType { typedef TriangularView<Derived, Mode> Type; };
249c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    template<unsigned int Mode> struct ConstTriangularViewReturnType { typedef const TriangularView<const Derived, Mode> Type; };
250c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
251c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    template<unsigned int Mode> typename TriangularViewReturnType<Mode>::Type triangularView();
252c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    template<unsigned int Mode> typename ConstTriangularViewReturnType<Mode>::Type triangularView() const;
253c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
254c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    template<unsigned int UpLo> struct SelfAdjointViewReturnType { typedef SelfAdjointView<Derived, UpLo> Type; };
255c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    template<unsigned int UpLo> struct ConstSelfAdjointViewReturnType { typedef const SelfAdjointView<const Derived, UpLo> Type; };
256c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
257c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    template<unsigned int UpLo> typename SelfAdjointViewReturnType<UpLo>::Type selfadjointView();
258c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    template<unsigned int UpLo> typename ConstSelfAdjointViewReturnType<UpLo>::Type selfadjointView() const;
259c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
260c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    const SparseView<Derived> sparseView(const Scalar& m_reference = Scalar(0),
2617faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez                                         const typename NumTraits<Scalar>::Real& m_epsilon = NumTraits<Scalar>::dummy_precision()) const;
262c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    static const IdentityReturnType Identity();
263c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    static const IdentityReturnType Identity(Index rows, Index cols);
264c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    static const BasisReturnType Unit(Index size, Index i);
265c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    static const BasisReturnType Unit(Index i);
266c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    static const BasisReturnType UnitX();
267c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    static const BasisReturnType UnitY();
268c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    static const BasisReturnType UnitZ();
269c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    static const BasisReturnType UnitW();
270c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
271c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    const DiagonalWrapper<const Derived> asDiagonal() const;
272c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    const PermutationWrapper<const Derived> asPermutation() const;
273c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
274c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    Derived& setIdentity();
275c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    Derived& setIdentity(Index rows, Index cols);
276c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
2777faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez    bool isIdentity(const RealScalar& prec = NumTraits<Scalar>::dummy_precision()) const;
2787faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez    bool isDiagonal(const RealScalar& prec = NumTraits<Scalar>::dummy_precision()) const;
279c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
2807faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez    bool isUpperTriangular(const RealScalar& prec = NumTraits<Scalar>::dummy_precision()) const;
2817faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez    bool isLowerTriangular(const RealScalar& prec = NumTraits<Scalar>::dummy_precision()) const;
282c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
283c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    template<typename OtherDerived>
284c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    bool isOrthogonal(const MatrixBase<OtherDerived>& other,
2857faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez                      const RealScalar& prec = NumTraits<Scalar>::dummy_precision()) const;
2867faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez    bool isUnitary(const RealScalar& prec = NumTraits<Scalar>::dummy_precision()) const;
287c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
288c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    /** \returns true if each coefficients of \c *this and \a other are all exactly equal.
289c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath      * \warning When using floating point scalar values you probably should rather use a
290c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath      *          fuzzy comparison such as isApprox()
291c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath      * \sa isApprox(), operator!= */
292c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    template<typename OtherDerived>
293c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    inline bool operator==(const MatrixBase<OtherDerived>& other) const
294c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    { return cwiseEqual(other).all(); }
295c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
296c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    /** \returns true if at least one pair of coefficients of \c *this and \a other are not exactly equal to each other.
297c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath      * \warning When using floating point scalar values you probably should rather use a
298c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath      *          fuzzy comparison such as isApprox()
299c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath      * \sa isApprox(), operator== */
300c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    template<typename OtherDerived>
301c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    inline bool operator!=(const MatrixBase<OtherDerived>& other) const
302c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    { return cwiseNotEqual(other).any(); }
303c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
304c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    NoAlias<Derived,Eigen::MatrixBase > noalias();
305c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
306c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    inline const ForceAlignedAccess<Derived> forceAlignedAccess() const;
307c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    inline ForceAlignedAccess<Derived> forceAlignedAccess();
308c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    template<bool Enable> inline typename internal::add_const_on_value_type<typename internal::conditional<Enable,ForceAlignedAccess<Derived>,Derived&>::type>::type forceAlignedAccessIf() const;
309c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    template<bool Enable> inline typename internal::conditional<Enable,ForceAlignedAccess<Derived>,Derived&>::type forceAlignedAccessIf();
310c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
311c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    Scalar trace() const;
312c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
313c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath/////////// Array module ///////////
314c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
315c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    template<int p> RealScalar lpNorm() const;
316c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
317c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    MatrixBase<Derived>& matrix() { return *this; }
318c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    const MatrixBase<Derived>& matrix() const { return *this; }
319c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
3207faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez    /** \returns an \link Eigen::ArrayBase Array \endlink expression of this matrix
321c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath      * \sa ArrayBase::matrix() */
322c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    ArrayWrapper<Derived> array() { return derived(); }
323c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    const ArrayWrapper<const Derived> array() const { return derived(); }
324c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
325c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath/////////// LU module ///////////
326c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
327c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    const FullPivLU<PlainObject> fullPivLu() const;
328c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    const PartialPivLU<PlainObject> partialPivLu() const;
329c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
330c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    #if EIGEN2_SUPPORT_STAGE < STAGE20_RESOLVE_API_CONFLICTS
331c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    const LU<PlainObject> lu() const;
332c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    #endif
333c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
334c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    #ifdef EIGEN2_SUPPORT
335c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    const LU<PlainObject> eigen2_lu() const;
336c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    #endif
337c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
338c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    #if EIGEN2_SUPPORT_STAGE > STAGE20_RESOLVE_API_CONFLICTS
339c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    const PartialPivLU<PlainObject> lu() const;
340c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    #endif
341c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
342c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    #ifdef EIGEN2_SUPPORT
343c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    template<typename ResultType>
344c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    void computeInverse(MatrixBase<ResultType> *result) const {
345c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath      *result = this->inverse();
346c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    }
347c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    #endif
348c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
349c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    const internal::inverse_impl<Derived> inverse() const;
350c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    template<typename ResultType>
351c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    void computeInverseAndDetWithCheck(
352c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath      ResultType& inverse,
353c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath      typename ResultType::Scalar& determinant,
354c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath      bool& invertible,
355c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath      const RealScalar& absDeterminantThreshold = NumTraits<Scalar>::dummy_precision()
356c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    ) const;
357c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    template<typename ResultType>
358c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    void computeInverseWithCheck(
359c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath      ResultType& inverse,
360c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath      bool& invertible,
361c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath      const RealScalar& absDeterminantThreshold = NumTraits<Scalar>::dummy_precision()
362c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    ) const;
363c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    Scalar determinant() const;
364c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
365c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath/////////// Cholesky module ///////////
366c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
367c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    const LLT<PlainObject>  llt() const;
368c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    const LDLT<PlainObject> ldlt() const;
369c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
370c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath/////////// QR module ///////////
371c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
372c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    const HouseholderQR<PlainObject> householderQr() const;
373c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    const ColPivHouseholderQR<PlainObject> colPivHouseholderQr() const;
374c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    const FullPivHouseholderQR<PlainObject> fullPivHouseholderQr() const;
375c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
376c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    #ifdef EIGEN2_SUPPORT
377c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    const QR<PlainObject> qr() const;
378c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    #endif
379c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
380c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    EigenvaluesReturnType eigenvalues() const;
381c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    RealScalar operatorNorm() const;
382c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
383c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath/////////// SVD module ///////////
384c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
385c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    JacobiSVD<PlainObject> jacobiSvd(unsigned int computationOptions = 0) const;
386c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
387c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    #ifdef EIGEN2_SUPPORT
388c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    SVD<PlainObject> svd() const;
389c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    #endif
390c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
391c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath/////////// Geometry module ///////////
392c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
393c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    #ifndef EIGEN_PARSED_BY_DOXYGEN
394c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    /// \internal helper struct to form the return type of the cross product
395c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    template<typename OtherDerived> struct cross_product_return_type {
396c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath      typedef typename internal::scalar_product_traits<typename internal::traits<Derived>::Scalar,typename internal::traits<OtherDerived>::Scalar>::ReturnType Scalar;
397c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath      typedef Matrix<Scalar,MatrixBase::RowsAtCompileTime,MatrixBase::ColsAtCompileTime> type;
398c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    };
399c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    #endif // EIGEN_PARSED_BY_DOXYGEN
400c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    template<typename OtherDerived>
401c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    typename cross_product_return_type<OtherDerived>::type
402c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    cross(const MatrixBase<OtherDerived>& other) const;
403c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    template<typename OtherDerived>
404c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    PlainObject cross3(const MatrixBase<OtherDerived>& other) const;
405c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    PlainObject unitOrthogonal(void) const;
406c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    Matrix<Scalar,3,1> eulerAngles(Index a0, Index a1, Index a2) const;
407c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
408c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    #if EIGEN2_SUPPORT_STAGE > STAGE20_RESOLVE_API_CONFLICTS
409c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    ScalarMultipleReturnType operator*(const UniformScaling<Scalar>& s) const;
410c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    // put this as separate enum value to work around possible GCC 4.3 bug (?)
411c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    enum { HomogeneousReturnTypeDirection = ColsAtCompileTime==1?Vertical:Horizontal };
412c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    typedef Homogeneous<Derived, HomogeneousReturnTypeDirection> HomogeneousReturnType;
413c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    HomogeneousReturnType homogeneous() const;
414c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    #endif
415c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
416c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    enum {
417c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath      SizeMinusOne = SizeAtCompileTime==Dynamic ? Dynamic : SizeAtCompileTime-1
418c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    };
419c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    typedef Block<const Derived,
420c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath                  internal::traits<Derived>::ColsAtCompileTime==1 ? SizeMinusOne : 1,
421c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath                  internal::traits<Derived>::ColsAtCompileTime==1 ? 1 : SizeMinusOne> ConstStartMinusOne;
422c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    typedef CwiseUnaryOp<internal::scalar_quotient1_op<typename internal::traits<Derived>::Scalar>,
423c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath                const ConstStartMinusOne > HNormalizedReturnType;
424c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
425c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    const HNormalizedReturnType hnormalized() const;
426c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
427c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath////////// Householder module ///////////
428c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
429c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    void makeHouseholderInPlace(Scalar& tau, RealScalar& beta);
430c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    template<typename EssentialPart>
431c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    void makeHouseholder(EssentialPart& essential,
432c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath                         Scalar& tau, RealScalar& beta) const;
433c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    template<typename EssentialPart>
434c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    void applyHouseholderOnTheLeft(const EssentialPart& essential,
435c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath                                   const Scalar& tau,
436c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath                                   Scalar* workspace);
437c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    template<typename EssentialPart>
438c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    void applyHouseholderOnTheRight(const EssentialPart& essential,
439c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath                                    const Scalar& tau,
440c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath                                    Scalar* workspace);
441c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
442c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath///////// Jacobi module /////////
443c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
444c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    template<typename OtherScalar>
445c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    void applyOnTheLeft(Index p, Index q, const JacobiRotation<OtherScalar>& j);
446c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    template<typename OtherScalar>
447c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    void applyOnTheRight(Index p, Index q, const JacobiRotation<OtherScalar>& j);
448c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
449c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath///////// MatrixFunctions module /////////
450c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
451c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    typedef typename internal::stem_function<Scalar>::type StemFunction;
452c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    const MatrixExponentialReturnValue<Derived> exp() const;
453c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    const MatrixFunctionReturnValue<Derived> matrixFunction(StemFunction f) const;
454c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    const MatrixFunctionReturnValue<Derived> cosh() const;
455c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    const MatrixFunctionReturnValue<Derived> sinh() const;
456c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    const MatrixFunctionReturnValue<Derived> cos() const;
457c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    const MatrixFunctionReturnValue<Derived> sin() const;
458c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    const MatrixSquareRootReturnValue<Derived> sqrt() const;
459c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    const MatrixLogarithmReturnValue<Derived> log() const;
4607faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez    const MatrixPowerReturnValue<Derived> pow(const RealScalar& p) const;
461c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
462c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath#ifdef EIGEN2_SUPPORT
463c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    template<typename ProductDerived, typename Lhs, typename Rhs>
464c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    Derived& operator+=(const Flagged<ProductBase<ProductDerived, Lhs,Rhs>, 0,
465c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath                                      EvalBeforeAssigningBit>& other);
466c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
467c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    template<typename ProductDerived, typename Lhs, typename Rhs>
468c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    Derived& operator-=(const Flagged<ProductBase<ProductDerived, Lhs,Rhs>, 0,
469c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath                                      EvalBeforeAssigningBit>& other);
470c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
471c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    /** \deprecated because .lazy() is deprecated
472c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath      * Overloaded for cache friendly product evaluation */
473c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    template<typename OtherDerived>
474c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    Derived& lazyAssign(const Flagged<OtherDerived, 0, EvalBeforeAssigningBit>& other)
475c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    { return lazyAssign(other._expression()); }
476c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
477c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    template<unsigned int Added>
478c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    const Flagged<Derived, Added, 0> marked() const;
479c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    const Flagged<Derived, 0, EvalBeforeAssigningBit> lazy() const;
480c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
481c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    inline const Cwise<Derived> cwise() const;
482c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    inline Cwise<Derived> cwise();
483c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
484c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    VectorBlock<Derived> start(Index size);
485c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    const VectorBlock<const Derived> start(Index size) const;
486c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    VectorBlock<Derived> end(Index size);
487c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    const VectorBlock<const Derived> end(Index size) const;
488c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    template<int Size> VectorBlock<Derived,Size> start();
489c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    template<int Size> const VectorBlock<const Derived,Size> start() const;
490c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    template<int Size> VectorBlock<Derived,Size> end();
491c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    template<int Size> const VectorBlock<const Derived,Size> end() const;
492c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
493c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    Minor<Derived> minor(Index row, Index col);
494c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    const Minor<Derived> minor(Index row, Index col) const;
495c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath#endif
496c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
497c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  protected:
498c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    MatrixBase() : Base() {}
499c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
500c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  private:
501c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    explicit MatrixBase(int);
502c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    MatrixBase(int,int);
503c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    template<typename OtherDerived> explicit MatrixBase(const MatrixBase<OtherDerived>&);
504c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  protected:
505c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    // mixing arrays and matrices is not legal
506c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    template<typename OtherDerived> Derived& operator+=(const ArrayBase<OtherDerived>& )
507c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    {EIGEN_STATIC_ASSERT(std::ptrdiff_t(sizeof(typename OtherDerived::Scalar))==-1,YOU_CANNOT_MIX_ARRAYS_AND_MATRICES); return *this;}
508c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    // mixing arrays and matrices is not legal
509c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    template<typename OtherDerived> Derived& operator-=(const ArrayBase<OtherDerived>& )
510c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    {EIGEN_STATIC_ASSERT(std::ptrdiff_t(sizeof(typename OtherDerived::Scalar))==-1,YOU_CANNOT_MIX_ARRAYS_AND_MATRICES); return *this;}
511c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath};
512c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
5137faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez
5147faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez/***************************************************************************
5157faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez* Implementation of matrix base methods
5167faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez***************************************************************************/
5177faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez
5187faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez/** replaces \c *this by \c *this * \a other.
5197faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez  *
5207faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez  * \returns a reference to \c *this
5217faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez  *
5227faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez  * Example: \include MatrixBase_applyOnTheRight.cpp
5237faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez  * Output: \verbinclude MatrixBase_applyOnTheRight.out
5247faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez  */
5257faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandeztemplate<typename Derived>
5267faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandeztemplate<typename OtherDerived>
5277faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandezinline Derived&
5287faaa9f3f0df9d23790277834d426c3d992ac3baCarlos HernandezMatrixBase<Derived>::operator*=(const EigenBase<OtherDerived> &other)
5297faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez{
5307faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez  other.derived().applyThisOnTheRight(derived());
5317faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez  return derived();
5327faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez}
5337faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez
5347faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez/** replaces \c *this by \c *this * \a other. It is equivalent to MatrixBase::operator*=().
5357faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez  *
5367faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez  * Example: \include MatrixBase_applyOnTheRight.cpp
5377faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez  * Output: \verbinclude MatrixBase_applyOnTheRight.out
5387faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez  */
5397faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandeztemplate<typename Derived>
5407faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandeztemplate<typename OtherDerived>
5417faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandezinline void MatrixBase<Derived>::applyOnTheRight(const EigenBase<OtherDerived> &other)
5427faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez{
5437faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez  other.derived().applyThisOnTheRight(derived());
5447faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez}
5457faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez
5467faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez/** replaces \c *this by \a other * \c *this.
5477faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez  *
5487faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez  * Example: \include MatrixBase_applyOnTheLeft.cpp
5497faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez  * Output: \verbinclude MatrixBase_applyOnTheLeft.out
5507faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez  */
5517faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandeztemplate<typename Derived>
5527faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandeztemplate<typename OtherDerived>
5537faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandezinline void MatrixBase<Derived>::applyOnTheLeft(const EigenBase<OtherDerived> &other)
5547faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez{
5557faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez  other.derived().applyThisOnTheLeft(derived());
5567faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez}
5577faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez
558c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath} // end namespace Eigen
559c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
560c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath#endif // EIGEN_MATRIXBASE_H
561