diff options
author | Gael Guennebaud <g.gael@free.fr> | 2009-07-14 23:27:37 +0200 |
---|---|---|
committer | Gael Guennebaud <g.gael@free.fr> | 2009-07-14 23:27:37 +0200 |
commit | 587029a612df2a98a545702e90dc40feb7a62d3e (patch) | |
tree | 742dd8419c31d6bb665dd7a7efd95df5ddbf98bf /Eigen/src/Core | |
parent | 8120a5cecd982ed182d6e18b072fb9a95dc925dc (diff) |
started an implementation of BandMatrix: at least the read/write access
to the main/sub/super diagonals seems to work well.
Diffstat (limited to 'Eigen/src/Core')
-rw-r--r-- | Eigen/src/Core/BandMatrix.h | 154 | ||||
-rw-r--r-- | Eigen/src/Core/util/ForwardDeclarations.h | 2 |
2 files changed, 156 insertions, 0 deletions
diff --git a/Eigen/src/Core/BandMatrix.h b/Eigen/src/Core/BandMatrix.h new file mode 100644 index 000000000..03d17dac2 --- /dev/null +++ b/Eigen/src/Core/BandMatrix.h @@ -0,0 +1,154 @@ +// This file is part of Eigen, a lightweight C++ template library +// for linear algebra. +// +// Copyright (C) 2009 Gael Guennebaud <g.gael@free.fr> +// +// Eigen is free software; you can redistribute it and/or +// modify it under the terms of the GNU Lesser General Public +// License as published by the Free Software Foundation; either +// version 3 of the License, or (at your option) any later version. +// +// Alternatively, you can redistribute it and/or +// modify it under the terms of the GNU General Public License as +// published by the Free Software Foundation; either version 2 of +// the License, or (at your option) any later version. +// +// Eigen is distributed in the hope that it will be useful, but WITHOUT ANY +// WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS +// FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License or the +// GNU General Public License for more details. +// +// You should have received a copy of the GNU Lesser General Public +// License and a copy of the GNU General Public License along with +// Eigen. If not, see <http://www.gnu.org/licenses/>. + +#ifndef EIGEN_BANDMATRIX_H +#define EIGEN_BANDMATRIX_H + +/** \nonstableyet + * \class BandMatrix + * + * \brief + * + * \param + * + * \sa + */ +template<typename _Scalar, int Size, int Supers, int Subs, int Options> +struct ei_traits<BandMatrix<_Scalar,Size,Supers,Subs,Options> > +{ + typedef _Scalar Scalar; + enum { + CoeffReadCost = NumTraits<Scalar>::ReadCost, + RowsAtCompileTime = Size, + ColsAtCompileTime = Size, + MaxRowsAtCompileTime = Size, + MaxColsAtCompileTime = Size, + Flags = 0 + }; +}; + +template<typename _Scalar, int Size, int Supers, int Subs, int Options> +class BandMatrix : public MultiplierBase<BandMatrix<_Scalar,Supers,Subs,Options> > +{ + public: + + enum { + Flags = ei_traits<BandMatrix>::Flags, + CoeffReadCost = ei_traits<BandMatrix>::CoeffReadCost, + RowsAtCompileTime = ei_traits<BandMatrix>::RowsAtCompileTime, + ColsAtCompileTime = ei_traits<BandMatrix>::ColsAtCompileTime, + MaxRowsAtCompileTime = ei_traits<BandMatrix>::MaxRowsAtCompileTime, + MaxColsAtCompileTime = ei_traits<BandMatrix>::MaxColsAtCompileTime + }; + typedef typename ei_traits<BandMatrix>::Scalar Scalar; + typedef Matrix<Scalar,RowsAtCompileTime,ColsAtCompileTime> PlainMatrixType; + + protected: + enum { + DataSizeAtCompileTime = ((Size!=Dynamic) && (Supers!=Dynamic) && (Subs!=Dynamic)) + ? Size*(Supers+Subs+1) - (Supers*Supers+Subs*Subs)/2 + : Dynamic + }; + typedef Matrix<Scalar,DataSizeAtCompileTime,1> DataType; + + public: + +// inline BandMatrix() { } + + inline BandMatrix(int size=Size, int supers=Supers, int subs=Subs) + : m_data(size*(supers+subs+1) - (supers*supers+subs*subs)/2), + m_size(size), m_supers(supers), m_subs(subs) + { } + + inline int rows() const { return m_size.value(); } + inline int cols() const { return m_size.value(); } + + inline int supers() const { return m_supers.value(); } + inline int subs() const { return m_subs.value(); } + + inline VectorBlock<DataType,Size> diagonal() + { return VectorBlock<DataType,Size>(m_data,0,m_size.value()); } + + inline const VectorBlock<DataType,Size> diagonal() const + { return VectorBlock<DataType,Size>(m_data,0,m_size.value()); } + + template<int Index> + VectorBlock<DataType,Size==Dynamic?Dynamic:Size-(Index<0?-Index:Index)> + diagonal() + { + return VectorBlock<DataType,Size==Dynamic?Dynamic:Size-(Index<0?-Index:Index)> + (m_data,Index<0 ? subDiagIndex(-Index) : superDiagIndex(Index), m_size.value()-ei_abs(Index)); + } + + template<int Index> + const VectorBlock<DataType,Size==Dynamic?Dynamic:Size-(Index<0?-Index:Index)> + diagonal() const + { + return VectorBlock<DataType,Size==Dynamic?Dynamic:Size-(Index<0?-Index:Index)> + (m_data,Index<0 ? subDiagIndex(-Index) : superDiagIndex(Index), m_size.value()-ei_abs(Index)); + } + + inline VectorBlock<DataType,Dynamic> diagonal(int index) + { + ei_assert((index<0 && -index<=subs()) || (index>=0 && index<=supers())); + return VectorBlock<DataType,Dynamic>(m_data, + index<0 ? subDiagIndex(-index) : superDiagIndex(index), m_size.value()-ei_abs(index)); + } + const VectorBlock<DataType,Dynamic> diagonal(int index) const + { + ei_assert((index<0 && -index<=subs()) || (index>=0 && index<=supers())); + return VectorBlock<DataType,Dynamic>(m_data, + index<0 ? subDiagIndex(-index) : superDiagIndex(index), m_size.value()-ei_abs(index)); + } + +// inline VectorBlock<DataType,Size> subDiagonal() +// { return VectorBlock<DataType,Size>(m_data,0,m_size.value()); } + + PlainMatrixType toDense() const + { + PlainMatrixType res(rows(),cols()); + res.setZero(); + res.diagonal() = diagonal(); + for (int i=1; i<=supers();++i) + res.diagonal(i) = diagonal(i); + for (int i=1; i<=subs();++i) + res.diagonal(-i) = diagonal(-i); + return res; + } + + protected: + + inline int subDiagIndex(int i) const + { return m_size.value()*(m_supers.value()+i)-(ei_abs2(i-1) + ei_abs2(m_supers.value()))/2; } + + inline int superDiagIndex(int i) const + { return m_size.value()*i-ei_abs2(i-1)/2; } + + DataType m_data; + ei_int_if_dynamic<Size> m_size; + ei_int_if_dynamic<Supers> m_supers; + ei_int_if_dynamic<Subs> m_subs; +}; + +#endif // EIGEN_BANDMATRIX_H diff --git a/Eigen/src/Core/util/ForwardDeclarations.h b/Eigen/src/Core/util/ForwardDeclarations.h index 363972b60..9433a04cb 100644 --- a/Eigen/src/Core/util/ForwardDeclarations.h +++ b/Eigen/src/Core/util/ForwardDeclarations.h @@ -66,6 +66,8 @@ template<typename ExpressionType> class WithFormat; template<typename MatrixType> struct CommaInitializer; template<typename Functor, typename EvalType> class ReturnByValue; +template<typename _Scalar, int Size=Dynamic, int Supers=Dynamic, int Subs=Dynamic, int Options=0> class BandMatrix; + template<typename Lhs, typename Rhs> struct ei_product_mode; template<typename Lhs, typename Rhs, int ProductMode = ei_product_mode<Lhs,Rhs>::value> struct ProductReturnType; |