// This file is part of Eigen, a lightweight C++ template library // for linear algebra. // // Copyright (C) 2008-2010 Gael Guennebaud // // Eigen is free software; you can redistribute it and/or // modify it under the terms of the GNU Lesser General Public // License as published by the Free Software Foundation; either // version 3 of the License, or (at your option) any later version. // // Alternatively, you can redistribute it and/or // modify it under the terms of the GNU General Public License as // published by the Free Software Foundation; either version 2 of // the License, or (at your option) any later version. // // Eigen is distributed in the hope that it will be useful, but WITHOUT ANY // WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS // FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License or the // GNU General Public License for more details. // // You should have received a copy of the GNU Lesser General Public // License and a copy of the GNU General Public License along with // Eigen. If not, see . #ifndef EIGEN_SPARSE_CWISE_UNARY_OP_H #define EIGEN_SPARSE_CWISE_UNARY_OP_H // template // struct internal::traits > : internal::traits // { // typedef typename internal::result_of< // UnaryOp(typename MatrixType::Scalar) // >::type Scalar; // typedef typename MatrixType::Nested MatrixTypeNested; // typedef typename internal::unref::type _MatrixTypeNested; // enum { // CoeffReadCost = _MatrixTypeNested::CoeffReadCost + internal::functor_traits::Cost // }; // }; template class CwiseUnaryOpImpl : public SparseMatrixBase > { public: class InnerIterator; // typedef typename internal::unref::type _LhsNested; typedef CwiseUnaryOp Derived; EIGEN_SPARSE_PUBLIC_INTERFACE(Derived) }; template class CwiseUnaryOpImpl::InnerIterator { typedef typename CwiseUnaryOpImpl::Scalar Scalar; typedef typename internal::traits::_XprTypeNested _MatrixTypeNested; typedef typename _MatrixTypeNested::InnerIterator MatrixTypeIterator; typedef typename MatrixType::Index Index; public: EIGEN_STRONG_INLINE InnerIterator(const CwiseUnaryOpImpl& unaryOp, Index outer) : m_iter(unaryOp.derived().nestedExpression(),outer), m_functor(unaryOp.derived().functor()) {} EIGEN_STRONG_INLINE InnerIterator& operator++() { ++m_iter; return *this; } EIGEN_STRONG_INLINE Scalar value() const { return m_functor(m_iter.value()); } EIGEN_STRONG_INLINE Index index() const { return m_iter.index(); } EIGEN_STRONG_INLINE Index row() const { return m_iter.row(); } EIGEN_STRONG_INLINE Index col() const { return m_iter.col(); } EIGEN_STRONG_INLINE operator bool() const { return m_iter; } protected: MatrixTypeIterator m_iter; const UnaryOp m_functor; }; template class CwiseUnaryViewImpl : public SparseMatrixBase > { public: class InnerIterator; // typedef typename internal::unref::type _LhsNested; typedef CwiseUnaryView Derived; EIGEN_SPARSE_PUBLIC_INTERFACE(Derived) }; template class CwiseUnaryViewImpl::InnerIterator { typedef typename CwiseUnaryViewImpl::Scalar Scalar; typedef typename internal::traits::_MatrixTypeNested _MatrixTypeNested; typedef typename _MatrixTypeNested::InnerIterator MatrixTypeIterator; typedef typename MatrixType::Index Index; public: EIGEN_STRONG_INLINE InnerIterator(const CwiseUnaryViewImpl& unaryView, Index outer) : m_iter(unaryView.derived().nestedExpression(),outer), m_functor(unaryView.derived().functor()) {} EIGEN_STRONG_INLINE InnerIterator& operator++() { ++m_iter; return *this; } EIGEN_STRONG_INLINE Scalar value() const { return m_functor(m_iter.value()); } EIGEN_STRONG_INLINE Scalar& valueRef() { return m_functor(m_iter.valueRef()); } EIGEN_STRONG_INLINE Index index() const { return m_iter.index(); } EIGEN_STRONG_INLINE Index row() const { return m_iter.row(); } EIGEN_STRONG_INLINE Index col() const { return m_iter.col(); } EIGEN_STRONG_INLINE operator bool() const { return m_iter; } protected: MatrixTypeIterator m_iter; const ViewOp m_functor; }; template EIGEN_STRONG_INLINE Derived& SparseMatrixBase::operator*=(const Scalar& other) { for (Index j=0; j EIGEN_STRONG_INLINE Derived& SparseMatrixBase::operator/=(const Scalar& other) { for (Index j=0; j