10 #ifndef EIGEN_SPARSE_COMPRESSED_BASE_H 11 #define EIGEN_SPARSE_COMPRESSED_BASE_H 19 template<
typename Derived>
35 template<
typename Derived>
42 using Base::operator=;
43 using Base::IsRowMajor;
46 class ReverseInnerIterator;
58 if(Derived::IsVectorAtCompileTime && outerIndexPtr()==0)
59 return derived().nonZeros();
60 else if(isCompressed())
61 return outerIndexPtr()[derived().outerSize()]-outerIndexPtr()[0];
62 else if(derived().outerSize()==0)
65 return innerNonZeros().sum();
71 inline const Scalar*
valuePtr()
const {
return derived().valuePtr(); }
75 inline Scalar*
valuePtr() {
return derived().valuePtr(); }
80 inline const StorageIndex*
innerIndexPtr()
const {
return derived().innerIndexPtr(); }
84 inline StorageIndex*
innerIndexPtr() {
return derived().innerIndexPtr(); }
90 inline const StorageIndex*
outerIndexPtr()
const {
return derived().outerIndexPtr(); }
95 inline StorageIndex*
outerIndexPtr() {
return derived().outerIndexPtr(); }
100 inline const StorageIndex*
innerNonZeroPtr()
const {
return derived().innerNonZeroPtr(); }
116 template<
typename Derived>
121 : m_values(0), m_indices(0), m_outer(0), m_id(0), m_end(0)
124 InnerIterator(
const InnerIterator& other)
125 : m_values(other.m_values), m_indices(other.m_indices), m_outer(other.m_outer), m_id(other.m_id), m_end(other.m_end)
128 InnerIterator& operator=(
const InnerIterator& other)
130 m_values = other.m_values;
131 m_indices = other.m_indices;
132 const_cast<OuterType&
>(m_outer).setValue(other.m_outer.value());
159 EIGEN_STATIC_ASSERT_VECTOR_ONLY(Derived);
162 explicit InnerIterator(
const internal::CompressedStorage<Scalar,StorageIndex>& data)
163 : m_values(data.valuePtr()), m_indices(data.indexPtr()), m_outer(0), m_id(0), m_end(data.size())
165 EIGEN_STATIC_ASSERT_VECTOR_ONLY(Derived);
168 inline InnerIterator& operator++() { m_id++;
return *
this; }
170 inline const Scalar& value()
const {
return m_values[m_id]; }
171 inline Scalar& valueRef() {
return const_cast<Scalar&
>(m_values[m_id]); }
173 inline StorageIndex index()
const {
return m_indices[m_id]; }
174 inline Index outer()
const {
return m_outer.value(); }
175 inline Index row()
const {
return IsRowMajor ? m_outer.value() : index(); }
176 inline Index col()
const {
return IsRowMajor ? index() : m_outer.value(); }
178 inline operator bool()
const {
return (m_id < m_end); }
181 const Scalar* m_values;
182 const StorageIndex* m_indices;
183 typedef internal::variable_if_dynamic<Index,Derived::IsVectorAtCompileTime?0:Dynamic> OuterType;
184 const OuterType m_outer;
194 template<
typename Derived>
219 EIGEN_STATIC_ASSERT_VECTOR_ONLY(Derived);
222 explicit ReverseInnerIterator(
const internal::CompressedStorage<Scalar,StorageIndex>& data)
223 : m_values(data.valuePtr()), m_indices(data.indexPtr()), m_outer(0), m_start(0), m_id(data.size())
225 EIGEN_STATIC_ASSERT_VECTOR_ONLY(Derived);
228 inline ReverseInnerIterator& operator--() { --m_id;
return *
this; }
230 inline const Scalar& value()
const {
return m_values[m_id-1]; }
231 inline Scalar& valueRef() {
return const_cast<Scalar&
>(m_values[m_id-1]); }
233 inline StorageIndex index()
const {
return m_indices[m_id-1]; }
234 inline Index outer()
const {
return m_outer.value(); }
235 inline Index row()
const {
return IsRowMajor ? m_outer.value() : index(); }
236 inline Index col()
const {
return IsRowMajor ? index() : m_outer.value(); }
238 inline operator bool()
const {
return (m_id > m_start.value()); }
241 const Scalar* m_values;
242 const StorageIndex* m_indices;
243 const internal::variable_if_dynamic<Index,Derived::IsVectorAtCompileTime?0:Dynamic> m_outer;
245 const internal::variable_if_dynamic<Index,Derived::IsVectorAtCompileTime?0:Dynamic> m_start;
250 template<
typename Derived>
251 struct evaluator<SparseCompressedBase<Derived> >
252 : evaluator_base<Derived>
254 typedef typename Derived::Scalar Scalar;
255 typedef typename Derived::InnerIterator InnerIterator;
256 typedef typename Derived::ReverseInnerIterator ReverseInnerIterator;
260 Flags = Derived::Flags
263 evaluator() : m_matrix(0)
265 EIGEN_INTERNAL_CHECK_COST_VALUE(CoeffReadCost);
267 explicit evaluator(
const Derived &mat) : m_matrix(&mat)
269 EIGEN_INTERNAL_CHECK_COST_VALUE(CoeffReadCost);
272 inline Index nonZerosEstimate()
const {
273 return m_matrix->nonZeros();
276 operator Derived&() {
return m_matrix->const_cast_derived(); }
277 operator const Derived&()
const {
return *m_matrix; }
279 typedef typename DenseCoeffsBase<Derived,ReadOnlyAccessors>::CoeffReturnType CoeffReturnType;
281 {
return m_matrix->coeff(row,col); }
285 eigen_internal_assert(row>=0 && row<m_matrix->rows() && col>=0 && col<m_matrix->cols());
287 const Index outer = Derived::IsRowMajor ? row : col;
288 const Index inner = Derived::IsRowMajor ? col : row;
290 Index start = m_matrix->outerIndexPtr()[outer];
291 Index end = m_matrix->isCompressed() ? m_matrix->outerIndexPtr()[outer+1] : m_matrix->outerIndexPtr()[outer] + m_matrix->innerNonZeroPtr()[outer];
292 eigen_assert(end>start &&
"you are using a non finalized sparse matrix or written coefficient does not exist");
293 const Index p = std::lower_bound(m_matrix->innerIndexPtr()+start, m_matrix->innerIndexPtr()+end,inner)
294 - m_matrix->innerIndexPtr();
295 eigen_assert((p<end) && (m_matrix->innerIndexPtr()[p]==inner) &&
"written coefficient does not exist");
296 return m_matrix->const_cast_derived().valuePtr()[p];
299 const Derived *m_matrix;
306 #endif // EIGEN_SPARSE_COMPRESSED_BASE_H bool isCompressed() const
Definition: SparseCompressedBase.h:107
A matrix or vector expression mapping an existing array of data.
Definition: Map.h:88
Namespace containing all symbols from the Eigen library.
Definition: Core:271
StorageIndex * innerIndexPtr()
Definition: SparseCompressedBase.h:84
Holds information about the various numeric (i.e. scalar) types allowed by Eigen. ...
Definition: NumTraits.h:167
Index nonZeros() const
Definition: SparseCompressedBase.h:56
Eigen::Index Index
The interface type of indices.
Definition: EigenBase.h:37
const StorageIndex * innerNonZeroPtr() const
Definition: SparseCompressedBase.h:100
Base class of any sparse matrices or sparse expressions.
Definition: ForwardDeclarations.h:281
StorageIndex * innerNonZeroPtr()
Definition: SparseCompressedBase.h:104
Scalar * valuePtr()
Definition: SparseCompressedBase.h:75
const StorageIndex * innerIndexPtr() const
Definition: SparseCompressedBase.h:80
const StorageIndex * outerIndexPtr() const
Definition: SparseCompressedBase.h:90
StorageIndex * outerIndexPtr()
Definition: SparseCompressedBase.h:95
Definition: Eigen_Colamd.h:50
Common base class for sparse [compressed]-{row|column}-storage format.
Definition: SparseCompressedBase.h:15
const Scalar * valuePtr() const
Definition: SparseCompressedBase.h:71
SparseCompressedBase()
Definition: SparseCompressedBase.h:111