diff options
author | Gael Guennebaud <g.gael@free.fr> | 2009-11-16 19:39:29 +0100 |
---|---|---|
committer | Gael Guennebaud <g.gael@free.fr> | 2009-11-16 19:39:29 +0100 |
commit | 1c9a2d246f761c5428f3d90841652d31a0b6431f (patch) | |
tree | 1accff3aa4d9a0e528befb5d484a288e2fff235b /Eigen | |
parent | 2a3a6fe45e8207840c2b3295d823f941e51d392a (diff) |
adapt CwiseUnaryOp and CwiseUnaryView
Diffstat (limited to 'Eigen')
-rw-r--r-- | Eigen/src/Core/CwiseUnaryOp.h | 172 | ||||
-rw-r--r-- | Eigen/src/Core/CwiseUnaryOps.h | 158 | ||||
-rw-r--r-- | Eigen/src/Core/CwiseUnaryView.h | 81 | ||||
-rw-r--r-- | Eigen/src/Core/MatrixBase.h | 69 | ||||
-rw-r--r-- | Eigen/src/Sparse/SparseCwiseUnaryOp.h | 84 | ||||
-rw-r--r-- | Eigen/src/Sparse/SparseMatrixBase.h | 54 |
6 files changed, 324 insertions, 294 deletions
diff --git a/Eigen/src/Core/CwiseUnaryOp.h b/Eigen/src/Core/CwiseUnaryOp.h index 03011800c..e5a91ca04 100644 --- a/Eigen/src/Core/CwiseUnaryOp.h +++ b/Eigen/src/Core/CwiseUnaryOp.h @@ -56,13 +56,17 @@ struct ei_traits<CwiseUnaryOp<UnaryOp, MatrixType> > }; }; +template<typename UnaryOp, typename MatrixType, typename StorageType> +class CwiseUnaryOpImpl; + template<typename UnaryOp, typename MatrixType> class CwiseUnaryOp : ei_no_assignment_operator, - public MatrixBase<CwiseUnaryOp<UnaryOp, MatrixType> > + public CwiseUnaryOpImpl<UnaryOp, MatrixType, typename ei_traits<MatrixType>::StorageType> { public: - EIGEN_GENERIC_PUBLIC_INTERFACE(CwiseUnaryOp) + typedef typename CwiseUnaryOpImpl<UnaryOp, MatrixType,typename ei_traits<MatrixType>::StorageType>::Base Base; + EIGEN_GENERIC_PUBLIC_INTERFACE_NEW(CwiseUnaryOp) inline CwiseUnaryOp(const MatrixType& mat, const UnaryOp& func = UnaryOp()) : m_matrix(mat), m_functor(func) {} @@ -70,68 +74,60 @@ class CwiseUnaryOp : ei_no_assignment_operator, EIGEN_STRONG_INLINE int rows() const { return m_matrix.rows(); } EIGEN_STRONG_INLINE int cols() const { return m_matrix.cols(); } + /** \internal used for introspection */ + const UnaryOp& _functor() const { return m_functor; } + + /** \internal used for introspection */ + const typename ei_cleantype<typename MatrixType::Nested>::type& + _expression() const { return m_matrix; } + + const typename ei_cleantype<typename MatrixType::Nested>::type& + nestedExpression() const { return m_matrix; } + + typename ei_cleantype<typename MatrixType::Nested>::type& + nestedExpression() { return m_matrix.const_cast_derived(); } + + protected: + const typename MatrixType::Nested m_matrix; + const UnaryOp m_functor; +}; + +template<typename UnaryOp, typename MatrixType> +class CwiseUnaryOpImpl<UnaryOp,MatrixType,Dense> : public MatrixBase<CwiseUnaryOp<UnaryOp, MatrixType> > +{ + const typename ei_cleantype<typename MatrixType::Nested>::type& matrix() const + { return derived().nestedExpression(); } + typename ei_cleantype<typename MatrixType::Nested>::type& matrix() + { return derived().nestedExpression(); } + + public: + + typedef CwiseUnaryOp<UnaryOp, MatrixType> Derived; + EIGEN_DENSE_PUBLIC_INTERFACE( Derived ) + EIGEN_STRONG_INLINE const Scalar coeff(int row, int col) const { - return m_functor(m_matrix.coeff(row, col)); + return derived()._functor()(matrix().coeff(row, col)); } template<int LoadMode> EIGEN_STRONG_INLINE PacketScalar packet(int row, int col) const { - return m_functor.packetOp(m_matrix.template packet<LoadMode>(row, col)); + return derived()._functor().packetOp(matrix().template packet<LoadMode>(row, col)); } EIGEN_STRONG_INLINE const Scalar coeff(int index) const { - return m_functor(m_matrix.coeff(index)); + return derived()._functor()(matrix().coeff(index)); } template<int LoadMode> EIGEN_STRONG_INLINE PacketScalar packet(int index) const { - return m_functor.packetOp(m_matrix.template packet<LoadMode>(index)); + return derived()._functor().packetOp(matrix().template packet<LoadMode>(index)); } - - /** \internal used for introspection */ - const UnaryOp& _functor() const { return m_functor; } - - /** \internal used for introspection */ - const typename ei_cleantype<typename MatrixType::Nested>::type& - _expression() const { return m_matrix; } - - protected: - const typename MatrixType::Nested m_matrix; - const UnaryOp m_functor; }; -/** \returns an expression of a custom coefficient-wise unary operator \a func of *this - * - * The template parameter \a CustomUnaryOp is the type of the functor - * of the custom unary operator. - * - * Example: - * \include class_CwiseUnaryOp.cpp - * Output: \verbinclude class_CwiseUnaryOp.out - * - * \sa class CwiseUnaryOp, class CwiseBinarOp, MatrixBase::operator-, Cwise::abs - */ -template<typename Derived> -template<typename CustomUnaryOp> -EIGEN_STRONG_INLINE const CwiseUnaryOp<CustomUnaryOp, Derived> -MatrixBase<Derived>::unaryExpr(const CustomUnaryOp& func) const -{ - return CwiseUnaryOp<CustomUnaryOp, Derived>(derived(), func); -} - -/** \returns an expression of the opposite of \c *this - */ -template<typename Derived> -EIGEN_STRONG_INLINE const CwiseUnaryOp<ei_scalar_opposite_op<typename ei_traits<Derived>::Scalar>,Derived> -MatrixBase<Derived>::operator-() const -{ - return derived(); -} - /** \returns an expression of the coefficient-wise absolute value of \c *this * * Example: \include Cwise_abs.cpp @@ -160,49 +156,6 @@ Cwise<ExpressionType>::abs2() const return _expression(); } -/** \returns an expression of the complex conjugate of \c *this. - * - * \sa adjoint() */ -template<typename Derived> -EIGEN_STRONG_INLINE typename MatrixBase<Derived>::ConjugateReturnType -MatrixBase<Derived>::conjugate() const -{ - return ConjugateReturnType(derived()); -} - -/** \returns a read-only expression of the real part of \c *this. - * - * \sa imag() */ -template<typename Derived> -EIGEN_STRONG_INLINE typename MatrixBase<Derived>::RealReturnType -MatrixBase<Derived>::real() const { return derived(); } - -/** \returns an read-only expression of the imaginary part of \c *this. - * - * \sa real() */ -template<typename Derived> -EIGEN_STRONG_INLINE const typename MatrixBase<Derived>::ImagReturnType -MatrixBase<Derived>::imag() const { return derived(); } - -/** \returns an expression of *this with the \a Scalar type casted to - * \a NewScalar. - * - * The template parameter \a NewScalar is the type we are casting the scalars to. - * - * \sa class CwiseUnaryOp - */ -template<typename Derived> -template<typename NewType> -EIGEN_STRONG_INLINE -typename ei_cast_return_type< - Derived, - const CwiseUnaryOp<ei_scalar_cast_op<typename ei_traits<Derived>::Scalar, NewType>, Derived> - >::type -MatrixBase<Derived>::cast() const -{ - return derived(); -} - /** \returns an expression of the coefficient-wise exponential of *this. * * Example: \include Cwise_exp.cpp @@ -231,47 +184,4 @@ Cwise<ExpressionType>::log() const return _expression(); } - -/** \returns an expression of \c *this scaled by the scalar factor \a scalar */ -template<typename Derived> -EIGEN_STRONG_INLINE const typename MatrixBase<Derived>::ScalarMultipleReturnType -MatrixBase<Derived>::operator*(const Scalar& scalar) const -{ - return CwiseUnaryOp<ei_scalar_multiple_op<Scalar>, Derived> - (derived(), ei_scalar_multiple_op<Scalar>(scalar)); -} - -/** Overloaded for efficient real matrix times complex scalar value */ -template<typename Derived> -EIGEN_STRONG_INLINE const CwiseUnaryOp<ei_scalar_multiple2_op<typename ei_traits<Derived>::Scalar, - std::complex<typename ei_traits<Derived>::Scalar> >, Derived> -MatrixBase<Derived>::operator*(const std::complex<Scalar>& scalar) const -{ - return CwiseUnaryOp<ei_scalar_multiple2_op<Scalar,std::complex<Scalar> >, Derived> - (*static_cast<const Derived*>(this), ei_scalar_multiple2_op<Scalar,std::complex<Scalar> >(scalar)); -} - -/** \returns an expression of \c *this divided by the scalar value \a scalar */ -template<typename Derived> -EIGEN_STRONG_INLINE const CwiseUnaryOp<ei_scalar_quotient1_op<typename ei_traits<Derived>::Scalar>, Derived> -MatrixBase<Derived>::operator/(const Scalar& scalar) const -{ - return CwiseUnaryOp<ei_scalar_quotient1_op<Scalar>, Derived> - (derived(), ei_scalar_quotient1_op<Scalar>(scalar)); -} - -template<typename Derived> -EIGEN_STRONG_INLINE Derived& -MatrixBase<Derived>::operator*=(const Scalar& other) -{ - return *this = *this * other; -} - -template<typename Derived> -EIGEN_STRONG_INLINE Derived& -MatrixBase<Derived>::operator/=(const Scalar& other) -{ - return *this = *this / other; -} - #endif // EIGEN_CWISE_UNARY_OP_H diff --git a/Eigen/src/Core/CwiseUnaryOps.h b/Eigen/src/Core/CwiseUnaryOps.h new file mode 100644 index 000000000..205677a6a --- /dev/null +++ b/Eigen/src/Core/CwiseUnaryOps.h @@ -0,0 +1,158 @@ + +#ifndef EIGEN_PARSED_BY_DOXYGEN + /** \internal Represents a scalar multiple of a matrix */ + typedef CwiseUnaryOp<ei_scalar_multiple_op<Scalar>, Derived> ScalarMultipleReturnType; + /** \internal Represents a quotient of a matrix by a scalar*/ + typedef CwiseUnaryOp<ei_scalar_quotient1_op<Scalar>, Derived> ScalarQuotient1ReturnType; + /** \internal the return type of MatrixBase::conjugate() */ + typedef typename ei_meta_if<NumTraits<Scalar>::IsComplex, + const CwiseUnaryOp<ei_scalar_conjugate_op<Scalar>, Derived>, + const Derived& + >::ret ConjugateReturnType; + /** \internal the return type of MatrixBase::real() const */ + typedef typename ei_meta_if<NumTraits<Scalar>::IsComplex, + const CwiseUnaryOp<ei_scalar_real_op<Scalar>, Derived>, + const Derived& + >::ret RealReturnType; + /** \internal the return type of MatrixBase::real() */ + typedef typename ei_meta_if<NumTraits<Scalar>::IsComplex, + CwiseUnaryView<ei_scalar_real_op<Scalar>, Derived>, + Derived& + >::ret NonConstRealReturnType; + /** \internal the return type of MatrixBase::imag() const */ + typedef CwiseUnaryOp<ei_scalar_imag_op<Scalar>, Derived> ImagReturnType; + /** \internal the return type of MatrixBase::imag() */ + typedef CwiseUnaryView<ei_scalar_imag_op<Scalar>, Derived> NonConstImagReturnType; +#endif // not EIGEN_PARSED_BY_DOXYGEN + + /** \returns an expression of the opposite of \c *this + */ + EIGEN_STRONG_INLINE const CwiseUnaryOp<ei_scalar_opposite_op<typename ei_traits<Derived>::Scalar>,Derived> + operator-() const { return derived(); } + + EIGEN_STRONG_INLINE Derived& operator*=(const Scalar& other) + { return *this = *this * other; } + EIGEN_STRONG_INLINE Derived& operator/=(const Scalar& other) + { return *this = *this / other; } + + /** \returns an expression of \c *this scaled by the scalar factor \a scalar */ + EIGEN_STRONG_INLINE const ScalarMultipleReturnType + operator*(const Scalar& scalar) const + { + return CwiseUnaryOp<ei_scalar_multiple_op<Scalar>, Derived> + (derived(), ei_scalar_multiple_op<Scalar>(scalar)); + } + + #ifdef EIGEN_PARSED_BY_DOXYGEN + const ScalarMultipleReturnType operator*(const RealScalar& scalar) const; + #endif + + /** \returns an expression of \c *this divided by the scalar value \a scalar */ + EIGEN_STRONG_INLINE const CwiseUnaryOp<ei_scalar_quotient1_op<typename ei_traits<Derived>::Scalar>, Derived> + operator/(const Scalar& scalar) const + { + return CwiseUnaryOp<ei_scalar_quotient1_op<Scalar>, Derived> + (derived(), ei_scalar_quotient1_op<Scalar>(scalar)); + } + + /** Overloaded for efficient real matrix times complex scalar value */ + EIGEN_STRONG_INLINE const CwiseUnaryOp<ei_scalar_multiple2_op<Scalar,std::complex<Scalar> >, Derived> + operator*(const std::complex<Scalar>& scalar) const + { + return CwiseUnaryOp<ei_scalar_multiple2_op<Scalar,std::complex<Scalar> >, Derived> + (*static_cast<const Derived*>(this), ei_scalar_multiple2_op<Scalar,std::complex<Scalar> >(scalar)); + } + + inline friend const ScalarMultipleReturnType + operator*(const Scalar& scalar, const MatrixBase& matrix) + { return matrix*scalar; } + + inline friend const CwiseUnaryOp<ei_scalar_multiple2_op<Scalar,std::complex<Scalar> >, Derived> + operator*(const std::complex<Scalar>& scalar, const MatrixBase& matrix) + { return matrix*scalar; } + + /** \returns an expression of *this with the \a Scalar type casted to + * \a NewScalar. + * + * The template parameter \a NewScalar is the type we are casting the scalars to. + * + * \sa class CwiseUnaryOp + */ + template<typename NewType> + typename ei_cast_return_type<Derived,const CwiseUnaryOp<ei_scalar_cast_op<typename ei_traits<Derived>::Scalar, NewType>, Derived> >::type + cast() const + { + return derived(); + } + + /** \returns an expression of the complex conjugate of \c *this. + * + * \sa adjoint() */ + EIGEN_STRONG_INLINE ConjugateReturnType + conjugate() const + { + return ConjugateReturnType(derived()); + } + + /** \returns a read-only expression of the real part of \c *this. + * + * \sa imag() */ + EIGEN_STRONG_INLINE RealReturnType + real() const { return derived(); } + + /** \returns an read-only expression of the imaginary part of \c *this. + * + * \sa real() */ + EIGEN_STRONG_INLINE const ImagReturnType + imag() const { return derived(); } + + /** \returns an expression of a custom coefficient-wise unary operator \a func of *this + * + * The template parameter \a CustomUnaryOp is the type of the functor + * of the custom unary operator. + * + * Example: + * \include class_CwiseUnaryOp.cpp + * Output: \verbinclude class_CwiseUnaryOp.out + * + * \sa class CwiseUnaryOp, class CwiseBinarOp, MatrixBase::operator-, Cwise::abs + */ + template<typename CustomUnaryOp> + EIGEN_STRONG_INLINE const CwiseUnaryOp<CustomUnaryOp, Derived> + unaryExpr(const CustomUnaryOp& func = CustomUnaryOp()) const + { + return CwiseUnaryOp<CustomUnaryOp, Derived>(derived(), func); + } + + /** \returns an expression of a custom coefficient-wise unary operator \a func of *this + * + * The template parameter \a CustomUnaryOp is the type of the functor + * of the custom unary operator. + * + * Example: + * \include class_CwiseUnaryOp.cpp + * Output: \verbinclude class_CwiseUnaryOp.out + * + * \sa class CwiseUnaryOp, class CwiseBinarOp, MatrixBase::operator-, Cwise::abs + */ + template<typename CustomViewOp> + EIGEN_STRONG_INLINE const CwiseUnaryView<CustomViewOp, Derived> + unaryViewExpr(const CustomViewOp& func = CustomViewOp()) const + { + return CwiseUnaryView<CustomViewOp, Derived>(derived(), func); + } + + /** \returns a non const expression of the real part of \c *this. + * + * \sa imag() */ + EIGEN_STRONG_INLINE NonConstRealReturnType + real() { return derived(); } + + /** \returns a non const expression of the imaginary part of \c *this. + * + * \sa real() */ + EIGEN_STRONG_INLINE NonConstImagReturnType + imag() { return derived(); } + + const Cwise<Derived> cwise() const; + Cwise<Derived> cwise(); diff --git a/Eigen/src/Core/CwiseUnaryView.h b/Eigen/src/Core/CwiseUnaryView.h index 580344379..b21fa56c6 100644 --- a/Eigen/src/Core/CwiseUnaryView.h +++ b/Eigen/src/Core/CwiseUnaryView.h @@ -52,12 +52,17 @@ struct ei_traits<CwiseUnaryView<ViewOp, MatrixType> > }; }; +template<typename ViewOp, typename MatrixType, typename StorageType> +class CwiseUnaryViewImpl; + template<typename ViewOp, typename MatrixType> -class CwiseUnaryView : public MatrixBase<CwiseUnaryView<ViewOp, MatrixType> > +class CwiseUnaryView : ei_no_assignment_operator, + public CwiseUnaryViewImpl<ViewOp, MatrixType, typename ei_traits<MatrixType>::StorageType> { public: - EIGEN_GENERIC_PUBLIC_INTERFACE(CwiseUnaryView) + typedef typename CwiseUnaryViewImpl<ViewOp, MatrixType,typename ei_traits<MatrixType>::StorageType>::Base Base; + EIGEN_GENERIC_PUBLIC_INTERFACE_NEW(CwiseUnaryView) inline CwiseUnaryView(const MatrixType& mat, const ViewOp& func = ViewOp()) : m_matrix(mat), m_functor(func) {} @@ -67,63 +72,55 @@ class CwiseUnaryView : public MatrixBase<CwiseUnaryView<ViewOp, MatrixType> > EIGEN_STRONG_INLINE int rows() const { return m_matrix.rows(); } EIGEN_STRONG_INLINE int cols() const { return m_matrix.cols(); } + /** \internal used for introspection */ + const ViewOp& _functor() const { return m_functor; } + + const typename ei_cleantype<typename MatrixType::Nested>::type& + nestedExpression() const { return m_matrix; } + + typename ei_cleantype<typename MatrixType::Nested>::type& + nestedExpression() { return m_matrix.const_cast_derived(); } + + protected: + // FIXME changed from MatrixType::Nested because of a weird compilation error with sun CC + const typename ei_nested<MatrixType>::type m_matrix; + const ViewOp m_functor; +}; + +template<typename ViewOp, typename MatrixType> +class CwiseUnaryViewImpl<ViewOp,MatrixType,Dense> : public MatrixBase<CwiseUnaryView<ViewOp, MatrixType> > +{ + const typename ei_cleantype<typename MatrixType::Nested>::type& matrix() const + { return derived().nestedExpression(); } + typename ei_cleantype<typename MatrixType::Nested>::type& matrix() + { return derived().nestedExpression(); } + + public: + + typedef CwiseUnaryView<ViewOp, MatrixType> Derived; + EIGEN_DENSE_PUBLIC_INTERFACE( Derived ) + EIGEN_STRONG_INLINE const Scalar coeff(int row, int col) const { - return m_functor(m_matrix.coeff(row, col)); + return derived()._functor()(matrix().coeff(row, col)); } EIGEN_STRONG_INLINE const Scalar coeff(int index) const { - return m_functor(m_matrix.coeff(index)); + return derived()._functor()(matrix().coeff(index)); } EIGEN_STRONG_INLINE Scalar& coeffRef(int row, int col) { - return m_functor(m_matrix.const_cast_derived().coeffRef(row, col)); + return derived()._functor()(matrix().const_cast_derived().coeffRef(row, col)); } EIGEN_STRONG_INLINE Scalar& coeffRef(int index) { - return m_functor(m_matrix.const_cast_derived().coeffRef(index)); + return derived()._functor()(matrix().const_cast_derived().coeffRef(index)); } - - protected: - // FIXME changed from MatrixType::Nested because of a weird compilation error with sun CC - const typename ei_nested<MatrixType>::type m_matrix; - const ViewOp m_functor; }; -/** \returns an expression of a custom coefficient-wise unary operator \a func of *this - * - * The template parameter \a CustomUnaryOp is the type of the functor - * of the custom unary operator. - * - * Example: - * \include class_CwiseUnaryOp.cpp - * Output: \verbinclude class_CwiseUnaryOp.out - * - * \sa class CwiseUnaryOp, class CwiseBinarOp, MatrixBase::operator-, Cwise::abs - */ -template<typename Derived> -template<typename CustomViewOp> -EIGEN_STRONG_INLINE const CwiseUnaryView<CustomViewOp, Derived> -MatrixBase<Derived>::unaryViewExpr(const CustomViewOp& func) const -{ - return CwiseUnaryView<CustomViewOp, Derived>(derived(), func); -} - -/** \returns a non const expression of the real part of \c *this. - * - * \sa imag() */ -template<typename Derived> -EIGEN_STRONG_INLINE typename MatrixBase<Derived>::NonConstRealReturnType -MatrixBase<Derived>::real() { return derived(); } -/** \returns a non const expression of the imaginary part of \c *this. - * - * \sa real() */ -template<typename Derived> -EIGEN_STRONG_INLINE typename MatrixBase<Derived>::NonConstImagReturnType -MatrixBase<Derived>::imag() { return derived(); } #endif // EIGEN_CWISE_UNARY_VIEW_H diff --git a/Eigen/src/Core/MatrixBase.h b/Eigen/src/Core/MatrixBase.h index 17fdf10f2..55915d3e1 100644 --- a/Eigen/src/Core/MatrixBase.h +++ b/Eigen/src/Core/MatrixBase.h @@ -226,29 +226,6 @@ template<typename Derived> class MatrixBase /** \internal Represents a matrix with all coefficients equal to one another*/ typedef CwiseNullaryOp<ei_scalar_constant_op<Scalar>,Derived> ConstantReturnType; - /** \internal Represents a scalar multiple of a matrix */ - typedef CwiseUnaryOp<ei_scalar_multiple_op<Scalar>, Derived> ScalarMultipleReturnType; - /** \internal Represents a quotient of a matrix by a scalar*/ - typedef CwiseUnaryOp<ei_scalar_quotient1_op<Scalar>, Derived> ScalarQuotient1ReturnType; - /** \internal the return type of MatrixBase::conjugate() */ - typedef typename ei_meta_if<NumTraits<Scalar>::IsComplex, - const CwiseUnaryOp<ei_scalar_conjugate_op<Scalar>, Derived>, - const Derived& - >::ret ConjugateReturnType; - /** \internal the return type of MatrixBase::real() const */ - typedef typename ei_meta_if<NumTraits<Scalar>::IsComplex, - const CwiseUnaryOp<ei_scalar_real_op<Scalar>, Derived>, - const Derived& - >::ret RealReturnType; - /** \internal the return type of MatrixBase::real() */ - typedef typename ei_meta_if<NumTraits<Scalar>::IsComplex, - CwiseUnaryView<ei_scalar_real_op<Scalar>, Derived>, - Derived& - >::ret NonConstRealReturnType; - /** \internal the return type of MatrixBase::imag() const */ - typedef CwiseUnaryOp<ei_scalar_imag_op<Scalar>, Derived> ImagReturnType; - /** \internal the return type of MatrixBase::imag() */ - typedef CwiseUnaryView<ei_scalar_imag_op<Scalar>, Derived> NonConstImagReturnType; /** \internal the return type of MatrixBase::adjoint() */ typedef typename ei_meta_if<NumTraits<Scalar>::IsComplex, CwiseUnaryOp<ei_scalar_conjugate_op<Scalar>, NestByValue<Eigen::Transpose<Derived> > >, @@ -268,6 +245,7 @@ template<typename Derived> class MatrixBase ei_traits<Derived>::ColsAtCompileTime> BasisReturnType; #endif // not EIGEN_PARSED_BY_DOXYGEN + #include "CwiseUnaryOps.h" /** Copies \a other into *this. \returns a reference to *this. */ template<typename OtherDerived> @@ -363,8 +341,6 @@ template<typename Derived> class MatrixBase Scalar& w(); - const CwiseUnaryOp<ei_scalar_opposite_op<typename ei_traits<Derived>::Scalar>,Derived> operator-() const; - template<typename OtherDerived> const CwiseBinaryOp<ei_scalar_sum_op<typename ei_traits<Derived>::Scalar>, Derived, OtherDerived> operator+(const MatrixBase<OtherDerived> &other) const; @@ -378,27 +354,6 @@ template<typename Derived> class MatrixBase template<typename OtherDerived> Derived& operator-=(const MatrixBase<OtherDerived>& other); - Derived& operator*=(const Scalar& other); - Derived& operator/=(const Scalar& other); - - const ScalarMultipleReturnType operator*(const Scalar& scalar) const; - #ifdef EIGEN_PARSED_BY_DOXYGEN - const ScalarMultipleReturnType operator*(const RealScalar& scalar) const; - #endif - const CwiseUnaryOp<ei_scalar_quotient1_op<typename ei_traits<Derived>::Scalar>, Derived> - operator/(const Scalar& scalar) const; - - const CwiseUnaryOp<ei_scalar_multiple2_op<Scalar,std::complex<Scalar> >, Derived> - operator*(const std::complex<Scalar>& scalar) const; - - inline friend const ScalarMultipleReturnType - operator*(const Scalar& scalar, const MatrixBase& matrix) - { return matrix*scalar; } - - inline friend const CwiseUnaryOp<ei_scalar_multiple2_op<Scalar,std::complex<Scalar> >, Derived> - operator*(const std::complex<Scalar>& scalar, const MatrixBase& matrix) - { return matrix*scalar; } - template<typename OtherDerived> const typename ProductReturnType<Derived,OtherDerived>::Type operator*(const MatrixBase<OtherDerived> &other) const; @@ -592,13 +547,6 @@ template<typename Derived> class MatrixBase { return (cwise() != other).any(); } - template<typename NewType> - typename ei_cast_return_type< - Derived, - const CwiseUnaryOp<ei_scalar_cast_op<typename ei_traits<Derived>::Scalar, NewType>, Derived> - >::type - cast() const; - /** \returns the matrix or vector obtained by evaluating this expression. * * Notice that in the case of a plain matrix or vector (not an expression) this function just returns @@ -626,18 +574,6 @@ template<typename Derived> class MatrixBase inline const NestByValue<Derived> nestByValue() const; - ConjugateReturnType conjugate() const; - RealReturnType real() const; - NonConstRealReturnType real(); - const ImagReturnType imag() const; - NonConstImagReturnType imag(); - - template<typename CustomUnaryOp> - const CwiseUnaryOp<CustomUnaryOp, Derived> unaryExpr(const CustomUnaryOp& func = CustomUnaryOp()) const; - - template<typename CustomViewOp> - const CwiseUnaryView<CustomViewOp, Derived> unaryViewExpr(const CustomViewOp& func = CustomViewOp()) const; - template<typename CustomBinaryOp, typename OtherDerived> const CwiseBinaryOp<CustomBinaryOp, Derived, OtherDerived> binaryExpr(const MatrixBase<OtherDerived> &other, const CustomBinaryOp& func = CustomBinaryOp()) const; @@ -671,9 +607,6 @@ template<typename Derived> class MatrixBase { return *static_cast<Derived*>(const_cast<MatrixBase*>(this)); } #endif // not EIGEN_PARSED_BY_DOXYGEN - const Cwise<Derived> cwise() const; - Cwise<Derived> cwise(); - inline const WithFormat<Derived> format(const IOFormat& fmt) const; /////////// Array module /////////// diff --git a/Eigen/src/Sparse/SparseCwiseUnaryOp.h b/Eigen/src/Sparse/SparseCwiseUnaryOp.h index 9a73374bd..ea9d444ae 100644 --- a/Eigen/src/Sparse/SparseCwiseUnaryOp.h +++ b/Eigen/src/Sparse/SparseCwiseUnaryOp.h @@ -25,55 +25,83 @@ #ifndef EIGEN_SPARSE_CWISE_UNARY_OP_H #define EIGEN_SPARSE_CWISE_UNARY_OP_H +// template<typename UnaryOp, typename MatrixType> +// struct ei_traits<SparseCwiseUnaryOp<UnaryOp, MatrixType> > : ei_traits<MatrixType> +// { +// typedef typename ei_result_of< +// UnaryOp(typename MatrixType::Scalar) +// >::type Scalar; +// typedef typename MatrixType::Nested MatrixTypeNested; +// typedef typename ei_unref<MatrixTypeNested>::type _MatrixTypeNested; +// enum { +// CoeffReadCost = _MatrixTypeNested::CoeffReadCost + ei_functor_traits<UnaryOp>::Cost +// }; +// }; + template<typename UnaryOp, typename MatrixType> -struct ei_traits<SparseCwiseUnaryOp<UnaryOp, MatrixType> > : ei_traits<MatrixType> +class CwiseUnaryOpImp<UnaryOp,MatrixType,Sparse> + : public SparseMatrixBase<CwiseUnaryOp<UnaryOp, MatrixType> > { - typedef typename ei_result_of< - UnaryOp(typename MatrixType::Scalar) - >::type Scalar; - typedef typename MatrixType::Nested MatrixTypeNested; - typedef typename ei_unref<MatrixTypeNested>::type _MatrixTypeNested; - enum { - CoeffReadCost = _MatrixTypeNested::CoeffReadCost + ei_functor_traits<UnaryOp>::Cost - }; + public: + + class InnerIterator; +// typedef typename ei_unref<LhsNested>::type _LhsNested; + + typedef CwiseUnaryOp<UnaryOp, MatrixType> Derived; + EIGEN_SPARSE_PUBLIC_INTERFACE(Derived) }; template<typename UnaryOp, typename MatrixType> -class SparseCwiseUnaryOp : ei_no_assignment_operator, - public SparseMatrixBase<SparseCwiseUnaryOp<UnaryOp, MatrixType> > +class CwiseUnaryOpImpl<UnaryOp,MatrixType,Sparse>::InnerIterator { + typedef typename CwiseUnaryOpImpl::Scalar Scalar; + typedef typename ei_traits<CwiseUnaryOpImpl>::_MatrixTypeNested _MatrixTypeNested; + typedef typename _MatrixTypeNested::InnerIterator MatrixTypeIterator; public: - class InnerIterator; -// typedef typename ei_unref<LhsNested>::type _LhsNested; + EIGEN_STRONG_INLINE InnerIterator(const SparseCwiseUnaryOp& unaryOp, int outer) + : m_iter(unaryOp.nestedExpression(),outer), m_functor(unaryOp._functor()) + {} - EIGEN_SPARSE_GENERIC_PUBLIC_INTERFACE(SparseCwiseUnaryOp) + EIGEN_STRONG_INLINE InnerIterator& operator++() + { ++m_iter; return *this; } - inline SparseCwiseUnaryOp(const MatrixType& mat, const UnaryOp& func = UnaryOp()) - : m_matrix(mat), m_functor(func) {} + EIGEN_STRONG_INLINE Scalar value() const { return m_functor(m_iter.value()); } - EIGEN_STRONG_INLINE int rows() const { return m_matrix.rows(); } - EIGEN_STRONG_INLINE int cols() const { return m_matrix.cols(); } + EIGEN_STRONG_INLINE int index() const { return m_iter.index(); } + EIGEN_STRONG_INLINE int row() const { return m_iter.row(); } + EIGEN_STRONG_INLINE int col() const { return m_iter.col(); } -// EIGEN_STRONG_INLINE const typename MatrixType::Nested& _matrix() const { return m_matrix; } -// EIGEN_STRONG_INLINE const UnaryOp& _functor() const { return m_functor; } + EIGEN_STRONG_INLINE operator bool() const { return m_iter; } protected: - const typename MatrixType::Nested m_matrix; + MatrixTypeIterator m_iter; const UnaryOp m_functor; }; +template<typename ViewOp, typename MatrixType> +class CwiseUnaryOpImp<ViewOp,MatrixType,Sparse> + : public SparseMatrixBase<CwiseUnaryView<ViewOp, MatrixType> > +{ + public: -template<typename UnaryOp, typename MatrixType> -class SparseCwiseUnaryOp<UnaryOp,MatrixType>::InnerIterator + class InnerIterator; +// typedef typename ei_unref<LhsNested>::type _LhsNested; + + typedef CwiseUnaryView<ViewOp, MatrixType> Derived; + EIGEN_SPARSE_PUBLIC_INTERFACE(Derived) +}; + +template<typename ViewOp, typename MatrixType> +class CwiseUnaryViewImpl<ViewOp,MatrixType,Sparse>::InnerIterator { - typedef typename SparseCwiseUnaryOp::Scalar Scalar; + typedef typename CwiseUnaryViewImpl::Scalar Scalar; typedef typename ei_traits<SparseCwiseUnaryOp>::_MatrixTypeNested _MatrixTypeNested; typedef typename _MatrixTypeNested::InnerIterator MatrixTypeIterator; public: - EIGEN_STRONG_INLINE InnerIterator(const SparseCwiseUnaryOp& unaryOp, int outer) - : m_iter(unaryOp.m_matrix,outer), m_functor(unaryOp.m_functor) + EIGEN_STRONG_INLINE InnerIterator(const CwiseUnaryViewImpl& unaryView, int outer) + : m_iter(unaryView.nestedExpression(),outer), m_functor(unaryView._functor()) {} EIGEN_STRONG_INLINE InnerIterator& operator++() @@ -92,6 +120,8 @@ class SparseCwiseUnaryOp<UnaryOp,MatrixType>::InnerIterator const UnaryOp m_functor; }; + +/* template<typename Derived> template<typename CustomUnaryOp> EIGEN_STRONG_INLINE const SparseCwiseUnaryOp<CustomUnaryOp, Derived> @@ -178,6 +208,6 @@ SparseMatrixBase<Derived>::operator/=(const Scalar& other) for (typename Derived::InnerIterator i(derived(),j); i; ++i) i.valueRef() /= other; return derived(); -} +}*/ #endif // EIGEN_SPARSE_CWISE_UNARY_OP_H diff --git a/Eigen/src/Sparse/SparseMatrixBase.h b/Eigen/src/Sparse/SparseMatrixBase.h index 043fe07b2..cc13c329e 100644 --- a/Eigen/src/Sparse/SparseMatrixBase.h +++ b/Eigen/src/Sparse/SparseMatrixBase.h @@ -97,21 +97,23 @@ template<typename Derived> class SparseMatrixBase : public AnyMatrixBase<Derived #endif }; - /** \internal the return type of MatrixBase::conjugate() */ - typedef typename ei_meta_if<NumTraits<Scalar>::IsComplex, - const SparseCwiseUnaryOp<ei_scalar_conjugate_op<Scalar>, Derived>, - const Derived& - >::ret ConjugateReturnType; - /** \internal the return type of MatrixBase::real() */ - typedef SparseCwiseUnaryOp<ei_scalar_real_op<Scalar>, Derived> RealReturnType; - /** \internal the return type of MatrixBase::imag() */ - typedef SparseCwiseUnaryOp<ei_scalar_imag_op<Scalar>, Derived> ImagReturnType; + /* \internal the return type of MatrixBase::conjugate() */ +// typedef typename ei_meta_if<NumTraits<Scalar>::IsComplex, +// const SparseCwiseUnaryOp<ei_scalar_conjugate_op<Scalar>, Derived>, +// const Derived& +// >::ret ConjugateReturnType; + /* \internal the return type of MatrixBase::real() */ +// typedef SparseCwiseUnaryOp<ei_scalar_real_op<Scalar>, Derived> RealReturnType; + /* \internal the return type of MatrixBase::imag() */ +// typedef SparseCwiseUnaryOp<ei_scalar_imag_op<Scalar>, Derived> ImagReturnType; /** \internal the return type of MatrixBase::adjoint() */ typedef typename ei_meta_if<NumTraits<Scalar>::IsComplex, SparseCwiseUnaryOp<ei_scalar_conjugate_op<Scalar>, SparseNestByValue<Eigen::Transpose<Derived> > >, Transpose<Derived> >::ret AdjointReturnType; + #include "../Core/CwiseUnaryOps.h" + #ifndef EIGEN_PARSED_BY_DOXYGEN /** This is the "real scalar" type; if the \a Scalar type is already real numbers * (e.g. int, float or double) then \a RealScalar is just the same as \a Scalar. If @@ -284,7 +286,7 @@ template<typename Derived> class SparseMatrixBase : public AnyMatrixBase<Derived return s; } - const SparseCwiseUnaryOp<ei_scalar_opposite_op<typename ei_traits<Derived>::Scalar>,Derived> operator-() const; +// const SparseCwiseUnaryOp<ei_scalar_opposite_op<typename ei_traits<Derived>::Scalar>,Derived> operator-() const; template<typename OtherDerived> const SparseCwiseBinaryOp<ei_scalar_sum_op<typename ei_traits<Derived>::Scalar>, Derived, OtherDerived> @@ -302,17 +304,17 @@ template<typename Derived> class SparseMatrixBase : public AnyMatrixBase<Derived // template<typename Lhs,typename Rhs> // Derived& operator+=(const Flagged<Product<Lhs,Rhs,CacheFriendlyProduct>, 0, EvalBeforeNestingBit | EvalBeforeAssigningBit>& other); - Derived& operator*=(const Scalar& other); - Derived& operator/=(const Scalar& other); +// Derived& operator*=(const Scalar& other); +// Derived& operator/=(const Scalar& other); - const SparseCwiseUnaryOp<ei_scalar_multiple_op<typename ei_traits<Derived>::Scalar>, Derived> - operator*(const Scalar& scalar) const; - const SparseCwiseUnaryOp<ei_scalar_quotient1_op<typename ei_traits<Derived>::Scalar>, Derived> - operator/(const Scalar& scalar) const; +// const SparseCwiseUnaryOp<ei_scalar_multiple_op<typename ei_traits<Derived>::Scalar>, Derived> +// operator*(const Scalar& scalar) const; +// const SparseCwiseUnaryOp<ei_scalar_quotient1_op<typename ei_traits<Derived>::Scalar>, Derived> +// operator/(const Scalar& scalar) const; - inline friend const SparseCwiseUnaryOp<ei_scalar_multiple_op<typename ei_traits<Derived>::Scalar>, Derived> - operator*(const Scalar& scalar, const SparseMatrixBase& matrix) - { return matrix*scalar; } +// inline friend const SparseCwiseUnaryOp<ei_scalar_multiple_op<typename ei_traits<Derived>::Scalar>, Derived> +// operator*(const Scalar& scalar, const SparseMatrixBase& matrix) +// { return matrix*scalar; } // sparse * sparse @@ -543,12 +545,12 @@ template<typename Derived> class SparseMatrixBase : public AnyMatrixBase<Derived inline const SparseNestByValue<Derived> nestByValue() const; - ConjugateReturnType conjugate() const; - const RealReturnType real() const; - const ImagReturnType imag() const; +// ConjugateReturnType conjugate() const; +// const RealReturnType real() const; +// const ImagReturnType imag() const; - template<typename CustomUnaryOp> - const SparseCwiseUnaryOp<CustomUnaryOp, Derived> unaryExpr(const CustomUnaryOp& func = CustomUnaryOp()) const; +// template<typename CustomUnaryOp> +// const SparseCwiseUnaryOp<CustomUnaryOp, Derived> unaryExpr(const CustomUnaryOp& func = CustomUnaryOp()) const; // template<typename CustomBinaryOp, typename OtherDerived> // const CwiseBinaryOp<CustomBinaryOp, Derived, OtherDerived> @@ -572,8 +574,8 @@ template<typename Derived> class SparseMatrixBase : public AnyMatrixBase<Derived // void visit(Visitor& func) const; - const SparseCwise<Derived> cwise() const; - SparseCwise<Derived> cwise(); +// const SparseCwise<Derived> cwise() const; +// SparseCwise<Derived> cwise(); // inline const WithFormat<Derived> format(const IOFormat& fmt) const; |