diff options
author | Daniel Lowengrub <lowdanie@gmail.com> | 2010-06-14 02:16:46 +0300 |
---|---|---|
committer | Daniel Lowengrub <lowdanie@gmail.com> | 2010-06-14 02:16:46 +0300 |
commit | dcd39a96e16fd0ab919e1b35ec9fc61d3d9085ea (patch) | |
tree | dc980a22bffa4aa54cbed3c9bfeb54375038d007 | |
parent | 9e00697ccce3c51d00e3753764272756f458e323 (diff) |
added the SparseView class.
-rw-r--r-- | Eigen/Sparse | 1 | ||||
-rw-r--r-- | Eigen/src/Core/MatrixBase.h | 2 | ||||
-rw-r--r-- | Eigen/src/Core/util/ForwardDeclarations.h | 1 | ||||
-rw-r--r-- | Eigen/src/Sparse/SparseUtil.h | 2 | ||||
-rw-r--r-- | Eigen/src/Sparse/SparseView.h | 95 |
5 files changed, 100 insertions, 1 deletions
diff --git a/Eigen/Sparse b/Eigen/Sparse index f027d3e6c..bca1c4ceb 100644 --- a/Eigen/Sparse +++ b/Eigen/Sparse @@ -111,6 +111,7 @@ struct Sparse {}; #include "src/Sparse/SparseLLT.h" #include "src/Sparse/SparseLDLT.h" #include "src/Sparse/SparseLU.h" +#include "src/Sparse/SparseView.h" #ifdef EIGEN_CHOLMOD_SUPPORT # include "src/Sparse/CholmodSupport.h" diff --git a/Eigen/src/Core/MatrixBase.h b/Eigen/src/Core/MatrixBase.h index cc35800bf..1829ece7a 100644 --- a/Eigen/src/Core/MatrixBase.h +++ b/Eigen/src/Core/MatrixBase.h @@ -215,6 +215,8 @@ template<typename Derived> class MatrixBase template<unsigned int UpLo> SelfAdjointView<Derived, UpLo> selfadjointView(); template<unsigned int UpLo> const SelfAdjointView<Derived, UpLo> selfadjointView() const; + const SparseView<Derived> sparseView(const Scalar m_reference = Scalar(0), + typename NumTraits<Scalar>::Real m_epsilon = NumTraits<Scalar>::dummy_precision()) const; static const IdentityReturnType Identity(); static const IdentityReturnType Identity(Index rows, Index cols); static const BasisReturnType Unit(Index size, Index i); diff --git a/Eigen/src/Core/util/ForwardDeclarations.h b/Eigen/src/Core/util/ForwardDeclarations.h index 6a9a7941c..4c113e9cc 100644 --- a/Eigen/src/Core/util/ForwardDeclarations.h +++ b/Eigen/src/Core/util/ForwardDeclarations.h @@ -86,6 +86,7 @@ template<typename MatrixType, int MapOptions=Unaligned, typename StrideType = St template<typename Derived> class TriangularBase; template<typename MatrixType, unsigned int Mode> class TriangularView; template<typename MatrixType, unsigned int Mode> class SelfAdjointView; +template<typename MatrixType> class SparseView; template<typename ExpressionType> class WithFormat; template<typename MatrixType> struct CommaInitializer; template<typename Derived> class ReturnByValue; diff --git a/Eigen/src/Sparse/SparseUtil.h b/Eigen/src/Sparse/SparseUtil.h index f780f4087..deaf70bc8 100644 --- a/Eigen/src/Sparse/SparseUtil.h +++ b/Eigen/src/Sparse/SparseUtil.h @@ -114,7 +114,7 @@ template<typename MatrixType, int Size> class SparseInnerVectorSet; template<typename MatrixType, int Mode> class SparseTriangularView; template<typename MatrixType, unsigned int UpLo> class SparseSelfAdjointView; template<typename Lhs, typename Rhs> class SparseDiagonalProduct; - +template<typename MatrixType> class SparseView; template<typename Lhs, typename Rhs> class SparseProduct; template<typename Lhs, typename Rhs> class SparseTimeDenseProduct; diff --git a/Eigen/src/Sparse/SparseView.h b/Eigen/src/Sparse/SparseView.h new file mode 100644 index 000000000..32678b9ec --- /dev/null +++ b/Eigen/src/Sparse/SparseView.h @@ -0,0 +1,95 @@ +// This file is part of Eigen, a lightweight C++ template library +// for linear algebra. +// +// Copyright (C) 2010 Gael Guennebaud <g.gael@free.fr> +// Copyright (C) 2010 Daniel Lowengrub <lowdanie@gmail.com> +// +// 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_SPARSEVIEW_H +#define EIGEN_SPARSEVIEW_H + +template<typename MatrixType> +struct ei_traits<SparseView<MatrixType> > : ei_traits<MatrixType> {}; + +template<typename MatrixType> +class SparseView : public SparseMatrixBase<SparseView<MatrixType> > +{ +public: + EIGEN_SPARSE_PUBLIC_INTERFACE(SparseView); + + SparseView(const MatrixType& mat, const Scalar m_reference = Scalar(0), + typename NumTraits<Scalar>::Real m_epsilon = NumTraits<Scalar>::dummy_precision()) : + m_matrix(mat), m_reference(m_reference), m_epsilon(m_epsilon) {} + class InnerIterator; + + inline Index rows() const { return m_matrix.rows(); } + inline Index cols() const { return m_matrix.cols(); } + + inline Index innerSize() const { return m_matrix.innerSize(); } + inline Index outerSize() const { return m_matrix.outerSize(); } + +protected: + const typename MatrixType::Nested m_matrix; + Scalar m_reference; + typename NumTraits<Scalar>::Real m_epsilon; +}; + +template<typename MatrixType> +class SparseView<MatrixType>::InnerIterator : public MatrixType::InnerIterator +{ +public: + typedef typename MatrixType::InnerIterator IterBase; + InnerIterator(const SparseView& view, Index outer) : + DenseBase<MatrixType>::InnerIterator(view.m_matrix, outer), m_view(view) + { + incrementToNonZero(); + } + + EIGEN_STRONG_INLINE InnerIterator& operator++() + { + IterBase::operator++(); + incrementToNonZero(); + return *this; + } + + using IterBase::value; + +protected: + const SparseView& m_view; + +private: + void incrementToNonZero() + { + while(ei_isMuchSmallerThan(value(), m_view.m_reference, m_view.m_epsilon) && (bool(*this))) + { + IterBase::operator++(); + } + } +}; + +template<typename Derived> +const SparseView<Derived> MatrixBase<Derived>::sparseView(const Scalar m_reference, + typename NumTraits<Scalar>::Real m_epsilon) const +{ + return SparseView<Derived>(derived(), m_reference, m_epsilon); +} + +#endif |