11 #ifndef EIGEN_SPARSEVIEW_H 12 #define EIGEN_SPARSEVIEW_H 18 template<
typename MatrixType>
19 struct traits<SparseView<MatrixType> > : traits<MatrixType>
21 typedef typename MatrixType::StorageIndex StorageIndex;
22 typedef Sparse StorageKind;
24 Flags = int(traits<MatrixType>::Flags) & (
RowMajorBit)
30 template<
typename MatrixType>
31 class SparseView :
public SparseMatrixBase<SparseView<MatrixType> >
33 typedef typename MatrixType::Nested MatrixTypeNested;
34 typedef typename internal::remove_all<MatrixTypeNested>::type _MatrixTypeNested;
35 typedef SparseMatrixBase<SparseView > Base;
37 EIGEN_SPARSE_PUBLIC_INTERFACE(SparseView)
38 typedef typename
internal::remove_all<MatrixType>::type NestedExpression;
40 explicit SparseView(const MatrixType& mat, const Scalar& reference = Scalar(0),
41 RealScalar epsilon = NumTraits<Scalar>::dummy_precision())
42 : m_matrix(mat), m_reference(reference), m_epsilon(epsilon) {}
44 inline Index rows()
const {
return m_matrix.rows(); }
45 inline Index cols()
const {
return m_matrix.cols(); }
47 inline Index innerSize()
const {
return m_matrix.innerSize(); }
48 inline Index outerSize()
const {
return m_matrix.outerSize(); }
51 const typename internal::remove_all<MatrixTypeNested>::type&
52 nestedExpression()
const {
return m_matrix; }
54 Scalar reference()
const {
return m_reference; }
55 RealScalar epsilon()
const {
return m_epsilon; }
58 MatrixTypeNested m_matrix;
69 template<
typename ArgType>
70 struct unary_evaluator<SparseView<ArgType>, IteratorBased>
71 :
public evaluator_base<SparseView<ArgType> >
73 typedef typename evaluator<ArgType>::InnerIterator EvalIterator;
75 typedef SparseView<ArgType> XprType;
77 class InnerIterator :
public EvalIterator
79 typedef typename XprType::Scalar Scalar;
82 EIGEN_STRONG_INLINE InnerIterator(
const unary_evaluator& sve, Index outer)
83 : EvalIterator(sve.m_argImpl,outer), m_view(sve.m_view)
88 EIGEN_STRONG_INLINE InnerIterator& operator++()
90 EvalIterator::operator++();
95 using EvalIterator::value;
98 const XprType &m_view;
101 void incrementToNonZero()
103 while((
bool(*
this)) && internal::isMuchSmallerThan(value(), m_view.reference(), m_view.epsilon()))
105 EvalIterator::operator++();
111 CoeffReadCost = evaluator<ArgType>::CoeffReadCost,
112 Flags = XprType::Flags
115 explicit unary_evaluator(
const XprType& xpr) : m_argImpl(xpr.nestedExpression()), m_view(xpr) {}
118 evaluator<ArgType> m_argImpl;
119 const XprType &m_view;
122 template<
typename ArgType>
123 struct unary_evaluator<SparseView<ArgType>, IndexBased>
124 :
public evaluator_base<SparseView<ArgType> >
127 typedef SparseView<ArgType> XprType;
130 typedef typename XprType::Scalar Scalar;
131 typedef typename XprType::StorageIndex StorageIndex;
138 EIGEN_STRONG_INLINE InnerIterator(
const unary_evaluator& sve, Index outer)
139 : m_sve(sve), m_inner(0), m_outer(outer), m_end(sve.m_view.innerSize())
141 incrementToNonZero();
144 EIGEN_STRONG_INLINE InnerIterator& operator++()
147 incrementToNonZero();
151 EIGEN_STRONG_INLINE Scalar value()
const 153 return (IsRowMajor) ? m_sve.m_argImpl.coeff(m_outer, m_inner)
154 : m_sve.m_argImpl.coeff(m_inner, m_outer);
157 EIGEN_STRONG_INLINE StorageIndex index()
const {
return m_inner; }
158 inline Index row()
const {
return IsRowMajor ? m_outer : index(); }
159 inline Index col()
const {
return IsRowMajor ? index() : m_outer; }
161 EIGEN_STRONG_INLINE
operator bool()
const {
return m_inner < m_end && m_inner>=0; }
164 const unary_evaluator &m_sve;
170 void incrementToNonZero()
172 while((
bool(*
this)) && internal::isMuchSmallerThan(value(), m_sve.m_view.reference(), m_sve.m_view.epsilon()))
180 CoeffReadCost = evaluator<ArgType>::CoeffReadCost,
181 Flags = XprType::Flags
184 explicit unary_evaluator(
const XprType& xpr) : m_argImpl(xpr.nestedExpression()), m_view(xpr) {}
187 evaluator<ArgType> m_argImpl;
188 const XprType &m_view;
193 template<
typename Derived>
194 const SparseView<Derived> MatrixBase<Derived>::sparseView(
const Scalar& reference,
195 const typename NumTraits<Scalar>::Real& epsilon)
const 197 return SparseView<Derived>(derived(), reference, epsilon);
212 template<
typename Derived>
213 const SparseView<Derived>
215 const RealScalar& epsilon)
const 217 return SparseView<Derived>(derived(), reference, epsilon);
const SparseView< Derived > pruned(const Scalar &reference=Scalar(0), const RealScalar &epsilon=NumTraits< Scalar >::dummy_precision()) const
Definition: SparseView.h:214
const unsigned int RowMajorBit
Definition: Constants.h:61
Definition: Eigen_Colamd.h:54