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; }
54 bool isCompressed()
const {
return true; }
58 inline const Scalar* valuePtr()
const {
return m_values; }
59 inline Scalar* valuePtr() {
return m_values; }
61 inline const Index* innerIndexPtr()
const {
return m_innerIndices; }
62 inline Index* innerIndexPtr() {
return m_innerIndices; }
64 inline const Index* outerIndexPtr()
const {
return m_outerIndex; }
65 inline Index* outerIndexPtr() {
return m_outerIndex; }
68 inline Scalar coeff(Index
row, Index
col)
const
70 const Index outer = IsRowMajor ? row :
col;
71 const Index inner = IsRowMajor ? col :
row;
73 Index start = m_outerIndex[outer];
74 Index end = m_outerIndex[outer+1];
77 else if (end>0 && inner==m_innerIndices[end-1])
78 return m_values[end-1];
82 const Index* r = std::lower_bound(&m_innerIndices[start],&m_innerIndices[end-1],inner);
83 const Index
id = r-&m_innerIndices[0];
84 return ((*r==inner) && (
id<end)) ? m_values[id] : Scalar(0);
87 inline Scalar& coeffRef(Index row, Index col)
89 const Index outer = IsRowMajor ? row :
col;
90 const Index inner = IsRowMajor ? col :
row;
92 Index start = m_outerIndex[outer];
93 Index end = m_outerIndex[outer+1];
94 eigen_assert(end>=start &&
"you probably called coeffRef on a non finalized matrix");
95 eigen_assert(end>start &&
"coeffRef cannot be called on a zero coefficient");
96 Index* r = std::lower_bound(&m_innerIndices[start],&m_innerIndices[end],inner);
97 const Index
id = r-&m_innerIndices[0];
98 eigen_assert((*r==inner) && (
id<end) &&
"coeffRef cannot be called on a zero coefficient");
103 class ReverseInnerIterator;
108 inline MappedSparseMatrix(Index rows, Index cols, Index nnz, Index* outerIndexPtr, Index* innerIndexPtr, Scalar* valuePtr)
109 : m_outerSize(IsRowMajor?rows:cols), m_innerSize(IsRowMajor?cols:rows), m_nnz(nnz), m_outerIndex(outerIndexPtr),
110 m_innerIndices(innerIndexPtr), m_values(valuePtr)
117 template<
typename Scalar,
int _Flags,
typename _Index>
118 class MappedSparseMatrix<Scalar,_Flags,_Index>::InnerIterator
121 InnerIterator(
const MappedSparseMatrix& mat, Index outer)
124 m_id(mat.outerIndexPtr()[outer]),
126 m_end(mat.outerIndexPtr()[outer+1])
129 inline InnerIterator& operator++() { m_id++;
return *
this; }
131 inline Scalar value()
const {
return m_matrix.valuePtr()[m_id]; }
132 inline Scalar& valueRef() {
return const_cast<Scalar&
>(m_matrix.valuePtr()[m_id]); }
134 inline Index index()
const {
return m_matrix.innerIndexPtr()[m_id]; }
135 inline Index
row()
const {
return IsRowMajor ? m_outer : index(); }
136 inline Index
col()
const {
return IsRowMajor ? index() : m_outer; }
138 inline operator bool()
const {
return (m_id < m_end) && (m_id>=m_start); }
141 const MappedSparseMatrix& m_matrix;
148 template<
typename Scalar,
int _Flags,
typename _Index>
149 class MappedSparseMatrix<Scalar,_Flags,_Index>::ReverseInnerIterator
152 ReverseInnerIterator(
const MappedSparseMatrix& mat, Index outer)
155 m_id(mat.outerIndexPtr()[outer+1]),
156 m_start(mat.outerIndexPtr()[outer]),
160 inline ReverseInnerIterator& operator--() { m_id--;
return *
this; }
162 inline Scalar value()
const {
return m_matrix.valuePtr()[m_id-1]; }
163 inline Scalar& valueRef() {
return const_cast<Scalar&
>(m_matrix.valuePtr()[m_id-1]); }
165 inline Index index()
const {
return m_matrix.innerIndexPtr()[m_id-1]; }
166 inline Index
row()
const {
return IsRowMajor ? m_outer : index(); }
167 inline Index
col()
const {
return IsRowMajor ? index() : m_outer; }
169 inline operator bool()
const {
return (m_id <= m_end) && (m_id>m_start); }
172 const MappedSparseMatrix& m_matrix;
181 #endif // EIGEN_MAPPED_SPARSEMATRIX_H
RowXpr row(Index i)
Definition: SparseMatrixBase.h:750
Index nonZeros() const
Definition: MappedSparseMatrix.h:106
~MappedSparseMatrix()
Definition: MappedSparseMatrix.h:114
Base class of any sparse matrices or sparse expressions.
Definition: ForwardDeclarations.h:239
Sparse matrix.
Definition: MappedSparseMatrix.h:31
ColXpr col(Index i)
Definition: SparseMatrixBase.h:733