Medial Code Documentation
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
44
46 typename internal::packet_traits<Scalar>::type
47 >::type PacketReturnType;
48
50
53
54 template<typename OtherDerived>
55 Derived& operator=(const EigenBase<OtherDerived> &other);
56
57 enum {
58
78 MaxRowsAtCompileTime = RowsAtCompileTime,
79 MaxColsAtCompileTime = ColsAtCompileTime,
80
81 MaxSizeAtCompileTime = (internal::size_at_compile_time<MaxRowsAtCompileTime,
82 MaxColsAtCompileTime>::ret),
83
90 NumDimensions = int(MaxSizeAtCompileTime) == 1 ? 0 : bool(IsVectorAtCompileTime) ? 1 : 2,
100 IsRowMajor = Flags&RowMajorBit ? 1 : 0,
101
102 InnerSizeAtCompileTime = int(IsVectorAtCompileTime) ? int(SizeAtCompileTime)
103 : int(IsRowMajor) ? int(ColsAtCompileTime) : int(RowsAtCompileTime),
104
106 _HasDirectAccess = (int(Flags)&DirectAccessBit) ? 1 : 0 // workaround sunCC
107 #endif
108 };
109
114 >::type AdjointReturnType;
117
118 // FIXME storage order do not match evaluator storage order
120
121#ifndef EIGEN_PARSED_BY_DOXYGEN
129
133
136
140 typedef Matrix<Scalar,EIGEN_SIZE_MAX(RowsAtCompileTime,ColsAtCompileTime),
142
143 inline const Derived& derived() const { return *static_cast<const Derived*>(this); }
144 inline Derived& derived() { return *static_cast<Derived*>(this); }
145 inline Derived& const_cast_derived() const
146 { return *static_cast<Derived*>(const_cast<SparseMatrixBase*>(this)); }
147
148 typedef EigenBase<Derived> Base;
149
150#endif // not EIGEN_PARSED_BY_DOXYGEN
151
152#define EIGEN_CURRENT_STORAGE_BASE_CLASS Eigen::SparseMatrixBase
153#ifdef EIGEN_PARSED_BY_DOXYGEN
154#define EIGEN_DOC_UNARY_ADDONS(METHOD,OP)
155#define EIGEN_DOC_BLOCK_ADDONS_NOT_INNER_PANEL
156#define EIGEN_DOC_BLOCK_ADDONS_INNER_PANEL_IF(COND)
157#else
158#define EIGEN_DOC_UNARY_ADDONS(X,Y)
159#define EIGEN_DOC_BLOCK_ADDONS_NOT_INNER_PANEL
160#define EIGEN_DOC_BLOCK_ADDONS_INNER_PANEL_IF(COND)
161#endif
162# include "../plugins/CommonCwiseUnaryOps.h"
163# include "../plugins/CommonCwiseBinaryOps.h"
164# include "../plugins/MatrixCwiseUnaryOps.h"
165# include "../plugins/MatrixCwiseBinaryOps.h"
166# include "../plugins/BlockMethods.h"
167# ifdef EIGEN_SPARSEMATRIXBASE_PLUGIN
168# include EIGEN_SPARSEMATRIXBASE_PLUGIN
169# endif
170#undef EIGEN_CURRENT_STORAGE_BASE_CLASS
171#undef EIGEN_DOC_UNARY_ADDONS
172#undef EIGEN_DOC_BLOCK_ADDONS_NOT_INNER_PANEL
173#undef EIGEN_DOC_BLOCK_ADDONS_INNER_PANEL_IF
174
176 inline Index rows() const { return derived().rows(); }
178 inline Index cols() const { return derived().cols(); }
181 inline Index size() const { return rows() * cols(); }
186 inline bool isVector() const { return rows()==1 || cols()==1; }
189 Index outerSize() const { return (int(Flags)&RowMajorBit) ? this->rows() : this->cols(); }
192 Index innerSize() const { return (int(Flags)&RowMajorBit) ? this->cols() : this->rows(); }
193
194 bool isRValue() const { return m_isRValue; }
195 Derived& markAsRValue() { m_isRValue = true; return derived(); }
196
197 SparseMatrixBase() : m_isRValue(false) { /* TODO check flags */ }
198
199
200 template<typename OtherDerived>
201 Derived& operator=(const ReturnByValue<OtherDerived>& other);
202
203 template<typename OtherDerived>
204 inline Derived& operator=(const SparseMatrixBase<OtherDerived>& other);
205
206 inline Derived& operator=(const Derived& other);
207
208 protected:
209
210 template<typename OtherDerived>
211 inline Derived& assign(const OtherDerived& other);
212
213 template<typename OtherDerived>
214 inline void assignGeneric(const OtherDerived& other);
215
216 public:
217#ifndef EIGEN_NO_IO
218 friend std::ostream & operator << (std::ostream & s, const SparseMatrixBase& m)
219 {
220 typedef typename Derived::Nested Nested;
221 typedef typename internal::remove_all<Nested>::type NestedCleaned;
222
223 if (Flags&RowMajorBit)
224 {
225 Nested nm(m.derived());
226 internal::evaluator<NestedCleaned> thisEval(nm);
227 for (Index row=0; row<nm.outerSize(); ++row)
228 {
229 Index col = 0;
230 for (typename internal::evaluator<NestedCleaned>::InnerIterator it(thisEval, row); it; ++it)
231 {
232 for ( ; col<it.index(); ++col)
233 s << "0 ";
234 s << it.value() << " ";
235 ++col;
236 }
237 for ( ; col<m.cols(); ++col)
238 s << "0 ";
239 s << std::endl;
240 }
241 }
242 else
243 {
244 Nested nm(m.derived());
245 internal::evaluator<NestedCleaned> thisEval(nm);
246 if (m.cols() == 1) {
247 Index row = 0;
248 for (typename internal::evaluator<NestedCleaned>::InnerIterator it(thisEval, 0); it; ++it)
249 {
250 for ( ; row<it.index(); ++row)
251 s << "0" << std::endl;
252 s << it.value() << std::endl;
253 ++row;
254 }
255 for ( ; row<m.rows(); ++row)
256 s << "0" << std::endl;
257 }
258 else
259 {
260 SparseMatrix<Scalar, RowMajorBit, StorageIndex> trans = m;
261 s << static_cast<const SparseMatrixBase<SparseMatrix<Scalar, RowMajorBit, StorageIndex> >&>(trans);
262 }
263 }
264 return s;
265 }
266#endif
267
268 template<typename OtherDerived>
269 Derived& operator+=(const SparseMatrixBase<OtherDerived>& other);
270 template<typename OtherDerived>
271 Derived& operator-=(const SparseMatrixBase<OtherDerived>& other);
272
273 template<typename OtherDerived>
274 Derived& operator+=(const DiagonalBase<OtherDerived>& other);
275 template<typename OtherDerived>
276 Derived& operator-=(const DiagonalBase<OtherDerived>& other);
277
278 template<typename OtherDerived>
279 Derived& operator+=(const EigenBase<OtherDerived> &other);
280 template<typename OtherDerived>
281 Derived& operator-=(const EigenBase<OtherDerived> &other);
282
283 Derived& operator*=(const Scalar& other);
284 Derived& operator/=(const Scalar& other);
285
286 template<typename OtherDerived> struct CwiseProductDenseReturnType {
290 >::ReturnType>,
291 const Derived,
292 const OtherDerived
293 > Type;
294 };
295
296 template<typename OtherDerived>
297 EIGEN_STRONG_INLINE const typename CwiseProductDenseReturnType<OtherDerived>::Type
298 cwiseProduct(const MatrixBase<OtherDerived> &other) const;
299
300 // sparse * diagonal
301 template<typename OtherDerived>
303 operator*(const DiagonalBase<OtherDerived> &other) const
304 { return Product<Derived,OtherDerived>(derived(), other.derived()); }
305
306 // diagonal * sparse
307 template<typename OtherDerived> friend
309 operator*(const DiagonalBase<OtherDerived> &lhs, const SparseMatrixBase& rhs)
310 { return Product<OtherDerived,Derived>(lhs.derived(), rhs.derived()); }
311
312 // sparse * sparse
313 template<typename OtherDerived>
314 const Product<Derived,OtherDerived,AliasFreeProduct>
315 operator*(const SparseMatrixBase<OtherDerived> &other) const;
316
317 // sparse * dense
318 template<typename OtherDerived>
319 const Product<Derived,OtherDerived>
320 operator*(const MatrixBase<OtherDerived> &other) const
321 { return Product<Derived,OtherDerived>(derived(), other.derived()); }
322
323 // dense * sparse
324 template<typename OtherDerived> friend
325 const Product<OtherDerived,Derived>
326 operator*(const MatrixBase<OtherDerived> &lhs, const SparseMatrixBase& rhs)
327 { return Product<OtherDerived,Derived>(lhs.derived(), rhs.derived()); }
328
334
335 template<typename OtherDerived>
336 Derived& operator*=(const SparseMatrixBase<OtherDerived>& other);
337
338 template<int Mode>
339 inline const TriangularView<const Derived, Mode> triangularView() const;
340
341 template<unsigned int UpLo> struct SelfAdjointViewReturnType { typedef SparseSelfAdjointView<Derived, UpLo> Type; };
342 template<unsigned int UpLo> struct ConstSelfAdjointViewReturnType { typedef const SparseSelfAdjointView<const Derived, UpLo> Type; };
343
344 template<unsigned int UpLo> inline
345 typename ConstSelfAdjointViewReturnType<UpLo>::Type selfadjointView() const;
346 template<unsigned int UpLo> inline
347 typename SelfAdjointViewReturnType<UpLo>::Type selfadjointView();
348
349 template<typename OtherDerived> Scalar dot(const MatrixBase<OtherDerived>& other) const;
350 template<typename OtherDerived> Scalar dot(const SparseMatrixBase<OtherDerived>& other) const;
351 RealScalar squaredNorm() const;
352 RealScalar norm() const;
353 RealScalar blueNorm() const;
354
355 TransposeReturnType transpose() { return TransposeReturnType(derived()); }
356 const ConstTransposeReturnType transpose() const { return ConstTransposeReturnType(derived()); }
357 const AdjointReturnType adjoint() const { return AdjointReturnType(transpose()); }
358
359 DenseMatrixType toDense() const
360 {
361 return DenseMatrixType(derived());
362 }
363
364 template<typename OtherDerived>
365 bool isApprox(const SparseMatrixBase<OtherDerived>& other,
366 const RealScalar& prec = NumTraits<Scalar>::dummy_precision()) const;
367
368 template<typename OtherDerived>
369 bool isApprox(const MatrixBase<OtherDerived>& other,
370 const RealScalar& prec = NumTraits<Scalar>::dummy_precision()) const
371 { return toDense().isApprox(other,prec); }
372
378 inline const typename internal::eval<Derived>::type eval() const
379 { return typename internal::eval<Derived>::type(derived()); }
380
381 Scalar sum() const;
382
383 inline const SparseView<Derived>
384 pruned(const Scalar& reference = Scalar(0), const RealScalar& epsilon = NumTraits<Scalar>::dummy_precision()) const;
385
386 protected:
387
388 bool m_isRValue;
389
390 static inline StorageIndex convert_index(const Index idx) {
391 return internal::convert_index<StorageIndex>(idx);
392 }
393 private:
394 template<typename Dest> void evalTo(Dest &) const;
395};
396
397} // end namespace Eigen
398
399#endif // EIGEN_SPARSEMATRIXBASE_H
Generic expression where a coefficient-wise binary operator is applied to two expressions.
Definition CwiseBinaryOp.h:84
EIGEN_DEVICE_FUNC bool isApprox(const DenseBase< OtherDerived > &other, const RealScalar &prec=NumTraits< Scalar >::dummy_precision()) const
Definition Fuzzy.h:103
Base class for all dense matrices, vectors, and expressions.
Definition MatrixBase.h:50
Base class of any sparse matrices or sparse expressions.
Definition SparseMatrixBase.h:28
internal::traits< Derived >::StorageIndex StorageIndex
The integer type used to store indices within a SparseMatrix.
Definition SparseMatrixBase.h:43
Index size() const
Definition SparseMatrixBase.h:181
Index innerSize() const
Definition SparseMatrixBase.h:192
Index rows() const
Definition SparseMatrixBase.h:176
@ IsVectorAtCompileTime
This is set to true if either the number of rows or the number of columns is known at compile-time to...
Definition SparseMatrixBase.h:84
@ NumDimensions
This value is equal to Tensor::NumDimensions, i.e.
Definition SparseMatrixBase.h:90
@ ColsAtCompileTime
The number of columns at compile-time.
Definition SparseMatrixBase.h:65
@ Flags
This stores expression Flags flags which may or may not be inherited by new expressions constructed f...
Definition SparseMatrixBase.h:95
@ RowsAtCompileTime
The number of rows at compile-time.
Definition SparseMatrixBase.h:59
@ SizeAtCompileTime
This is equal to the number of coefficients, i.e.
Definition SparseMatrixBase.h:72
bool isVector() const
Definition SparseMatrixBase.h:186
Matrix< Scalar, EIGEN_SIZE_MAX(RowsAtCompileTime, ColsAtCompileTime), EIGEN_SIZE_MAX(RowsAtCompileTime, ColsAtCompileTime)> SquareMatrixType
type of the equivalent square matrix
Definition SparseMatrixBase.h:141
NumTraits< Scalar >::Real RealScalar
This is the "real scalar" type; if the Scalar type is already real numbers (e.g.
Definition SparseMatrixBase.h:128
Scalar value_type
The numeric type of the expression' coefficients, e.g.
Definition SparseMatrixBase.h:36
Index outerSize() const
Definition SparseMatrixBase.h:189
const SparseView< Derived > pruned(const Scalar &reference=Scalar(0), const RealScalar &epsilon=NumTraits< Scalar >::dummy_precision()) const
Definition SparseView.h:246
Index cols() const
Definition SparseMatrixBase.h:178
Matrix< Scalar, RowsAtCompileTime, ColsAtCompileTime > DenseMatrixType
type of the equivalent dense matrix
Definition SparseMatrixBase.h:138
SparseSymmetricPermutationProduct< Derived, Upper|Lower > twistedBy(const PermutationMatrix< Dynamic, Dynamic, StorageIndex > &perm) const
Definition SparseMatrixBase.h:330
const internal::eval< Derived >::type eval() const
Definition SparseMatrixBase.h:378
const unsigned int DirectAccessBit
Means that the underlying array of coefficients can be directly accessed as a plain strided array.
Definition Constants.h:155
const unsigned int RowMajorBit
for a matrix, this means that the storage order is row-major.
Definition Constants.h:66
Namespace containing all symbols from the Eigen library.
Definition LDLT.h:16
EIGEN_DEFAULT_DENSE_INDEX_TYPE Index
The Index type as used for the API.
Definition Meta.h:74
Common base class for all classes T such that MatrixBase has an operator=(T) and a constructor Matrix...
Definition EigenBase.h:30
Eigen::Index Index
The interface type of indices.
Definition EigenBase.h:39
Holds information about the various numeric (i.e.
Definition NumTraits.h:236
Determines whether the given binary operation of two numeric types is allowed and what the scalar ret...
Definition XprHelper.h:806
Definition Meta.h:109
Definition XprHelper.h:332
Definition BinaryFunctors.h:71
Definition XprHelper.h:282
Definition ForwardDeclarations.h:17
Definition Meta.h:96