SparseMatrixBase.h revision c981c48f5bc9aefeffc0bcb0cc3934c2fae179dd
1c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath// This file is part of Eigen, a lightweight C++ template library 2c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath// for linear algebra. 3c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath// 4c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath// Copyright (C) 2008-2011 Gael Guennebaud <gael.guennebaud@inria.fr> 5c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath// 6c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath// This Source Code Form is subject to the terms of the Mozilla 7c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath// Public License v. 2.0. If a copy of the MPL was not distributed 8c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath// with this file, You can obtain one at http://mozilla.org/MPL/2.0/. 9c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath 10c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath#ifndef EIGEN_SPARSEMATRIXBASE_H 11c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath#define EIGEN_SPARSEMATRIXBASE_H 12c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath 13c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathnamespace Eigen { 14c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath 15c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath/** \ingroup SparseCore_Module 16c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath * 17c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath * \class SparseMatrixBase 18c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath * 19c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath * \brief Base class of any sparse matrices or sparse expressions 20c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath * 21c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath * \tparam Derived 22c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath * 23c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath * This class can be extended with the help of the plugin mechanism described on the page 24c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath * \ref TopicCustomizingEigen by defining the preprocessor symbol \c EIGEN_SPARSEMATRIXBASE_PLUGIN. 25c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath */ 26c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathtemplate<typename Derived> class SparseMatrixBase : public EigenBase<Derived> 27c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath{ 28c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath public: 29c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath 30c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath typedef typename internal::traits<Derived>::Scalar Scalar; 31c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath typedef typename internal::packet_traits<Scalar>::type PacketScalar; 32c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath typedef typename internal::traits<Derived>::StorageKind StorageKind; 33c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath typedef typename internal::traits<Derived>::Index Index; 34c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath typedef typename internal::add_const_on_value_type_if_arithmetic< 35c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath typename internal::packet_traits<Scalar>::type 36c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath >::type PacketReturnType; 37c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath 38c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath typedef SparseMatrixBase StorageBaseType; 39c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath typedef EigenBase<Derived> Base; 40c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath 41c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath template<typename OtherDerived> 42c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath Derived& operator=(const EigenBase<OtherDerived> &other) 43c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath { 44c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath other.derived().evalTo(derived()); 45c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath return derived(); 46c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath } 47c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath 48c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath enum { 49c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath 50c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath RowsAtCompileTime = internal::traits<Derived>::RowsAtCompileTime, 51c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath /**< The number of rows at compile-time. This is just a copy of the value provided 52c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath * by the \a Derived type. If a value is not known at compile-time, 53c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath * it is set to the \a Dynamic constant. 54c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath * \sa MatrixBase::rows(), MatrixBase::cols(), ColsAtCompileTime, SizeAtCompileTime */ 55c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath 56c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath ColsAtCompileTime = internal::traits<Derived>::ColsAtCompileTime, 57c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath /**< The number of columns at compile-time. This is just a copy of the value provided 58c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath * by the \a Derived type. If a value is not known at compile-time, 59c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath * it is set to the \a Dynamic constant. 60c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath * \sa MatrixBase::rows(), MatrixBase::cols(), RowsAtCompileTime, SizeAtCompileTime */ 61c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath 62c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath 63c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath SizeAtCompileTime = (internal::size_at_compile_time<internal::traits<Derived>::RowsAtCompileTime, 64c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath internal::traits<Derived>::ColsAtCompileTime>::ret), 65c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath /**< This is equal to the number of coefficients, i.e. the number of 66c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath * rows times the number of columns, or to \a Dynamic if this is not 67c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath * known at compile-time. \sa RowsAtCompileTime, ColsAtCompileTime */ 68c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath 69c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath MaxRowsAtCompileTime = RowsAtCompileTime, 70c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath MaxColsAtCompileTime = ColsAtCompileTime, 71c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath 72c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath MaxSizeAtCompileTime = (internal::size_at_compile_time<MaxRowsAtCompileTime, 73c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath MaxColsAtCompileTime>::ret), 74c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath 75c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath IsVectorAtCompileTime = RowsAtCompileTime == 1 || ColsAtCompileTime == 1, 76c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath /**< This is set to true if either the number of rows or the number of 77c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath * columns is known at compile-time to be equal to 1. Indeed, in that case, 78c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath * we are dealing with a column-vector (if there is only one column) or with 79c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath * a row-vector (if there is only one row). */ 80c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath 81c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath Flags = internal::traits<Derived>::Flags, 82c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath /**< This stores expression \ref flags flags which may or may not be inherited by new expressions 83c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath * constructed from this one. See the \ref flags "list of flags". 84c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath */ 85c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath 86c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath CoeffReadCost = internal::traits<Derived>::CoeffReadCost, 87c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath /**< This is a rough measure of how expensive it is to read one coefficient from 88c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath * this expression. 89c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath */ 90c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath 91c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath IsRowMajor = Flags&RowMajorBit ? 1 : 0, 92c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath 93c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath #ifndef EIGEN_PARSED_BY_DOXYGEN 94c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath _HasDirectAccess = (int(Flags)&DirectAccessBit) ? 1 : 0 // workaround sunCC 95c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath #endif 96c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath }; 97c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath 98c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath /** \internal the return type of MatrixBase::adjoint() */ 99c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath typedef typename internal::conditional<NumTraits<Scalar>::IsComplex, 100c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath CwiseUnaryOp<internal::scalar_conjugate_op<Scalar>, Eigen::Transpose<const Derived> >, 101c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath Transpose<const Derived> 102c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath >::type AdjointReturnType; 103c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath 104c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath 105c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath typedef SparseMatrix<Scalar, Flags&RowMajorBit ? RowMajor : ColMajor> PlainObject; 106c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath 107c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath 108c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath#ifndef EIGEN_PARSED_BY_DOXYGEN 109c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath /** This is the "real scalar" type; if the \a Scalar type is already real numbers 110c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath * (e.g. int, float or double) then \a RealScalar is just the same as \a Scalar. If 111c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath * \a Scalar is \a std::complex<T> then RealScalar is \a T. 112c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath * 113c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath * \sa class NumTraits 114c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath */ 115c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath typedef typename NumTraits<Scalar>::Real RealScalar; 116c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath 117c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath /** \internal the return type of coeff() 118c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath */ 119c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath typedef typename internal::conditional<_HasDirectAccess, const Scalar&, Scalar>::type CoeffReturnType; 120c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath 121c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath /** \internal Represents a matrix with all coefficients equal to one another*/ 122c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath typedef CwiseNullaryOp<internal::scalar_constant_op<Scalar>,Matrix<Scalar,Dynamic,Dynamic> > ConstantReturnType; 123c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath 124c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath /** type of the equivalent square matrix */ 125c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath typedef Matrix<Scalar,EIGEN_SIZE_MAX(RowsAtCompileTime,ColsAtCompileTime), 126c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath EIGEN_SIZE_MAX(RowsAtCompileTime,ColsAtCompileTime)> SquareMatrixType; 127c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath 128c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath inline const Derived& derived() const { return *static_cast<const Derived*>(this); } 129c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath inline Derived& derived() { return *static_cast<Derived*>(this); } 130c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath inline Derived& const_cast_derived() const 131c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath { return *static_cast<Derived*>(const_cast<SparseMatrixBase*>(this)); } 132c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath#endif // not EIGEN_PARSED_BY_DOXYGEN 133c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath 134c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath#define EIGEN_CURRENT_STORAGE_BASE_CLASS Eigen::SparseMatrixBase 135c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath# include "../plugins/CommonCwiseUnaryOps.h" 136c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath# include "../plugins/CommonCwiseBinaryOps.h" 137c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath# include "../plugins/MatrixCwiseUnaryOps.h" 138c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath# include "../plugins/MatrixCwiseBinaryOps.h" 139c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath# ifdef EIGEN_SPARSEMATRIXBASE_PLUGIN 140c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath# include EIGEN_SPARSEMATRIXBASE_PLUGIN 141c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath# endif 142c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath# undef EIGEN_CURRENT_STORAGE_BASE_CLASS 143c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath#undef EIGEN_CURRENT_STORAGE_BASE_CLASS 144c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath 145c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath 146c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath /** \returns the number of rows. \sa cols() */ 147c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath inline Index rows() const { return derived().rows(); } 148c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath /** \returns the number of columns. \sa rows() */ 149c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath inline Index cols() const { return derived().cols(); } 150c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath /** \returns the number of coefficients, which is \a rows()*cols(). 151c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath * \sa rows(), cols(). */ 152c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath inline Index size() const { return rows() * cols(); } 153c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath /** \returns the number of nonzero coefficients which is in practice the number 154c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath * of stored coefficients. */ 155c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath inline Index nonZeros() const { return derived().nonZeros(); } 156c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath /** \returns true if either the number of rows or the number of columns is equal to 1. 157c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath * In other words, this function returns 158c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath * \code rows()==1 || cols()==1 \endcode 159c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath * \sa rows(), cols(), IsVectorAtCompileTime. */ 160c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath inline bool isVector() const { return rows()==1 || cols()==1; } 161c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath /** \returns the size of the storage major dimension, 162c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath * i.e., the number of columns for a columns major matrix, and the number of rows otherwise */ 163c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath Index outerSize() const { return (int(Flags)&RowMajorBit) ? this->rows() : this->cols(); } 164c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath /** \returns the size of the inner dimension according to the storage order, 165c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath * i.e., the number of rows for a columns major matrix, and the number of cols otherwise */ 166c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath Index innerSize() const { return (int(Flags)&RowMajorBit) ? this->cols() : this->rows(); } 167c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath 168c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath bool isRValue() const { return m_isRValue; } 169c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath Derived& markAsRValue() { m_isRValue = true; return derived(); } 170c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath 171c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath SparseMatrixBase() : m_isRValue(false) { /* TODO check flags */ } 172c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath 173c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath 174c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath template<typename OtherDerived> 175c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath Derived& operator=(const ReturnByValue<OtherDerived>& other) 176c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath { 177c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath other.evalTo(derived()); 178c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath return derived(); 179c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath } 180c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath 181c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath 182c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath template<typename OtherDerived> 183c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath inline Derived& operator=(const SparseMatrixBase<OtherDerived>& other) 184c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath { 185c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath return assign(other.derived()); 186c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath } 187c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath 188c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath inline Derived& operator=(const Derived& other) 189c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath { 190c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath// if (other.isRValue()) 191c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath// derived().swap(other.const_cast_derived()); 192c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath// else 193c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath return assign(other.derived()); 194c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath } 195c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath 196c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath protected: 197c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath 198c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath template<typename OtherDerived> 199c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath inline Derived& assign(const OtherDerived& other) 200c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath { 201c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath const bool transpose = (Flags & RowMajorBit) != (OtherDerived::Flags & RowMajorBit); 202c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath const Index outerSize = (int(OtherDerived::Flags) & RowMajorBit) ? other.rows() : other.cols(); 203c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath if ((!transpose) && other.isRValue()) 204c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath { 205c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath // eval without temporary 206c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath derived().resize(other.rows(), other.cols()); 207c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath derived().setZero(); 208c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath derived().reserve((std::max)(this->rows(),this->cols())*2); 209c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath for (Index j=0; j<outerSize; ++j) 210c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath { 211c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath derived().startVec(j); 212c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath for (typename OtherDerived::InnerIterator it(other, j); it; ++it) 213c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath { 214c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath Scalar v = it.value(); 215c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath derived().insertBackByOuterInner(j,it.index()) = v; 216c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath } 217c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath } 218c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath derived().finalize(); 219c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath } 220c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath else 221c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath { 222c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath assignGeneric(other); 223c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath } 224c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath return derived(); 225c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath } 226c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath 227c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath template<typename OtherDerived> 228c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath inline void assignGeneric(const OtherDerived& other) 229c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath { 230c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath //const bool transpose = (Flags & RowMajorBit) != (OtherDerived::Flags & RowMajorBit); 231c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath eigen_assert(( ((internal::traits<Derived>::SupportedAccessPatterns&OuterRandomAccessPattern)==OuterRandomAccessPattern) || 232c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath (!((Flags & RowMajorBit) != (OtherDerived::Flags & RowMajorBit)))) && 233c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath "the transpose operation is supposed to be handled in SparseMatrix::operator="); 234c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath 235c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath enum { Flip = (Flags & RowMajorBit) != (OtherDerived::Flags & RowMajorBit) }; 236c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath 237c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath const Index outerSize = other.outerSize(); 238c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath //typedef typename internal::conditional<transpose, LinkedVectorMatrix<Scalar,Flags&RowMajorBit>, Derived>::type TempType; 239c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath // thanks to shallow copies, we always eval to a tempary 240c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath Derived temp(other.rows(), other.cols()); 241c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath 242c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath temp.reserve((std::max)(this->rows(),this->cols())*2); 243c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath for (Index j=0; j<outerSize; ++j) 244c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath { 245c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath temp.startVec(j); 246c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath for (typename OtherDerived::InnerIterator it(other.derived(), j); it; ++it) 247c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath { 248c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath Scalar v = it.value(); 249c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath temp.insertBackByOuterInner(Flip?it.index():j,Flip?j:it.index()) = v; 250c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath } 251c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath } 252c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath temp.finalize(); 253c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath 254c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath derived() = temp.markAsRValue(); 255c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath } 256c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath 257c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath public: 258c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath 259c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath template<typename Lhs, typename Rhs> 260c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath inline Derived& operator=(const SparseSparseProduct<Lhs,Rhs>& product); 261c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath 262c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath friend std::ostream & operator << (std::ostream & s, const SparseMatrixBase& m) 263c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath { 264c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath typedef typename Derived::Nested Nested; 265c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath typedef typename internal::remove_all<Nested>::type NestedCleaned; 266c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath 267c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath if (Flags&RowMajorBit) 268c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath { 269c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath const Nested nm(m.derived()); 270c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath for (Index row=0; row<nm.outerSize(); ++row) 271c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath { 272c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath Index col = 0; 273c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath for (typename NestedCleaned::InnerIterator it(nm.derived(), row); it; ++it) 274c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath { 275c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath for ( ; col<it.index(); ++col) 276c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath s << "0 "; 277c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath s << it.value() << " "; 278c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath ++col; 279c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath } 280c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath for ( ; col<m.cols(); ++col) 281c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath s << "0 "; 282c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath s << std::endl; 283c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath } 284c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath } 285c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath else 286c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath { 287c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath const Nested nm(m.derived()); 288c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath if (m.cols() == 1) { 289c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath Index row = 0; 290c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath for (typename NestedCleaned::InnerIterator it(nm.derived(), 0); it; ++it) 291c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath { 292c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath for ( ; row<it.index(); ++row) 293c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath s << "0" << std::endl; 294c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath s << it.value() << std::endl; 295c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath ++row; 296c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath } 297c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath for ( ; row<m.rows(); ++row) 298c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath s << "0" << std::endl; 299c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath } 300c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath else 301c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath { 302c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath SparseMatrix<Scalar, RowMajorBit> trans = m; 303c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath s << static_cast<const SparseMatrixBase<SparseMatrix<Scalar, RowMajorBit> >&>(trans); 304c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath } 305c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath } 306c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath return s; 307c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath } 308c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath 309c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath template<typename OtherDerived> 310c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath Derived& operator+=(const SparseMatrixBase<OtherDerived>& other); 311c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath template<typename OtherDerived> 312c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath Derived& operator-=(const SparseMatrixBase<OtherDerived>& other); 313c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath 314c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath Derived& operator*=(const Scalar& other); 315c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath Derived& operator/=(const Scalar& other); 316c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath 317c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath #define EIGEN_SPARSE_CWISE_PRODUCT_RETURN_TYPE \ 318c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath CwiseBinaryOp< \ 319c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath internal::scalar_product_op< \ 320c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath typename internal::scalar_product_traits< \ 321c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath typename internal::traits<Derived>::Scalar, \ 322c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath typename internal::traits<OtherDerived>::Scalar \ 323c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath >::ReturnType \ 324c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath >, \ 325c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath Derived, \ 326c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath OtherDerived \ 327c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath > 328c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath 329c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath template<typename OtherDerived> 330c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath EIGEN_STRONG_INLINE const EIGEN_SPARSE_CWISE_PRODUCT_RETURN_TYPE 331c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath cwiseProduct(const MatrixBase<OtherDerived> &other) const; 332c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath 333c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath // sparse * sparse 334c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath template<typename OtherDerived> 335c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath const typename SparseSparseProductReturnType<Derived,OtherDerived>::Type 336c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath operator*(const SparseMatrixBase<OtherDerived> &other) const; 337c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath 338c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath // sparse * diagonal 339c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath template<typename OtherDerived> 340c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath const SparseDiagonalProduct<Derived,OtherDerived> 341c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath operator*(const DiagonalBase<OtherDerived> &other) const; 342c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath 343c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath // diagonal * sparse 344c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath template<typename OtherDerived> friend 345c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath const SparseDiagonalProduct<OtherDerived,Derived> 346c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath operator*(const DiagonalBase<OtherDerived> &lhs, const SparseMatrixBase& rhs) 347c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath { return SparseDiagonalProduct<OtherDerived,Derived>(lhs.derived(), rhs.derived()); } 348c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath 349c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath /** dense * sparse (return a dense object unless it is an outer product) */ 350c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath template<typename OtherDerived> friend 351c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath const typename DenseSparseProductReturnType<OtherDerived,Derived>::Type 352c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath operator*(const MatrixBase<OtherDerived>& lhs, const Derived& rhs) 353c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath { return typename DenseSparseProductReturnType<OtherDerived,Derived>::Type(lhs.derived(),rhs); } 354c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath 355c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath /** sparse * dense (returns a dense object unless it is an outer product) */ 356c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath template<typename OtherDerived> 357c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath const typename SparseDenseProductReturnType<Derived,OtherDerived>::Type 358c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath operator*(const MatrixBase<OtherDerived> &other) const; 359c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath 360c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath /** \returns an expression of P H P^-1 where H is the matrix represented by \c *this */ 361c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath SparseSymmetricPermutationProduct<Derived,Upper|Lower> twistedBy(const PermutationMatrix<Dynamic,Dynamic,Index>& perm) const 362c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath { 363c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath return SparseSymmetricPermutationProduct<Derived,Upper|Lower>(derived(), perm); 364c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath } 365c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath 366c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath template<typename OtherDerived> 367c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath Derived& operator*=(const SparseMatrixBase<OtherDerived>& other); 368c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath 369c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath #ifdef EIGEN2_SUPPORT 370c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath // deprecated 371c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath template<typename OtherDerived> 372c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath typename internal::plain_matrix_type_column_major<OtherDerived>::type 373c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath solveTriangular(const MatrixBase<OtherDerived>& other) const; 374c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath 375c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath // deprecated 376c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath template<typename OtherDerived> 377c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath void solveTriangularInPlace(MatrixBase<OtherDerived>& other) const; 378c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath #endif // EIGEN2_SUPPORT 379c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath 380c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath template<int Mode> 381c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath inline const SparseTriangularView<Derived, Mode> triangularView() const; 382c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath 383c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath template<unsigned int UpLo> inline const SparseSelfAdjointView<Derived, UpLo> selfadjointView() const; 384c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath template<unsigned int UpLo> inline SparseSelfAdjointView<Derived, UpLo> selfadjointView(); 385c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath 386c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath template<typename OtherDerived> Scalar dot(const MatrixBase<OtherDerived>& other) const; 387c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath template<typename OtherDerived> Scalar dot(const SparseMatrixBase<OtherDerived>& other) const; 388c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath RealScalar squaredNorm() const; 389c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath RealScalar norm() const; 390c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath 391c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath Transpose<Derived> transpose() { return derived(); } 392c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath const Transpose<const Derived> transpose() const { return derived(); } 393c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath const AdjointReturnType adjoint() const { return transpose(); } 394c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath 395c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath // sub-vector 396c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath SparseInnerVectorSet<Derived,1> row(Index i); 397c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath const SparseInnerVectorSet<Derived,1> row(Index i) const; 398c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath SparseInnerVectorSet<Derived,1> col(Index j); 399c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath const SparseInnerVectorSet<Derived,1> col(Index j) const; 400c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath SparseInnerVectorSet<Derived,1> innerVector(Index outer); 401c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath const SparseInnerVectorSet<Derived,1> innerVector(Index outer) const; 402c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath 403c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath // set of sub-vectors 404c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath SparseInnerVectorSet<Derived,Dynamic> subrows(Index start, Index size); 405c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath const SparseInnerVectorSet<Derived,Dynamic> subrows(Index start, Index size) const; 406c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath SparseInnerVectorSet<Derived,Dynamic> subcols(Index start, Index size); 407c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath const SparseInnerVectorSet<Derived,Dynamic> subcols(Index start, Index size) const; 408c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath 409c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath SparseInnerVectorSet<Derived,Dynamic> middleRows(Index start, Index size); 410c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath const SparseInnerVectorSet<Derived,Dynamic> middleRows(Index start, Index size) const; 411c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath SparseInnerVectorSet<Derived,Dynamic> middleCols(Index start, Index size); 412c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath const SparseInnerVectorSet<Derived,Dynamic> middleCols(Index start, Index size) const; 413c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath SparseInnerVectorSet<Derived,Dynamic> innerVectors(Index outerStart, Index outerSize); 414c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath const SparseInnerVectorSet<Derived,Dynamic> innerVectors(Index outerStart, Index outerSize) const; 415c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath 416c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath /** \internal use operator= */ 417c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath template<typename DenseDerived> 418c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath void evalTo(MatrixBase<DenseDerived>& dst) const 419c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath { 420c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath dst.setZero(); 421c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath for (Index j=0; j<outerSize(); ++j) 422c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath for (typename Derived::InnerIterator i(derived(),j); i; ++i) 423c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath dst.coeffRef(i.row(),i.col()) = i.value(); 424c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath } 425c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath 426c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath Matrix<Scalar,RowsAtCompileTime,ColsAtCompileTime> toDense() const 427c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath { 428c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath return derived(); 429c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath } 430c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath 431c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath template<typename OtherDerived> 432c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath bool isApprox(const SparseMatrixBase<OtherDerived>& other, 433c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath RealScalar prec = NumTraits<Scalar>::dummy_precision()) const 434c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath { return toDense().isApprox(other.toDense(),prec); } 435c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath 436c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath template<typename OtherDerived> 437c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath bool isApprox(const MatrixBase<OtherDerived>& other, 438c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath RealScalar prec = NumTraits<Scalar>::dummy_precision()) const 439c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath { return toDense().isApprox(other,prec); } 440c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath 441c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath /** \returns the matrix or vector obtained by evaluating this expression. 442c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath * 443c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath * Notice that in the case of a plain matrix or vector (not an expression) this function just returns 444c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath * a const reference, in order to avoid a useless copy. 445c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath */ 446c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath inline const typename internal::eval<Derived>::type eval() const 447c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath { return typename internal::eval<Derived>::type(derived()); } 448c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath 449c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath Scalar sum() const; 450c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath 451c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath protected: 452c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath 453c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath bool m_isRValue; 454c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath}; 455c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath 456c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath} // end namespace Eigen 457c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath 458c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath#endif // EIGEN_SPARSEMATRIXBASE_H 459