1 // This file is part of Eigen, a lightweight C++ template library 2 // for linear algebra. 3 // 4 // Copyright (C) 2011 Gael Guennebaud <gael.guennebaud (at) inria.fr> 5 // Copyright (C) 2010 Daniel Lowengrub <lowdanie (at) gmail.com> 6 // 7 // This Source Code Form is subject to the terms of the Mozilla 8 // Public License v. 2.0. If a copy of the MPL was not distributed 9 // with this file, You can obtain one at http://mozilla.org/MPL/2.0/. 10 11 #ifndef EIGEN_SPARSEVIEW_H 12 #define EIGEN_SPARSEVIEW_H 13 14 namespace Eigen { 15 16 namespace internal { 17 18 template<typename MatrixType> 19 struct traits<SparseView<MatrixType> > : traits<MatrixType> 20 { 21 typedef typename MatrixType::Index Index; 22 typedef Sparse StorageKind; 23 enum { 24 Flags = int(traits<MatrixType>::Flags) & (RowMajorBit) 25 }; 26 }; 27 28 } // end namespace internal 29 30 template<typename MatrixType> 31 class SparseView : public SparseMatrixBase<SparseView<MatrixType> > 32 { 33 typedef typename MatrixType::Nested MatrixTypeNested; 34 typedef typename internal::remove_all<MatrixTypeNested>::type _MatrixTypeNested; 35 public: 36 EIGEN_SPARSE_PUBLIC_INTERFACE(SparseView) 37 38 SparseView(const MatrixType& mat, const Scalar& m_reference = Scalar(0), 39 typename NumTraits<Scalar>::Real m_epsilon = NumTraits<Scalar>::dummy_precision()) : 40 m_matrix(mat), m_reference(m_reference), m_epsilon(m_epsilon) {} 41 42 class InnerIterator; 43 44 inline Index rows() const { return m_matrix.rows(); } 45 inline Index cols() const { return m_matrix.cols(); } 46 47 inline Index innerSize() const { return m_matrix.innerSize(); } 48 inline Index outerSize() const { return m_matrix.outerSize(); } 49 50 protected: 51 MatrixTypeNested m_matrix; 52 Scalar m_reference; 53 typename NumTraits<Scalar>::Real m_epsilon; 54 }; 55 56 template<typename MatrixType> 57 class SparseView<MatrixType>::InnerIterator : public _MatrixTypeNested::InnerIterator 58 { 59 typedef typename SparseView::Index Index; 60 public: 61 typedef typename _MatrixTypeNested::InnerIterator IterBase; 62 InnerIterator(const SparseView& view, Index outer) : 63 IterBase(view.m_matrix, outer), m_view(view) 64 { 65 incrementToNonZero(); 66 } 67 68 EIGEN_STRONG_INLINE InnerIterator& operator++() 69 { 70 IterBase::operator++(); 71 incrementToNonZero(); 72 return *this; 73 } 74 75 using IterBase::value; 76 77 protected: 78 const SparseView& m_view; 79 80 private: 81 void incrementToNonZero() 82 { 83 while((bool(*this)) && internal::isMuchSmallerThan(value(), m_view.m_reference, m_view.m_epsilon)) 84 { 85 IterBase::operator++(); 86 } 87 } 88 }; 89 90 template<typename Derived> 91 const SparseView<Derived> MatrixBase<Derived>::sparseView(const Scalar& m_reference, 92 const typename NumTraits<Scalar>::Real& m_epsilon) const 93 { 94 return SparseView<Derived>(derived(), m_reference, m_epsilon); 95 } 96 97 } // end namespace Eigen 98 99 #endif 100