10 #ifndef EIGEN_SPARSEMATRIXBASE_H
11 #define EIGEN_SPARSEMATRIXBASE_H
26 template<
typename Derived>
class SparseMatrixBase
27 :
public EigenBase<Derived>
31 typedef typename internal::traits<Derived>::Scalar Scalar;
38 typedef typename internal::packet_traits<Scalar>::type PacketScalar;
39 typedef typename internal::traits<Derived>::StorageKind StorageKind;
43 typedef typename internal::traits<Derived>::StorageIndex
StorageIndex;
45 typedef typename internal::add_const_on_value_type_if_arithmetic<
46 typename internal::packet_traits<Scalar>::type
47 >::type PacketReturnType;
54 template<
typename OtherDerived>
72 SizeAtCompileTime = (internal::size_at_compile_time<internal::traits<Derived>::RowsAtCompileTime,
73 internal::traits<Derived>::ColsAtCompileTime>::ret),
81 MaxSizeAtCompileTime = (internal::size_at_compile_time<MaxRowsAtCompileTime,
82 MaxColsAtCompileTime>::ret),
90 Flags = internal::traits<Derived>::Flags,
100 #ifndef EIGEN_PARSED_BY_DOXYGEN
106 typedef typename internal::conditional<NumTraits<Scalar>::IsComplex,
109 >::type AdjointReturnType;
111 typedef typename internal::add_const<Transpose<const Derived> >::type ConstTransposeReturnType;
116 #ifndef EIGEN_PARSED_BY_DOXYGEN
127 typedef typename internal::conditional<_HasDirectAccess, const Scalar&, Scalar>::type CoeffReturnType;
138 inline const Derived&
derived()
const {
return *static_cast<const Derived*>(
this); }
139 inline Derived&
derived() {
return *static_cast<Derived*>(
this); }
140 inline Derived& const_cast_derived()
const
141 {
return *static_cast<Derived*>(const_cast<SparseMatrixBase*>(
this)); }
143 typedef EigenBase<Derived> Base;
145 #endif // not EIGEN_PARSED_BY_DOXYGEN
147 #define EIGEN_CURRENT_STORAGE_BASE_CLASS Eigen::SparseMatrixBase
148 #ifdef EIGEN_PARSED_BY_DOXYGEN
149 #define EIGEN_DOC_UNARY_ADDONS(METHOD,OP)
150 #define EIGEN_DOC_BLOCK_ADDONS_NOT_INNER_PANEL
151 #define EIGEN_DOC_BLOCK_ADDONS_INNER_PANEL_IF(COND)
153 #define EIGEN_DOC_UNARY_ADDONS(X,Y)
154 #define EIGEN_DOC_BLOCK_ADDONS_NOT_INNER_PANEL
155 #define EIGEN_DOC_BLOCK_ADDONS_INNER_PANEL_IF(COND)
157 # include "../plugins/CommonCwiseUnaryOps.h"
158 # include "../plugins/CommonCwiseBinaryOps.h"
159 # include "../plugins/MatrixCwiseUnaryOps.h"
160 # include "../plugins/MatrixCwiseBinaryOps.h"
161 # include "../plugins/BlockMethods.h"
162 # ifdef EIGEN_SPARSEMATRIXBASE_PLUGIN
163 # include EIGEN_SPARSEMATRIXBASE_PLUGIN
165 #undef EIGEN_CURRENT_STORAGE_BASE_CLASS
166 #undef EIGEN_DOC_UNARY_ADDONS
167 #undef EIGEN_DOC_BLOCK_ADDONS_NOT_INNER_PANEL
168 #undef EIGEN_DOC_BLOCK_ADDONS_INNER_PANEL_IF
189 bool isRValue()
const {
return m_isRValue; }
190 Derived& markAsRValue() { m_isRValue =
true;
return derived(); }
192 SparseMatrixBase() : m_isRValue(false) { }
195 template<
typename OtherDerived>
196 Derived& operator=(
const ReturnByValue<OtherDerived>& other);
198 template<
typename OtherDerived>
199 inline Derived& operator=(
const SparseMatrixBase<OtherDerived>& other);
201 inline Derived& operator=(
const Derived& other);
205 template<
typename OtherDerived>
206 inline Derived& assign(
const OtherDerived& other);
208 template<
typename OtherDerived>
209 inline void assignGeneric(
const OtherDerived& other);
213 friend std::ostream & operator << (std::ostream & s,
const SparseMatrixBase& m)
215 typedef typename Derived::Nested Nested;
216 typedef typename internal::remove_all<Nested>::type NestedCleaned;
220 Nested nm(m.derived());
221 internal::evaluator<NestedCleaned> thisEval(nm);
222 for (
Index row=0; row<nm.outerSize(); ++row)
225 for (
typename internal::evaluator<NestedCleaned>::InnerIterator it(thisEval, row); it; ++it)
227 for ( ; col<it.index(); ++col)
229 s << it.value() <<
" ";
232 for ( ; col<m.cols(); ++col)
239 Nested nm(m.derived());
240 internal::evaluator<NestedCleaned> thisEval(nm);
243 for (
typename internal::evaluator<NestedCleaned>::InnerIterator it(thisEval, 0); it; ++it)
245 for ( ; row<it.index(); ++row)
246 s <<
"0" << std::endl;
247 s << it.value() << std::endl;
250 for ( ; row<m.rows(); ++row)
251 s <<
"0" << std::endl;
255 SparseMatrix<Scalar, RowMajorBit, StorageIndex> trans = m;
256 s << static_cast<const SparseMatrixBase<SparseMatrix<Scalar, RowMajorBit, StorageIndex> >&>(trans);
262 template<
typename OtherDerived>
263 Derived& operator+=(
const SparseMatrixBase<OtherDerived>& other);
264 template<
typename OtherDerived>
265 Derived& operator-=(
const SparseMatrixBase<OtherDerived>& other);
267 template<
typename OtherDerived>
268 Derived& operator+=(
const DiagonalBase<OtherDerived>& other);
269 template<
typename OtherDerived>
270 Derived& operator-=(
const DiagonalBase<OtherDerived>& other);
272 template<
typename OtherDerived>
273 Derived& operator+=(
const EigenBase<OtherDerived> &other);
274 template<
typename OtherDerived>
275 Derived& operator-=(
const EigenBase<OtherDerived> &other);
277 Derived& operator*=(
const Scalar& other);
278 Derived& operator/=(
const Scalar& other);
280 template<
typename OtherDerived>
struct CwiseProductDenseReturnType {
281 typedef CwiseBinaryOp<internal::scalar_product_op<
typename ScalarBinaryOpTraits<
282 typename internal::traits<Derived>::Scalar,
283 typename internal::traits<OtherDerived>::Scalar
290 template<
typename OtherDerived>
291 EIGEN_STRONG_INLINE
const typename CwiseProductDenseReturnType<OtherDerived>::Type
292 cwiseProduct(
const MatrixBase<OtherDerived> &other)
const;
295 template<
typename OtherDerived>
296 const Product<Derived,OtherDerived>
297 operator*(
const DiagonalBase<OtherDerived> &other)
const
298 {
return Product<Derived,OtherDerived>(
derived(), other.derived()); }
301 template<
typename OtherDerived>
friend
302 const Product<OtherDerived,Derived>
303 operator*(
const DiagonalBase<OtherDerived> &lhs,
const SparseMatrixBase& rhs)
304 {
return Product<OtherDerived,Derived>(lhs.derived(), rhs.derived()); }
307 template<
typename OtherDerived>
308 const Product<Derived,OtherDerived,AliasFreeProduct>
309 operator*(
const SparseMatrixBase<OtherDerived> &other)
const;
312 template<
typename OtherDerived>
313 const Product<Derived,OtherDerived>
314 operator*(
const MatrixBase<OtherDerived> &other)
const
315 {
return Product<Derived,OtherDerived>(
derived(), other.derived()); }
318 template<
typename OtherDerived>
friend
319 const Product<OtherDerived,Derived>
320 operator*(
const MatrixBase<OtherDerived> &lhs,
const SparseMatrixBase& rhs)
321 {
return Product<OtherDerived,Derived>(lhs.derived(), rhs.derived()); }
326 return SparseSymmetricPermutationProduct<Derived,Upper|Lower>(
derived(), perm);
329 template<
typename OtherDerived>
336 template<
unsigned int UpLo>
struct ConstSelfAdjointViewReturnType {
typedef const SparseSelfAdjointView<const Derived, UpLo> Type; };
338 template<
unsigned int UpLo>
inline
339 typename ConstSelfAdjointViewReturnType<UpLo>::Type selfadjointView()
const;
340 template<
unsigned int UpLo>
inline
341 typename SelfAdjointViewReturnType<UpLo>::Type selfadjointView();
343 template<
typename OtherDerived> Scalar dot(
const MatrixBase<OtherDerived>& other)
const;
344 template<
typename OtherDerived> Scalar dot(
const SparseMatrixBase<OtherDerived>& other)
const;
345 RealScalar squaredNorm()
const;
346 RealScalar norm()
const;
347 RealScalar blueNorm()
const;
349 TransposeReturnType transpose() {
return TransposeReturnType(
derived()); }
350 const ConstTransposeReturnType transpose()
const {
return ConstTransposeReturnType(
derived()); }
351 const AdjointReturnType adjoint()
const {
return AdjointReturnType(transpose()); }
354 typedef Block<Derived,IsRowMajor?1:Dynamic,IsRowMajor?Dynamic:1,true> InnerVectorReturnType;
355 typedef Block<const Derived,IsRowMajor?1:Dynamic,IsRowMajor?Dynamic:1,true> ConstInnerVectorReturnType;
360 typedef Block<Derived,Dynamic,Dynamic,true> InnerVectorsReturnType;
361 typedef Block<const Derived,Dynamic,Dynamic,true> ConstInnerVectorsReturnType;
365 DenseMatrixType toDense()
const
367 return DenseMatrixType(
derived());
370 template<
typename OtherDerived>
371 bool isApprox(
const SparseMatrixBase<OtherDerived>& other,
372 const RealScalar& prec = NumTraits<Scalar>::dummy_precision())
const;
374 template<
typename OtherDerived>
375 bool isApprox(
const MatrixBase<OtherDerived>& other,
376 const RealScalar& prec = NumTraits<Scalar>::dummy_precision())
const
377 {
return toDense().isApprox(other,prec); }
384 inline const typename internal::eval<Derived>::type
eval()
const
385 {
return typename internal::eval<Derived>::type(
derived()); }
397 return internal::convert_index<StorageIndex>(idx);
400 template<
typename Dest>
void evalTo(Dest &)
const;
405 #endif // EIGEN_SPARSEMATRIXBASE_H