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// 6c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath// This Source Code Form is subject to the terms of the Mozilla 7c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath// Public License v. 2.0. If a copy of the MPL was not distributed 8c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath// with this file, You can obtain one at http://mozilla.org/MPL/2.0/. 9c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath 10c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath#ifndef EIGEN_BANDMATRIX_H 11c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath#define EIGEN_BANDMATRIX_H 12c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath 13c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathnamespace Eigen { 14c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath 15c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathnamespace internal { 16c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath 17c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathtemplate<typename Derived> 18c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathclass BandMatrixBase : public EigenBase<Derived> 19c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath{ 20c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath public: 21c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath 22c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath enum { 23c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath Flags = internal::traits<Derived>::Flags, 24c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath CoeffReadCost = internal::traits<Derived>::CoeffReadCost, 25c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath RowsAtCompileTime = internal::traits<Derived>::RowsAtCompileTime, 26c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath ColsAtCompileTime = internal::traits<Derived>::ColsAtCompileTime, 27c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath MaxRowsAtCompileTime = internal::traits<Derived>::MaxRowsAtCompileTime, 28c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath MaxColsAtCompileTime = internal::traits<Derived>::MaxColsAtCompileTime, 29c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath Supers = internal::traits<Derived>::Supers, 30c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath Subs = internal::traits<Derived>::Subs, 31c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath Options = internal::traits<Derived>::Options 32c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath }; 33c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath typedef typename internal::traits<Derived>::Scalar Scalar; 34c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath typedef Matrix<Scalar,RowsAtCompileTime,ColsAtCompileTime> DenseMatrixType; 35c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath typedef typename DenseMatrixType::Index Index; 36c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath typedef typename internal::traits<Derived>::CoefficientsType CoefficientsType; 37c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath typedef EigenBase<Derived> Base; 38c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath 39c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath protected: 40c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath enum { 41c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath DataRowsAtCompileTime = ((Supers!=Dynamic) && (Subs!=Dynamic)) 42c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath ? 1 + Supers + Subs 43c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath : Dynamic, 44c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath SizeAtCompileTime = EIGEN_SIZE_MIN_PREFER_DYNAMIC(RowsAtCompileTime,ColsAtCompileTime) 45c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath }; 46c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath 47c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath public: 48c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath 49c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath using Base::derived; 50c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath using Base::rows; 51c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath using Base::cols; 52c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath 53c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath /** \returns the number of super diagonals */ 54c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath inline Index supers() const { return derived().supers(); } 55c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath 56c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath /** \returns the number of sub diagonals */ 57c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath inline Index subs() const { return derived().subs(); } 58c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath 59c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath /** \returns an expression of the underlying coefficient matrix */ 60c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath inline const CoefficientsType& coeffs() const { return derived().coeffs(); } 61c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath 62c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath /** \returns an expression of the underlying coefficient matrix */ 63c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath inline CoefficientsType& coeffs() { return derived().coeffs(); } 64c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath 65c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath /** \returns a vector expression of the \a i -th column, 66c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath * only the meaningful part is returned. 67c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath * \warning the internal storage must be column major. */ 68c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath inline Block<CoefficientsType,Dynamic,1> col(Index i) 69c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath { 70c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath EIGEN_STATIC_ASSERT((Options&RowMajor)==0,THIS_METHOD_IS_ONLY_FOR_COLUMN_MAJOR_MATRICES); 71c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath Index start = 0; 72c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath Index len = coeffs().rows(); 73c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath if (i<=supers()) 74c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath { 75c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath start = supers()-i; 76c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath len = (std::min)(rows(),std::max<Index>(0,coeffs().rows() - (supers()-i))); 77c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath } 78c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath else if (i>=rows()-subs()) 79c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath len = std::max<Index>(0,coeffs().rows() - (i + 1 - rows() + subs())); 80c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath return Block<CoefficientsType,Dynamic,1>(coeffs(), start, i, len, 1); 81c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath } 82c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath 83c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath /** \returns a vector expression of the main diagonal */ 84c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath inline Block<CoefficientsType,1,SizeAtCompileTime> diagonal() 85c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath { return Block<CoefficientsType,1,SizeAtCompileTime>(coeffs(),supers(),0,1,(std::min)(rows(),cols())); } 86c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath 87c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath /** \returns a vector expression of the main diagonal (const version) */ 88c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath inline const Block<const CoefficientsType,1,SizeAtCompileTime> diagonal() const 89c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath { return Block<const CoefficientsType,1,SizeAtCompileTime>(coeffs(),supers(),0,1,(std::min)(rows(),cols())); } 90c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath 91c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath template<int Index> struct DiagonalIntReturnType { 92c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath enum { 93c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath ReturnOpposite = (Options&SelfAdjoint) && (((Index)>0 && Supers==0) || ((Index)<0 && Subs==0)), 94c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath Conjugate = ReturnOpposite && NumTraits<Scalar>::IsComplex, 95c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath ActualIndex = ReturnOpposite ? -Index : Index, 96c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath DiagonalSize = (RowsAtCompileTime==Dynamic || ColsAtCompileTime==Dynamic) 97c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath ? Dynamic 98c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath : (ActualIndex<0 99c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath ? EIGEN_SIZE_MIN_PREFER_DYNAMIC(ColsAtCompileTime, RowsAtCompileTime + ActualIndex) 100c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath : EIGEN_SIZE_MIN_PREFER_DYNAMIC(RowsAtCompileTime, ColsAtCompileTime - ActualIndex)) 101c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath }; 102c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath typedef Block<CoefficientsType,1, DiagonalSize> BuildType; 103c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath typedef typename internal::conditional<Conjugate, 104c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath CwiseUnaryOp<internal::scalar_conjugate_op<Scalar>,BuildType >, 105c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath BuildType>::type Type; 106c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath }; 107c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath 108c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath /** \returns a vector expression of the \a N -th sub or super diagonal */ 109c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath template<int N> inline typename DiagonalIntReturnType<N>::Type diagonal() 110c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath { 111c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath return typename DiagonalIntReturnType<N>::BuildType(coeffs(), supers()-N, (std::max)(0,N), 1, diagonalLength(N)); 112c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath } 113c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath 114c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath /** \returns a vector expression of the \a N -th sub or super diagonal */ 115c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath template<int N> inline const typename DiagonalIntReturnType<N>::Type diagonal() const 116c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath { 117c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath return typename DiagonalIntReturnType<N>::BuildType(coeffs(), supers()-N, (std::max)(0,N), 1, diagonalLength(N)); 118c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath } 119c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath 120c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath /** \returns a vector expression of the \a i -th sub or super diagonal */ 121c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath inline Block<CoefficientsType,1,Dynamic> diagonal(Index i) 122c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath { 123c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath eigen_assert((i<0 && -i<=subs()) || (i>=0 && i<=supers())); 124c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath return Block<CoefficientsType,1,Dynamic>(coeffs(), supers()-i, std::max<Index>(0,i), 1, diagonalLength(i)); 125c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath } 126c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath 127c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath /** \returns a vector expression of the \a i -th sub or super diagonal */ 128c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath inline const Block<const CoefficientsType,1,Dynamic> diagonal(Index i) const 129c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath { 130c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath eigen_assert((i<0 && -i<=subs()) || (i>=0 && i<=supers())); 131c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath return Block<const CoefficientsType,1,Dynamic>(coeffs(), supers()-i, std::max<Index>(0,i), 1, diagonalLength(i)); 132c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath } 133c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath 134c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath template<typename Dest> inline void evalTo(Dest& dst) const 135c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath { 136c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath dst.resize(rows(),cols()); 137c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath dst.setZero(); 138c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath dst.diagonal() = diagonal(); 139c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath for (Index i=1; i<=supers();++i) 140c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath dst.diagonal(i) = diagonal(i); 141c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath for (Index i=1; i<=subs();++i) 142c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath dst.diagonal(-i) = diagonal(-i); 143c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath } 144c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath 145c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath DenseMatrixType toDenseMatrix() const 146c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath { 147c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath DenseMatrixType res(rows(),cols()); 148c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath evalTo(res); 149c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath return res; 150c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath } 151c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath 152c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath protected: 153c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath 154c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath inline Index diagonalLength(Index i) const 155c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath { return i<0 ? (std::min)(cols(),rows()+i) : (std::min)(rows(),cols()-i); } 156c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath}; 157c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath 158c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath/** 159c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath * \class BandMatrix 160c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath * \ingroup Core_Module 161c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath * 162c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath * \brief Represents a rectangular matrix with a banded storage 163c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath * 164c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath * \param _Scalar Numeric type, i.e. float, double, int 165c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath * \param Rows Number of rows, or \b Dynamic 166c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath * \param Cols Number of columns, or \b Dynamic 167c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath * \param Supers Number of super diagonal 168c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath * \param Subs Number of sub diagonal 169c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath * \param _Options A combination of either \b #RowMajor or \b #ColMajor, and of \b #SelfAdjoint 170c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath * The former controls \ref TopicStorageOrders "storage order", and defaults to 171c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath * column-major. The latter controls whether the matrix represents a selfadjoint 172c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath * matrix in which case either Supers of Subs have to be null. 173c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath * 174c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath * \sa class TridiagonalMatrix 175c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath */ 176c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath 177c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathtemplate<typename _Scalar, int _Rows, int _Cols, int _Supers, int _Subs, int _Options> 178c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathstruct traits<BandMatrix<_Scalar,_Rows,_Cols,_Supers,_Subs,_Options> > 179c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath{ 180c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath typedef _Scalar Scalar; 181c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath typedef Dense StorageKind; 182c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath typedef DenseIndex Index; 183c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath enum { 184c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath CoeffReadCost = NumTraits<Scalar>::ReadCost, 185c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath RowsAtCompileTime = _Rows, 186c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath ColsAtCompileTime = _Cols, 187c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath MaxRowsAtCompileTime = _Rows, 188c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath MaxColsAtCompileTime = _Cols, 189c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath Flags = LvalueBit, 190c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath Supers = _Supers, 191c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath Subs = _Subs, 192c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath Options = _Options, 193c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath DataRowsAtCompileTime = ((Supers!=Dynamic) && (Subs!=Dynamic)) ? 1 + Supers + Subs : Dynamic 194c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath }; 195c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath typedef Matrix<Scalar,DataRowsAtCompileTime,ColsAtCompileTime,Options&RowMajor?RowMajor:ColMajor> CoefficientsType; 196c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath}; 197c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath 198c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathtemplate<typename _Scalar, int Rows, int Cols, int Supers, int Subs, int Options> 199c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathclass BandMatrix : public BandMatrixBase<BandMatrix<_Scalar,Rows,Cols,Supers,Subs,Options> > 200c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath{ 201c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath public: 202c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath 203c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath typedef typename internal::traits<BandMatrix>::Scalar Scalar; 204c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath typedef typename internal::traits<BandMatrix>::Index Index; 205c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath typedef typename internal::traits<BandMatrix>::CoefficientsType CoefficientsType; 206c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath 207c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath inline BandMatrix(Index rows=Rows, Index cols=Cols, Index supers=Supers, Index subs=Subs) 208c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath : m_coeffs(1+supers+subs,cols), 209c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath m_rows(rows), m_supers(supers), m_subs(subs) 210c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath { 211c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath } 212c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath 213c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath /** \returns the number of columns */ 214c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath inline Index rows() const { return m_rows.value(); } 215c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath 216c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath /** \returns the number of rows */ 217c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath inline Index cols() const { return m_coeffs.cols(); } 218c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath 219c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath /** \returns the number of super diagonals */ 220c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath inline Index supers() const { return m_supers.value(); } 221c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath 222c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath /** \returns the number of sub diagonals */ 223c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath inline Index subs() const { return m_subs.value(); } 224c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath 225c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath inline const CoefficientsType& coeffs() const { return m_coeffs; } 226c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath inline CoefficientsType& coeffs() { return m_coeffs; } 227c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath 228c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath protected: 229c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath 230c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath CoefficientsType m_coeffs; 231c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath internal::variable_if_dynamic<Index, Rows> m_rows; 232c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath internal::variable_if_dynamic<Index, Supers> m_supers; 233c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath internal::variable_if_dynamic<Index, Subs> m_subs; 234c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath}; 235c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath 236c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathtemplate<typename _CoefficientsType,int _Rows, int _Cols, int _Supers, int _Subs,int _Options> 237c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathclass BandMatrixWrapper; 238c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath 239c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathtemplate<typename _CoefficientsType,int _Rows, int _Cols, int _Supers, int _Subs,int _Options> 240c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathstruct traits<BandMatrixWrapper<_CoefficientsType,_Rows,_Cols,_Supers,_Subs,_Options> > 241c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath{ 242c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath typedef typename _CoefficientsType::Scalar Scalar; 243c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath typedef typename _CoefficientsType::StorageKind StorageKind; 244c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath typedef typename _CoefficientsType::Index Index; 245c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath enum { 246c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath CoeffReadCost = internal::traits<_CoefficientsType>::CoeffReadCost, 247c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath RowsAtCompileTime = _Rows, 248c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath ColsAtCompileTime = _Cols, 249c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath MaxRowsAtCompileTime = _Rows, 250c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath MaxColsAtCompileTime = _Cols, 251c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath Flags = LvalueBit, 252c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath Supers = _Supers, 253c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath Subs = _Subs, 254c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath Options = _Options, 255c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath DataRowsAtCompileTime = ((Supers!=Dynamic) && (Subs!=Dynamic)) ? 1 + Supers + Subs : Dynamic 256c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath }; 257c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath typedef _CoefficientsType CoefficientsType; 258c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath}; 259c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath 260c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathtemplate<typename _CoefficientsType,int _Rows, int _Cols, int _Supers, int _Subs,int _Options> 261c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathclass BandMatrixWrapper : public BandMatrixBase<BandMatrixWrapper<_CoefficientsType,_Rows,_Cols,_Supers,_Subs,_Options> > 262c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath{ 263c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath public: 264c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath 265c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath typedef typename internal::traits<BandMatrixWrapper>::Scalar Scalar; 266c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath typedef typename internal::traits<BandMatrixWrapper>::CoefficientsType CoefficientsType; 267c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath typedef typename internal::traits<BandMatrixWrapper>::Index Index; 268c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath 269c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath inline BandMatrixWrapper(const CoefficientsType& coeffs, Index rows=_Rows, Index cols=_Cols, Index supers=_Supers, Index subs=_Subs) 270c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath : m_coeffs(coeffs), 271c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath m_rows(rows), m_supers(supers), m_subs(subs) 272c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath { 273c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath EIGEN_UNUSED_VARIABLE(cols); 274c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath //internal::assert(coeffs.cols()==cols() && (supers()+subs()+1)==coeffs.rows()); 275c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath } 276c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath 277c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath /** \returns the number of columns */ 278c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath inline Index rows() const { return m_rows.value(); } 279c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath 280c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath /** \returns the number of rows */ 281c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath inline Index cols() const { return m_coeffs.cols(); } 282c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath 283c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath /** \returns the number of super diagonals */ 284c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath inline Index supers() const { return m_supers.value(); } 285c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath 286c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath /** \returns the number of sub diagonals */ 287c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath inline Index subs() const { return m_subs.value(); } 288c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath 289c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath inline const CoefficientsType& coeffs() const { return m_coeffs; } 290c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath 291c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath protected: 292c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath 293c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath const CoefficientsType& m_coeffs; 294c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath internal::variable_if_dynamic<Index, _Rows> m_rows; 295c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath internal::variable_if_dynamic<Index, _Supers> m_supers; 296c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath internal::variable_if_dynamic<Index, _Subs> m_subs; 297c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath}; 298c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath 299c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath/** 300c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath * \class TridiagonalMatrix 301c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath * \ingroup Core_Module 302c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath * 303c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath * \brief Represents a tridiagonal matrix with a compact banded storage 304c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath * 305c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath * \param _Scalar Numeric type, i.e. float, double, int 306c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath * \param Size Number of rows and cols, or \b Dynamic 307c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath * \param _Options Can be 0 or \b SelfAdjoint 308c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath * 309c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath * \sa class BandMatrix 310c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath */ 311c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathtemplate<typename Scalar, int Size, int Options> 312c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathclass TridiagonalMatrix : public BandMatrix<Scalar,Size,Size,Options&SelfAdjoint?0:1,1,Options|RowMajor> 313c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath{ 314c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath typedef BandMatrix<Scalar,Size,Size,Options&SelfAdjoint?0:1,1,Options|RowMajor> Base; 315c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath typedef typename Base::Index Index; 316c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath public: 317c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath TridiagonalMatrix(Index size = Size) : Base(size,size,Options&SelfAdjoint?0:1,1) {} 318c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath 319c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath inline typename Base::template DiagonalIntReturnType<1>::Type super() 320c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath { return Base::template diagonal<1>(); } 321c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath inline const typename Base::template DiagonalIntReturnType<1>::Type super() const 322c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath { return Base::template diagonal<1>(); } 323c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath inline typename Base::template DiagonalIntReturnType<-1>::Type sub() 324c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath { return Base::template diagonal<-1>(); } 325c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath inline const typename Base::template DiagonalIntReturnType<-1>::Type sub() const 326c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath { return Base::template diagonal<-1>(); } 327c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath protected: 328c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath}; 329c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath 330c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath} // end namespace internal 331c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath 332c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath} // end namespace Eigen 333c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath 334c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath#endif // EIGEN_BANDMATRIX_H 335