1c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath// This file is part of Eigen, a lightweight C++ template library 2c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath// for linear algebra. 3c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath// 4c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath// Copyright (C) 2009 Gael Guennebaud <gael.guennebaud@inria.fr> 5c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath// Copyright (C) 2007-2009 Benoit Jacob <jacob.benoit.1@gmail.com> 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_DIAGONALMATRIX_H 12c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath#define EIGEN_DIAGONALMATRIX_H 13c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath 14c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathnamespace Eigen { 15c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath 16c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath#ifndef EIGEN_PARSED_BY_DOXYGEN 17c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathtemplate<typename Derived> 18c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathclass DiagonalBase : public EigenBase<Derived> 19c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath{ 20c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath public: 21c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath typedef typename internal::traits<Derived>::DiagonalVectorType DiagonalVectorType; 22c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath typedef typename DiagonalVectorType::Scalar Scalar; 237faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez typedef typename DiagonalVectorType::RealScalar RealScalar; 24c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath typedef typename internal::traits<Derived>::StorageKind StorageKind; 25c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath typedef typename internal::traits<Derived>::Index Index; 26c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath 27c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath enum { 28c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath RowsAtCompileTime = DiagonalVectorType::SizeAtCompileTime, 29c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath ColsAtCompileTime = DiagonalVectorType::SizeAtCompileTime, 30c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath MaxRowsAtCompileTime = DiagonalVectorType::MaxSizeAtCompileTime, 31c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath MaxColsAtCompileTime = DiagonalVectorType::MaxSizeAtCompileTime, 32c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath IsVectorAtCompileTime = 0, 33c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath Flags = 0 34c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath }; 35c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath 36c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath typedef Matrix<Scalar, RowsAtCompileTime, ColsAtCompileTime, 0, MaxRowsAtCompileTime, MaxColsAtCompileTime> DenseMatrixType; 37c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath typedef DenseMatrixType DenseType; 38c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath typedef DiagonalMatrix<Scalar,DiagonalVectorType::SizeAtCompileTime,DiagonalVectorType::MaxSizeAtCompileTime> PlainObject; 39c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath 40c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath inline const Derived& derived() const { return *static_cast<const Derived*>(this); } 41c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath inline Derived& derived() { return *static_cast<Derived*>(this); } 42c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath 43c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath DenseMatrixType toDenseMatrix() const { return derived(); } 44c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath template<typename DenseDerived> 45c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath void evalTo(MatrixBase<DenseDerived> &other) const; 46c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath template<typename DenseDerived> 47c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath void addTo(MatrixBase<DenseDerived> &other) const 48c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath { other.diagonal() += diagonal(); } 49c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath template<typename DenseDerived> 50c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath void subTo(MatrixBase<DenseDerived> &other) const 51c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath { other.diagonal() -= diagonal(); } 52c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath 53c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath inline const DiagonalVectorType& diagonal() const { return derived().diagonal(); } 54c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath inline DiagonalVectorType& diagonal() { return derived().diagonal(); } 55c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath 56c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath inline Index rows() const { return diagonal().size(); } 57c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath inline Index cols() const { return diagonal().size(); } 58c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath 597faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez /** \returns the diagonal matrix product of \c *this by the matrix \a matrix. 607faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez */ 61c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath template<typename MatrixDerived> 62c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath const DiagonalProduct<MatrixDerived, Derived, OnTheLeft> 637faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez operator*(const MatrixBase<MatrixDerived> &matrix) const 647faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez { 657faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez return DiagonalProduct<MatrixDerived, Derived, OnTheLeft>(matrix.derived(), derived()); 667faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez } 67c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath 68c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath inline const DiagonalWrapper<const CwiseUnaryOp<internal::scalar_inverse_op<Scalar>, const DiagonalVectorType> > 69c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath inverse() const 70c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath { 71c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath return diagonal().cwiseInverse(); 72c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath } 73c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath 747faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez inline const DiagonalWrapper<const CwiseUnaryOp<internal::scalar_multiple_op<Scalar>, const DiagonalVectorType> > 757faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez operator*(const Scalar& scalar) const 767faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez { 777faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez return diagonal() * scalar; 787faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez } 797faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez friend inline const DiagonalWrapper<const CwiseUnaryOp<internal::scalar_multiple_op<Scalar>, const DiagonalVectorType> > 807faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez operator*(const Scalar& scalar, const DiagonalBase& other) 817faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez { 827faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez return other.diagonal() * scalar; 837faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez } 847faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez 85c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath #ifdef EIGEN2_SUPPORT 86c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath template<typename OtherDerived> 87c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath bool isApprox(const DiagonalBase<OtherDerived>& other, typename NumTraits<Scalar>::Real precision = NumTraits<Scalar>::dummy_precision()) const 88c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath { 89c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath return diagonal().isApprox(other.diagonal(), precision); 90c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath } 91c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath template<typename OtherDerived> 92c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath bool isApprox(const MatrixBase<OtherDerived>& other, typename NumTraits<Scalar>::Real precision = NumTraits<Scalar>::dummy_precision()) const 93c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath { 94c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath return toDenseMatrix().isApprox(other, precision); 95c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath } 96c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath #endif 97c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath}; 98c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath 99c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathtemplate<typename Derived> 100c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathtemplate<typename DenseDerived> 101c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathvoid DiagonalBase<Derived>::evalTo(MatrixBase<DenseDerived> &other) const 102c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath{ 103c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath other.setZero(); 104c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath other.diagonal() = diagonal(); 105c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath} 106c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath#endif 107c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath 108c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath/** \class DiagonalMatrix 109c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath * \ingroup Core_Module 110c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath * 111c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath * \brief Represents a diagonal matrix with its storage 112c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath * 113c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath * \param _Scalar the type of coefficients 114c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath * \param SizeAtCompileTime the dimension of the matrix, or Dynamic 115c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath * \param MaxSizeAtCompileTime the dimension of the matrix, or Dynamic. This parameter is optional and defaults 116c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath * to SizeAtCompileTime. Most of the time, you do not need to specify it. 117c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath * 118c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath * \sa class DiagonalWrapper 119c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath */ 120c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath 121c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathnamespace internal { 122c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathtemplate<typename _Scalar, int SizeAtCompileTime, int MaxSizeAtCompileTime> 123c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathstruct traits<DiagonalMatrix<_Scalar,SizeAtCompileTime,MaxSizeAtCompileTime> > 124c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath : traits<Matrix<_Scalar,SizeAtCompileTime,SizeAtCompileTime,0,MaxSizeAtCompileTime,MaxSizeAtCompileTime> > 125c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath{ 126c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath typedef Matrix<_Scalar,SizeAtCompileTime,1,0,MaxSizeAtCompileTime,1> DiagonalVectorType; 127c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath typedef Dense StorageKind; 128c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath typedef DenseIndex Index; 129c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath enum { 130c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath Flags = LvalueBit 131c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath }; 132c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath}; 133c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath} 134c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathtemplate<typename _Scalar, int SizeAtCompileTime, int MaxSizeAtCompileTime> 135c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathclass DiagonalMatrix 136c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath : public DiagonalBase<DiagonalMatrix<_Scalar,SizeAtCompileTime,MaxSizeAtCompileTime> > 137c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath{ 138c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath public: 139c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath #ifndef EIGEN_PARSED_BY_DOXYGEN 140c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath typedef typename internal::traits<DiagonalMatrix>::DiagonalVectorType DiagonalVectorType; 141c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath typedef const DiagonalMatrix& Nested; 142c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath typedef _Scalar Scalar; 143c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath typedef typename internal::traits<DiagonalMatrix>::StorageKind StorageKind; 144c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath typedef typename internal::traits<DiagonalMatrix>::Index Index; 145c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath #endif 146c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath 147c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath protected: 148c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath 149c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath DiagonalVectorType m_diagonal; 150c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath 151c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath public: 152c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath 153c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath /** const version of diagonal(). */ 154c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath inline const DiagonalVectorType& diagonal() const { return m_diagonal; } 155c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath /** \returns a reference to the stored vector of diagonal coefficients. */ 156c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath inline DiagonalVectorType& diagonal() { return m_diagonal; } 157c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath 158c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath /** Default constructor without initialization */ 159c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath inline DiagonalMatrix() {} 160c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath 161c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath /** Constructs a diagonal matrix with given dimension */ 162c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath inline DiagonalMatrix(Index dim) : m_diagonal(dim) {} 163c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath 164c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath /** 2D constructor. */ 165c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath inline DiagonalMatrix(const Scalar& x, const Scalar& y) : m_diagonal(x,y) {} 166c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath 167c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath /** 3D constructor. */ 168c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath inline DiagonalMatrix(const Scalar& x, const Scalar& y, const Scalar& z) : m_diagonal(x,y,z) {} 169c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath 170c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath /** Copy constructor. */ 171c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath template<typename OtherDerived> 172c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath inline DiagonalMatrix(const DiagonalBase<OtherDerived>& other) : m_diagonal(other.diagonal()) {} 173c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath 174c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath #ifndef EIGEN_PARSED_BY_DOXYGEN 175c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath /** copy constructor. prevent a default copy constructor from hiding the other templated constructor */ 176c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath inline DiagonalMatrix(const DiagonalMatrix& other) : m_diagonal(other.diagonal()) {} 177c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath #endif 178c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath 179c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath /** generic constructor from expression of the diagonal coefficients */ 180c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath template<typename OtherDerived> 181c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath explicit inline DiagonalMatrix(const MatrixBase<OtherDerived>& other) : m_diagonal(other) 182c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath {} 183c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath 184c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath /** Copy operator. */ 185c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath template<typename OtherDerived> 186c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath DiagonalMatrix& operator=(const DiagonalBase<OtherDerived>& other) 187c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath { 188c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath m_diagonal = other.diagonal(); 189c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath return *this; 190c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath } 191c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath 192c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath #ifndef EIGEN_PARSED_BY_DOXYGEN 193c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath /** This is a special case of the templated operator=. Its purpose is to 194c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath * prevent a default operator= from hiding the templated operator=. 195c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath */ 196c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath DiagonalMatrix& operator=(const DiagonalMatrix& other) 197c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath { 198c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath m_diagonal = other.diagonal(); 199c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath return *this; 200c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath } 201c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath #endif 202c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath 203c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath /** Resizes to given size. */ 204c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath inline void resize(Index size) { m_diagonal.resize(size); } 205c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath /** Sets all coefficients to zero. */ 206c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath inline void setZero() { m_diagonal.setZero(); } 207c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath /** Resizes and sets all coefficients to zero. */ 208c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath inline void setZero(Index size) { m_diagonal.setZero(size); } 209c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath /** Sets this matrix to be the identity matrix of the current size. */ 210c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath inline void setIdentity() { m_diagonal.setOnes(); } 211c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath /** Sets this matrix to be the identity matrix of the given size. */ 212c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath inline void setIdentity(Index size) { m_diagonal.setOnes(size); } 213c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath}; 214c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath 215c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath/** \class DiagonalWrapper 216c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath * \ingroup Core_Module 217c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath * 218c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath * \brief Expression of a diagonal matrix 219c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath * 220c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath * \param _DiagonalVectorType the type of the vector of diagonal coefficients 221c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath * 222c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath * This class is an expression of a diagonal matrix, but not storing its own vector of diagonal coefficients, 223c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath * instead wrapping an existing vector expression. It is the return type of MatrixBase::asDiagonal() 224c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath * and most of the time this is the only way that it is used. 225c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath * 226c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath * \sa class DiagonalMatrix, class DiagonalBase, MatrixBase::asDiagonal() 227c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath */ 228c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath 229c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathnamespace internal { 230c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathtemplate<typename _DiagonalVectorType> 231c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathstruct traits<DiagonalWrapper<_DiagonalVectorType> > 232c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath{ 233c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath typedef _DiagonalVectorType DiagonalVectorType; 234c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath typedef typename DiagonalVectorType::Scalar Scalar; 235c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath typedef typename DiagonalVectorType::Index Index; 236c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath typedef typename DiagonalVectorType::StorageKind StorageKind; 237c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath enum { 238c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath RowsAtCompileTime = DiagonalVectorType::SizeAtCompileTime, 239c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath ColsAtCompileTime = DiagonalVectorType::SizeAtCompileTime, 240c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath MaxRowsAtCompileTime = DiagonalVectorType::SizeAtCompileTime, 241c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath MaxColsAtCompileTime = DiagonalVectorType::SizeAtCompileTime, 242c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath Flags = traits<DiagonalVectorType>::Flags & LvalueBit 243c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath }; 244c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath}; 245c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath} 246c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath 247c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathtemplate<typename _DiagonalVectorType> 248c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathclass DiagonalWrapper 249c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath : public DiagonalBase<DiagonalWrapper<_DiagonalVectorType> >, internal::no_assignment_operator 250c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath{ 251c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath public: 252c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath #ifndef EIGEN_PARSED_BY_DOXYGEN 253c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath typedef _DiagonalVectorType DiagonalVectorType; 254c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath typedef DiagonalWrapper Nested; 255c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath #endif 256c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath 257c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath /** Constructor from expression of diagonal coefficients to wrap. */ 2587faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez inline DiagonalWrapper(DiagonalVectorType& a_diagonal) : m_diagonal(a_diagonal) {} 259c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath 260c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath /** \returns a const reference to the wrapped expression of diagonal coefficients. */ 261c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath const DiagonalVectorType& diagonal() const { return m_diagonal; } 262c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath 263c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath protected: 264c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath typename DiagonalVectorType::Nested m_diagonal; 265c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath}; 266c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath 267c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath/** \returns a pseudo-expression of a diagonal matrix with *this as vector of diagonal coefficients 268c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath * 269c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath * \only_for_vectors 270c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath * 271c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath * Example: \include MatrixBase_asDiagonal.cpp 272c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath * Output: \verbinclude MatrixBase_asDiagonal.out 273c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath * 274c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath * \sa class DiagonalWrapper, class DiagonalMatrix, diagonal(), isDiagonal() 275c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath **/ 276c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathtemplate<typename Derived> 277c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathinline const DiagonalWrapper<const Derived> 278c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan KamathMatrixBase<Derived>::asDiagonal() const 279c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath{ 280c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath return derived(); 281c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath} 282c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath 283c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath/** \returns true if *this is approximately equal to a diagonal matrix, 284c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath * within the precision given by \a prec. 285c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath * 286c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath * Example: \include MatrixBase_isDiagonal.cpp 287c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath * Output: \verbinclude MatrixBase_isDiagonal.out 288c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath * 289c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath * \sa asDiagonal() 290c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath */ 291c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathtemplate<typename Derived> 2927faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandezbool MatrixBase<Derived>::isDiagonal(const RealScalar& prec) const 293c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath{ 2947faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez using std::abs; 295c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath if(cols() != rows()) return false; 296c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath RealScalar maxAbsOnDiagonal = static_cast<RealScalar>(-1); 297c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath for(Index j = 0; j < cols(); ++j) 298c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath { 2997faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez RealScalar absOnDiagonal = abs(coeff(j,j)); 300c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath if(absOnDiagonal > maxAbsOnDiagonal) maxAbsOnDiagonal = absOnDiagonal; 301c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath } 302c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath for(Index j = 0; j < cols(); ++j) 303c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath for(Index i = 0; i < j; ++i) 304c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath { 305c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath if(!internal::isMuchSmallerThan(coeff(i, j), maxAbsOnDiagonal, prec)) return false; 306c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath if(!internal::isMuchSmallerThan(coeff(j, i), maxAbsOnDiagonal, prec)) return false; 307c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath } 308c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath return true; 309c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath} 310c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath 311c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath} // end namespace Eigen 312c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath 313c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath#endif // EIGEN_DIAGONALMATRIX_H 314