• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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@inria.fr>
5 // Copyright (C) 2010 Daniel Lowengrub <lowdanie@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