10 #ifndef EIGEN_MAPPED_SPARSEMATRIX_H
11 #define EIGEN_MAPPED_SPARSEMATRIX_H
25 template<
typename _Scalar,
int _Flags,
typename _Index>
26 struct traits<MappedSparseMatrix<_Scalar, _Flags, _Index> > : traits<SparseMatrix<_Scalar, _Flags, _Index> >
30 template<
typename _Scalar,
int _Flags,
typename _Index>
36 enum { IsRowMajor = Base::IsRowMajor };
44 Index* m_innerIndices;
49 inline Index rows()
const {
return IsRowMajor ? m_outerSize : m_innerSize; }
50 inline Index cols()
const {
return IsRowMajor ? m_innerSize : m_outerSize; }
51 inline Index innerSize()
const {
return m_innerSize; }
52 inline Index outerSize()
const {
return m_outerSize; }
56 inline const Scalar* valuePtr()
const {
return m_values; }
57 inline Scalar* valuePtr() {
return m_values; }
59 inline const Index* innerIndexPtr()
const {
return m_innerIndices; }
60 inline Index* innerIndexPtr() {
return m_innerIndices; }
62 inline const Index* outerIndexPtr()
const {
return m_outerIndex; }
63 inline Index* outerIndexPtr() {
return m_outerIndex; }
66 inline Scalar coeff(Index
row, Index
col)
const
68 const Index outer = IsRowMajor ? row :
col;
69 const Index inner = IsRowMajor ? col :
row;
71 Index start = m_outerIndex[outer];
72 Index end = m_outerIndex[outer+1];
75 else if (end>0 && inner==m_innerIndices[end-1])
76 return m_values[end-1];
80 const Index* r = std::lower_bound(&m_innerIndices[start],&m_innerIndices[end-1],inner);
81 const Index
id = r-&m_innerIndices[0];
82 return ((*r==inner) && (
id<end)) ? m_values[id] : Scalar(0);
85 inline Scalar& coeffRef(Index row, Index col)
87 const Index outer = IsRowMajor ? row :
col;
88 const Index inner = IsRowMajor ? col :
row;
90 Index start = m_outerIndex[outer];
91 Index end = m_outerIndex[outer+1];
92 eigen_assert(end>=start &&
"you probably called coeffRef on a non finalized matrix");
93 eigen_assert(end>start &&
"coeffRef cannot be called on a zero coefficient");
94 Index* r = std::lower_bound(&m_innerIndices[start],&m_innerIndices[end],inner);
95 const Index
id = r-&m_innerIndices[0];
96 eigen_assert((*r==inner) && (
id<end) &&
"coeffRef cannot be called on a zero coefficient");
101 class ReverseInnerIterator;
106 inline MappedSparseMatrix(Index rows, Index cols, Index nnz, Index* outerIndexPtr, Index* innerIndexPtr, Scalar* valuePtr)
107 : m_outerSize(IsRowMajor?rows:cols), m_innerSize(IsRowMajor?cols:rows), m_nnz(nnz), m_outerIndex(outerIndexPtr),
108 m_innerIndices(innerIndexPtr), m_values(valuePtr)
115 template<
typename Scalar,
int _Flags,
typename _Index>
116 class MappedSparseMatrix<Scalar,_Flags,_Index>::InnerIterator
119 InnerIterator(
const MappedSparseMatrix& mat, Index outer)
122 m_id(mat.outerIndexPtr()[outer]),
124 m_end(mat.outerIndexPtr()[outer+1])
127 inline InnerIterator& operator++() { m_id++;
return *
this; }
129 inline Scalar value()
const {
return m_matrix.valuePtr()[m_id]; }
130 inline Scalar& valueRef() {
return const_cast<Scalar&
>(m_matrix.valuePtr()[m_id]); }
132 inline Index index()
const {
return m_matrix.innerIndexPtr()[m_id]; }
133 inline Index
row()
const {
return IsRowMajor ? m_outer : index(); }
134 inline Index
col()
const {
return IsRowMajor ? index() : m_outer; }
136 inline operator bool()
const {
return (m_id < m_end) && (m_id>=m_start); }
139 const MappedSparseMatrix& m_matrix;
146 template<
typename Scalar,
int _Flags,
typename _Index>
147 class MappedSparseMatrix<Scalar,_Flags,_Index>::ReverseInnerIterator
150 ReverseInnerIterator(
const MappedSparseMatrix& mat, Index outer)
153 m_id(mat.outerIndexPtr()[outer+1]),
154 m_start(mat.outerIndexPtr()[outer]),
158 inline ReverseInnerIterator& operator--() { m_id--;
return *
this; }
160 inline Scalar value()
const {
return m_matrix.valuePtr()[m_id-1]; }
161 inline Scalar& valueRef() {
return const_cast<Scalar&
>(m_matrix.valuePtr()[m_id-1]); }
163 inline Index index()
const {
return m_matrix.innerIndexPtr()[m_id-1]; }
164 inline Index
row()
const {
return IsRowMajor ? m_outer : index(); }
165 inline Index
col()
const {
return IsRowMajor ? index() : m_outer; }
167 inline operator bool()
const {
return (m_id <= m_end) && (m_id>m_start); }
170 const MappedSparseMatrix& m_matrix;
179 #endif // EIGEN_MAPPED_SPARSEMATRIX_H