Eigen  3.3.0
 
Loading...
Searching...
No Matches
SparseMatrixBase.h
1// This file is part of Eigen, a lightweight C++ template library
2// for linear algebra.
3//
4// Copyright (C) 2008-2014 Gael Guennebaud <gael.guennebaud@inria.fr>
5//
6// This Source Code Form is subject to the terms of the Mozilla
7// Public License v. 2.0. If a copy of the MPL was not distributed
8// with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
9
10#ifndef EIGEN_SPARSEMATRIXBASE_H
11#define EIGEN_SPARSEMATRIXBASE_H
12
13namespace Eigen {
14
26template<typename Derived> class SparseMatrixBase
27 : public EigenBase<Derived>
28{
29 public:
30
31 typedef typename internal::traits<Derived>::Scalar Scalar;
32
36 typedef Scalar value_type;
37
38 typedef typename internal::packet_traits<Scalar>::type PacketScalar;
39 typedef typename internal::traits<Derived>::StorageKind StorageKind;
40 typedef typename internal::traits<Derived>::StorageIndex StorageIndex;
41 typedef typename internal::add_const_on_value_type_if_arithmetic<
42 typename internal::packet_traits<Scalar>::type
43 >::type PacketReturnType;
44
46
49
50 template<typename OtherDerived>
51 Derived& operator=(const EigenBase<OtherDerived> &other);
52
53 enum {
54
55 RowsAtCompileTime = internal::traits<Derived>::RowsAtCompileTime,
61 ColsAtCompileTime = internal::traits<Derived>::ColsAtCompileTime,
68 SizeAtCompileTime = (internal::size_at_compile_time<internal::traits<Derived>::RowsAtCompileTime,
69 internal::traits<Derived>::ColsAtCompileTime>::ret),
74 MaxRowsAtCompileTime = RowsAtCompileTime,
75 MaxColsAtCompileTime = ColsAtCompileTime,
76
77 MaxSizeAtCompileTime = (internal::size_at_compile_time<MaxRowsAtCompileTime,
78 MaxColsAtCompileTime>::ret),
79
86 Flags = internal::traits<Derived>::Flags,
91 IsRowMajor = Flags&RowMajorBit ? 1 : 0,
92
93 InnerSizeAtCompileTime = int(IsVectorAtCompileTime) ? int(SizeAtCompileTime)
94 : int(IsRowMajor) ? int(ColsAtCompileTime) : int(RowsAtCompileTime),
95
96 #ifndef EIGEN_PARSED_BY_DOXYGEN
97 _HasDirectAccess = (int(Flags)&DirectAccessBit) ? 1 : 0 // workaround sunCC
98 #endif
99 };
100
102 typedef typename internal::conditional<NumTraits<Scalar>::IsComplex,
105 >::type AdjointReturnType;
107 typedef typename internal::add_const<Transpose<const Derived> >::type ConstTransposeReturnType;
108
109 // FIXME storage order do not match evaluator storage order
111
112#ifndef EIGEN_PARSED_BY_DOXYGEN
119 typedef typename NumTraits<Scalar>::Real RealScalar;
120
123 typedef typename internal::conditional<_HasDirectAccess, const Scalar&, Scalar>::type CoeffReturnType;
124
127
131 typedef Matrix<Scalar,EIGEN_SIZE_MAX(RowsAtCompileTime,ColsAtCompileTime),
132 EIGEN_SIZE_MAX(RowsAtCompileTime,ColsAtCompileTime)> SquareMatrixType;
133
134 inline const Derived& derived() const { return *static_cast<const Derived*>(this); }
135 inline Derived& derived() { return *static_cast<Derived*>(this); }
136 inline Derived& const_cast_derived() const
137 { return *static_cast<Derived*>(const_cast<SparseMatrixBase*>(this)); }
138
139 typedef EigenBase<Derived> Base;
140
141#endif // not EIGEN_PARSED_BY_DOXYGEN
142
143#define EIGEN_CURRENT_STORAGE_BASE_CLASS Eigen::SparseMatrixBase
144#ifdef EIGEN_PARSED_BY_DOXYGEN
145#define EIGEN_DOC_UNARY_ADDONS(METHOD,OP)
146#define EIGEN_DOC_BLOCK_ADDONS_NOT_INNER_PANEL
147#define EIGEN_DOC_BLOCK_ADDONS_INNER_PANEL_IF(COND)
148#else
149#define EIGEN_DOC_UNARY_ADDONS(X,Y)
150#define EIGEN_DOC_BLOCK_ADDONS_NOT_INNER_PANEL
151#define EIGEN_DOC_BLOCK_ADDONS_INNER_PANEL_IF(COND)
152#endif
153# include "../plugins/CommonCwiseUnaryOps.h"
154# include "../plugins/CommonCwiseBinaryOps.h"
155# include "../plugins/MatrixCwiseUnaryOps.h"
156# include "../plugins/MatrixCwiseBinaryOps.h"
157# include "../plugins/BlockMethods.h"
158# ifdef EIGEN_SPARSEMATRIXBASE_PLUGIN
159# include EIGEN_SPARSEMATRIXBASE_PLUGIN
160# endif
161#undef EIGEN_CURRENT_STORAGE_BASE_CLASS
162#undef EIGEN_DOC_UNARY_ADDONS
163#undef EIGEN_DOC_BLOCK_ADDONS_NOT_INNER_PANEL
164#undef EIGEN_DOC_BLOCK_ADDONS_INNER_PANEL_IF
165
167 inline Index rows() const { return derived().rows(); }
169 inline Index cols() const { return derived().cols(); }
172 inline Index size() const { return rows() * cols(); }
177 inline bool isVector() const { return rows()==1 || cols()==1; }
180 Index outerSize() const { return (int(Flags)&RowMajorBit) ? this->rows() : this->cols(); }
183 Index innerSize() const { return (int(Flags)&RowMajorBit) ? this->cols() : this->rows(); }
184
185 bool isRValue() const { return m_isRValue; }
186 Derived& markAsRValue() { m_isRValue = true; return derived(); }
187
188 SparseMatrixBase() : m_isRValue(false) { /* TODO check flags */ }
189
190
191 template<typename OtherDerived>
192 Derived& operator=(const ReturnByValue<OtherDerived>& other);
193
194 template<typename OtherDerived>
195 inline Derived& operator=(const SparseMatrixBase<OtherDerived>& other);
196
197 inline Derived& operator=(const Derived& other);
198
199 protected:
200
201 template<typename OtherDerived>
202 inline Derived& assign(const OtherDerived& other);
203
204 template<typename OtherDerived>
205 inline void assignGeneric(const OtherDerived& other);
206
207 public:
208
209 friend std::ostream & operator << (std::ostream & s, const SparseMatrixBase& m)
210 {
211 typedef typename Derived::Nested Nested;
212 typedef typename internal::remove_all<Nested>::type NestedCleaned;
213
214 if (Flags&RowMajorBit)
215 {
216 const Nested nm(m.derived());
217 internal::evaluator<NestedCleaned> thisEval(nm);
218 for (Index row=0; row<nm.outerSize(); ++row)
219 {
220 Index col = 0;
221 for (typename internal::evaluator<NestedCleaned>::InnerIterator it(thisEval, row); it; ++it)
222 {
223 for ( ; col<it.index(); ++col)
224 s << "0 ";
225 s << it.value() << " ";
226 ++col;
227 }
228 for ( ; col<m.cols(); ++col)
229 s << "0 ";
230 s << std::endl;
231 }
232 }
233 else
234 {
235 const Nested nm(m.derived());
236 internal::evaluator<NestedCleaned> thisEval(nm);
237 if (m.cols() == 1) {
238 Index row = 0;
239 for (typename internal::evaluator<NestedCleaned>::InnerIterator it(thisEval, 0); it; ++it)
240 {
241 for ( ; row<it.index(); ++row)
242 s << "0" << std::endl;
243 s << it.value() << std::endl;
244 ++row;
245 }
246 for ( ; row<m.rows(); ++row)
247 s << "0" << std::endl;
248 }
249 else
250 {
251 SparseMatrix<Scalar, RowMajorBit, StorageIndex> trans = m;
252 s << static_cast<const SparseMatrixBase<SparseMatrix<Scalar, RowMajorBit, StorageIndex> >&>(trans);
253 }
254 }
255 return s;
256 }
257
258 template<typename OtherDerived>
259 Derived& operator+=(const SparseMatrixBase<OtherDerived>& other);
260 template<typename OtherDerived>
261 Derived& operator-=(const SparseMatrixBase<OtherDerived>& other);
262
263 template<typename OtherDerived>
264 Derived& operator+=(const DiagonalBase<OtherDerived>& other);
265 template<typename OtherDerived>
266 Derived& operator-=(const DiagonalBase<OtherDerived>& other);
267
268 Derived& operator*=(const Scalar& other);
269 Derived& operator/=(const Scalar& other);
270
271 template<typename OtherDerived> struct CwiseProductDenseReturnType {
272 typedef CwiseBinaryOp<internal::scalar_product_op<typename ScalarBinaryOpTraits<
273 typename internal::traits<Derived>::Scalar,
274 typename internal::traits<OtherDerived>::Scalar
275 >::ReturnType>,
276 const Derived,
277 const OtherDerived
278 > Type;
279 };
280
281 template<typename OtherDerived>
282 EIGEN_STRONG_INLINE const typename CwiseProductDenseReturnType<OtherDerived>::Type
283 cwiseProduct(const MatrixBase<OtherDerived> &other) const;
284
285 // sparse * diagonal
286 template<typename OtherDerived>
287 const Product<Derived,OtherDerived>
288 operator*(const DiagonalBase<OtherDerived> &other) const
289 { return Product<Derived,OtherDerived>(derived(), other.derived()); }
290
291 // diagonal * sparse
292 template<typename OtherDerived> friend
293 const Product<OtherDerived,Derived>
294 operator*(const DiagonalBase<OtherDerived> &lhs, const SparseMatrixBase& rhs)
295 { return Product<OtherDerived,Derived>(lhs.derived(), rhs.derived()); }
296
297 // sparse * sparse
298 template<typename OtherDerived>
299 const Product<Derived,OtherDerived,AliasFreeProduct>
300 operator*(const SparseMatrixBase<OtherDerived> &other) const;
301
302 // sparse * dense
303 template<typename OtherDerived>
304 const Product<Derived,OtherDerived>
305 operator*(const MatrixBase<OtherDerived> &other) const
306 { return Product<Derived,OtherDerived>(derived(), other.derived()); }
307
308 // dense * sparse
309 template<typename OtherDerived> friend
310 const Product<OtherDerived,Derived>
311 operator*(const MatrixBase<OtherDerived> &lhs, const SparseMatrixBase& rhs)
312 { return Product<OtherDerived,Derived>(lhs.derived(), rhs.derived()); }
313
315 SparseSymmetricPermutationProduct<Derived,Upper|Lower> twistedBy(const PermutationMatrix<Dynamic,Dynamic,StorageIndex>& perm) const
316 {
317 return SparseSymmetricPermutationProduct<Derived,Upper|Lower>(derived(), perm);
318 }
319
320 template<typename OtherDerived>
321 Derived& operator*=(const SparseMatrixBase<OtherDerived>& other);
322
323 template<int Mode>
324 inline const TriangularView<const Derived, Mode> triangularView() const;
325
326 template<unsigned int UpLo> struct SelfAdjointViewReturnType { typedef SparseSelfAdjointView<Derived, UpLo> Type; };
327 template<unsigned int UpLo> struct ConstSelfAdjointViewReturnType { typedef const SparseSelfAdjointView<const Derived, UpLo> Type; };
328
329 template<unsigned int UpLo> inline
330 typename ConstSelfAdjointViewReturnType<UpLo>::Type selfadjointView() const;
331 template<unsigned int UpLo> inline
332 typename SelfAdjointViewReturnType<UpLo>::Type selfadjointView();
333
334 template<typename OtherDerived> Scalar dot(const MatrixBase<OtherDerived>& other) const;
335 template<typename OtherDerived> Scalar dot(const SparseMatrixBase<OtherDerived>& other) const;
336 RealScalar squaredNorm() const;
337 RealScalar norm() const;
338 RealScalar blueNorm() const;
339
340 TransposeReturnType transpose() { return TransposeReturnType(derived()); }
341 const ConstTransposeReturnType transpose() const { return ConstTransposeReturnType(derived()); }
342 const AdjointReturnType adjoint() const { return AdjointReturnType(transpose()); }
343
344 // inner-vector
345 typedef Block<Derived,IsRowMajor?1:Dynamic,IsRowMajor?Dynamic:1,true> InnerVectorReturnType;
346 typedef Block<const Derived,IsRowMajor?1:Dynamic,IsRowMajor?Dynamic:1,true> ConstInnerVectorReturnType;
347 InnerVectorReturnType innerVector(Index outer);
348 const ConstInnerVectorReturnType innerVector(Index outer) const;
349
350 // set of inner-vectors
351 typedef Block<Derived,Dynamic,Dynamic,true> InnerVectorsReturnType;
352 typedef Block<const Derived,Dynamic,Dynamic,true> ConstInnerVectorsReturnType;
353 InnerVectorsReturnType innerVectors(Index outerStart, Index outerSize);
354 const ConstInnerVectorsReturnType innerVectors(Index outerStart, Index outerSize) const;
355
356 DenseMatrixType toDense() const
357 {
358 return DenseMatrixType(derived());
359 }
360
361 template<typename OtherDerived>
362 bool isApprox(const SparseMatrixBase<OtherDerived>& other,
363 const RealScalar& prec = NumTraits<Scalar>::dummy_precision()) const;
364
365 template<typename OtherDerived>
366 bool isApprox(const MatrixBase<OtherDerived>& other,
367 const RealScalar& prec = NumTraits<Scalar>::dummy_precision()) const
368 { return toDense().isApprox(other,prec); }
369
375 inline const typename internal::eval<Derived>::type eval() const
376 { return typename internal::eval<Derived>::type(derived()); }
377
378 Scalar sum() const;
379
380 inline const SparseView<Derived>
381 pruned(const Scalar& reference = Scalar(0), const RealScalar& epsilon = NumTraits<Scalar>::dummy_precision()) const;
382
383 protected:
384
385 bool m_isRValue;
386
387 static inline StorageIndex convert_index(const Index idx) {
388 return internal::convert_index<StorageIndex>(idx);
389 }
390 private:
391 template<typename Dest> void evalTo(Dest &) const;
392};
393
394} // end namespace Eigen
395
396#endif // EIGEN_SPARSEMATRIXBASE_H
Generic expression of a matrix where all coefficients are defined by a functor.
Definition: CwiseNullaryOp.h:61
Generic expression where a coefficient-wise unary operator is applied to an expression.
Definition: CwiseUnaryOp.h:56
Expression of a diagonal/subdiagonal/superdiagonal in a matrix.
Definition: Diagonal.h:65
The matrix class, also used for vectors and row-vectors.
Definition: Matrix.h:180
Permutation matrix.
Definition: PermutationMatrix.h:309
Base class of any sparse matrices or sparse expressions.
Definition: SparseMatrixBase.h:28
Index size() const
Definition: SparseMatrixBase.h:172
Index innerSize() const
Definition: SparseMatrixBase.h:183
Index rows() const
Definition: SparseMatrixBase.h:167
InnerVectorsReturnType innerVectors(Index outerStart, Index outerSize)
Definition: SparseBlock.h:346
InnerVectorReturnType innerVector(Index outer)
Definition: SparseBlock.h:331
@ IsVectorAtCompileTime
Definition: SparseMatrixBase.h:80
@ ColsAtCompileTime
Definition: SparseMatrixBase.h:61
@ Flags
Definition: SparseMatrixBase.h:86
@ RowsAtCompileTime
Definition: SparseMatrixBase.h:55
@ SizeAtCompileTime
Definition: SparseMatrixBase.h:68
bool isVector() const
Definition: SparseMatrixBase.h:177
Scalar value_type
Definition: SparseMatrixBase.h:36
Index outerSize() const
Definition: SparseMatrixBase.h:180
const SparseView< Derived > pruned(const Scalar &reference=Scalar(0), const RealScalar &epsilon=NumTraits< Scalar >::dummy_precision()) const
Definition: SparseView.h:214
Index cols() const
Definition: SparseMatrixBase.h:169
SparseSymmetricPermutationProduct< Derived, Upper|Lower > twistedBy(const PermutationMatrix< Dynamic, Dynamic, StorageIndex > &perm) const
Definition: SparseMatrixBase.h:315
const internal::eval< Derived >::type eval() const
Definition: SparseMatrixBase.h:375
A versatible sparse matrix representation.
Definition: SparseMatrix.h:94
Pseudo expression to manipulate a triangular sparse matrix as a selfadjoint matrix.
Definition: SparseSelfAdjointView.h:45
Expression of the transpose of a matrix.
Definition: Transpose.h:54
Expression of a triangular part in a matrix.
Definition: TriangularMatrix.h:188
const unsigned int DirectAccessBit
Definition: Constants.h:150
const unsigned int RowMajorBit
Definition: Constants.h:61
Namespace containing all symbols from the Eigen library.
Definition: Core:287
EIGEN_DEFAULT_DENSE_INDEX_TYPE Index
The Index type as used for the API.
Definition: Meta.h:33
Definition: EigenBase.h:29
Eigen::Index Index
The interface type of indices.
Definition: EigenBase.h:37
Derived & derived()
Definition: EigenBase.h:44
Holds information about the various numeric (i.e. scalar) types allowed by Eigen.
Definition: NumTraits.h:151