10 #ifndef EIGEN_SPARSE_COMPRESSED_BASE_H
11 #define EIGEN_SPARSE_COMPRESSED_BASE_H
15 template<
typename Derived>
class SparseCompressedBase;
19 template<
typename Derived>
20 struct traits<SparseCompressedBase<Derived> > : traits<Derived>
25 template<
typename Derived>
26 class SparseCompressedBase
27 :
public SparseMatrixBase<Derived>
30 typedef SparseMatrixBase<Derived> Base;
31 _EIGEN_SPARSE_PUBLIC_INTERFACE(SparseCompressedBase)
32 using Base::operator=;
33 using Base::IsRowMajor;
36 class ReverseInnerIterator;
39 typedef typename Base::IndexVector IndexVector;
46 inline Index nonZeros()
const
49 return outerIndexPtr()[
derived().outerSize()]-outerIndexPtr()[0];
53 return innerNonZeros().sum();
60 inline const Scalar* valuePtr()
const {
return derived().valuePtr(); }
64 inline Scalar* valuePtr() {
return derived().valuePtr(); }
69 inline const StorageIndex* innerIndexPtr()
const {
return derived().innerIndexPtr(); }
73 inline StorageIndex* innerIndexPtr() {
return derived().innerIndexPtr(); }
78 inline const StorageIndex* outerIndexPtr()
const {
return derived().outerIndexPtr(); }
82 inline StorageIndex* outerIndexPtr() {
return derived().outerIndexPtr(); }
87 inline const StorageIndex* innerNonZeroPtr()
const {
return derived().innerNonZeroPtr(); }
91 inline StorageIndex* innerNonZeroPtr() {
return derived().innerNonZeroPtr(); }
94 inline bool isCompressed()
const {
return innerNonZeroPtr()==0; }
98 template<
typename Derived>
99 class SparseCompressedBase<Derived>::InnerIterator
102 InnerIterator(
const SparseCompressedBase& mat, Index outer)
103 : m_values(mat.valuePtr()), m_indices(mat.innerIndexPtr()), m_outer(outer), m_id(mat.outerIndexPtr()[outer])
105 if(mat.isCompressed())
106 m_end = mat.outerIndexPtr()[outer+1];
108 m_end = m_id + mat.innerNonZeroPtr()[outer];
111 inline InnerIterator& operator++() { m_id++;
return *
this; }
113 inline const Scalar& value()
const {
return m_values[m_id]; }
114 inline Scalar& valueRef() {
return const_cast<Scalar&
>(m_values[m_id]); }
116 inline StorageIndex index()
const {
return m_indices[m_id]; }
117 inline Index outer()
const {
return m_outer; }
118 inline Index row()
const {
return IsRowMajor ? m_outer : index(); }
119 inline Index col()
const {
return IsRowMajor ? index() : m_outer; }
121 inline operator bool()
const {
return (m_id < m_end); }
124 const Scalar* m_values;
125 const StorageIndex* m_indices;
133 template<
typename T> InnerIterator(
const SparseMatrixBase<T>&, Index outer);
136 template<
typename Derived>
137 class SparseCompressedBase<Derived>::ReverseInnerIterator
140 ReverseInnerIterator(
const SparseCompressedBase& mat, Index outer)
141 : m_values(mat.valuePtr()), m_indices(mat.innerIndexPtr()), m_outer(outer), m_start(mat.outerIndexPtr()[outer])
143 if(mat.isCompressed())
144 m_id = mat.outerIndexPtr()[outer+1];
146 m_id = m_start + mat.innerNonZeroPtr()[outer];
149 inline ReverseInnerIterator& operator--() { --m_id;
return *
this; }
151 inline const Scalar& value()
const {
return m_values[m_id-1]; }
152 inline Scalar& valueRef() {
return const_cast<Scalar&
>(m_values[m_id-1]); }
154 inline StorageIndex index()
const {
return m_indices[m_id-1]; }
155 inline Index outer()
const {
return m_outer; }
156 inline Index row()
const {
return IsRowMajor ? m_outer : index(); }
157 inline Index col()
const {
return IsRowMajor ? index() : m_outer; }
159 inline operator bool()
const {
return (m_id > m_start); }
162 const Scalar* m_values;
163 const StorageIndex* m_indices;
171 template<
typename Derived>
172 struct evaluator<SparseCompressedBase<Derived> >
173 : evaluator_base<Derived>
175 typedef typename Derived::Scalar Scalar;
176 typedef typename Derived::InnerIterator InnerIterator;
177 typedef typename Derived::ReverseInnerIterator ReverseInnerIterator;
180 CoeffReadCost = NumTraits<Scalar>::ReadCost,
181 Flags = Derived::Flags
184 evaluator() : m_matrix(0) {}
185 explicit evaluator(
const Derived &mat) : m_matrix(&mat) {}
187 inline Index nonZerosEstimate()
const {
188 return m_matrix->nonZeros();
191 operator Derived&() {
return m_matrix->const_cast_derived(); }
192 operator const Derived&()
const {
return *m_matrix; }
194 typedef typename DenseCoeffsBase<Derived,ReadOnlyAccessors>::CoeffReturnType CoeffReturnType;
195 Scalar coeff(Index row, Index col)
const
196 {
return m_matrix->coeff(row,col); }
198 Scalar& coeffRef(Index row, Index col)
200 eigen_internal_assert(row>=0 && row<m_matrix->rows() && col>=0 && col<m_matrix->cols());
202 const Index outer = Derived::IsRowMajor ? row : col;
203 const Index inner = Derived::IsRowMajor ? col : row;
205 Index start = m_matrix->outerIndexPtr()[outer];
206 Index end = m_matrix->isCompressed() ? m_matrix->outerIndexPtr()[outer+1] : m_matrix->outerIndexPtr()[outer] + m_matrix->innerNonZeroPtr()[outer];
207 eigen_assert(end>start &&
"you are using a non finalized sparse matrix or written coefficient does not exist");
208 const Index p = std::lower_bound(m_matrix->innerIndexPtr()+start, m_matrix->innerIndexPtr()+end,inner)
209 - m_matrix->innerIndexPtr();
210 eigen_assert((p<end) && (m_matrix->innerIndexPtr()[p]==inner) &&
"written coefficient does not exist");
211 return m_matrix->const_cast_derived().valuePtr()[p];
214 const Derived *m_matrix;
221 #endif // EIGEN_SPARSE_COMPRESSED_BASE_H
A matrix or vector expression mapping an existing array of data.
Definition: Map.h:89
RowXpr row(Index i)
Definition: SparseMatrixBase.h:797
Derived & derived()
Definition: EigenBase.h:44
Eigen::Index Index
The interface type of indices.
Definition: EigenBase.h:37
Index outerSize() const
Definition: SparseMatrixBase.h:165
Definition: Eigen_Colamd.h:54
ColXpr col(Index i)
Definition: SparseMatrixBase.h:778