Go to the documentation of this file.00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011 #ifndef EIGEN_SPARSEVIEW_H
00012 #define EIGEN_SPARSEVIEW_H
00013
00014 namespace Eigen {
00015
00016 namespace internal {
00017
00018 template<typename MatrixType>
00019 struct traits<SparseView<MatrixType> > : traits<MatrixType>
00020 {
00021 typedef typename MatrixType::Index Index;
00022 typedef Sparse StorageKind;
00023 enum {
00024 Flags = int(traits<MatrixType>::Flags) & (RowMajorBit)
00025 };
00026 };
00027
00028 }
00029
00030 template<typename MatrixType>
00031 class SparseView : public SparseMatrixBase<SparseView<MatrixType> >
00032 {
00033 typedef typename MatrixType::Nested MatrixTypeNested;
00034 typedef typename internal::remove_all<MatrixTypeNested>::type _MatrixTypeNested;
00035 public:
00036 EIGEN_SPARSE_PUBLIC_INTERFACE(SparseView)
00037
00038 SparseView(const MatrixType& mat, const Scalar& m_reference = Scalar(0),
00039 typename NumTraits<Scalar>::Real m_epsilon = NumTraits<Scalar>::dummy_precision()) :
00040 m_matrix(mat), m_reference(m_reference), m_epsilon(m_epsilon) {}
00041
00042 class InnerIterator;
00043
00044 inline Index rows() const { return m_matrix.rows(); }
00045 inline Index cols() const { return m_matrix.cols(); }
00046
00047 inline Index innerSize() const { return m_matrix.innerSize(); }
00048 inline Index outerSize() const { return m_matrix.outerSize(); }
00049
00050 protected:
00051 MatrixTypeNested m_matrix;
00052 Scalar m_reference;
00053 typename NumTraits<Scalar>::Real m_epsilon;
00054 };
00055
00056 template<typename MatrixType>
00057 class SparseView<MatrixType>::InnerIterator : public _MatrixTypeNested::InnerIterator
00058 {
00059 typedef typename SparseView::Index Index;
00060 public:
00061 typedef typename _MatrixTypeNested::InnerIterator IterBase;
00062 InnerIterator(const SparseView& view, Index outer) :
00063 IterBase(view.m_matrix, outer), m_view(view)
00064 {
00065 incrementToNonZero();
00066 }
00067
00068 EIGEN_STRONG_INLINE InnerIterator& operator++()
00069 {
00070 IterBase::operator++();
00071 incrementToNonZero();
00072 return *this;
00073 }
00074
00075 using IterBase::value;
00076
00077 protected:
00078 const SparseView& m_view;
00079
00080 private:
00081 void incrementToNonZero()
00082 {
00083 while((bool(*this)) && internal::isMuchSmallerThan(value(), m_view.m_reference, m_view.m_epsilon))
00084 {
00085 IterBase::operator++();
00086 }
00087 }
00088 };
00089
00090 template<typename Derived>
00091 const SparseView<Derived> MatrixBase<Derived>::sparseView(const Scalar& m_reference,
00092 const typename NumTraits<Scalar>::Real& m_epsilon) const
00093 {
00094 return SparseView<Derived>(derived(), m_reference, m_epsilon);
00095 }
00096
00097 }
00098
00099 #endif