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