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