mirror of
https://gitlab.com/libeigen/eigen.git
synced 2025-06-04 18:54:00 +08:00
Implement generic scalar*expr and expr*scalar operator based on scalar_product_traits.
This is especially useful for custom scalar types, e.g., to enable float*expr<multi_prec> without conversion.
This commit is contained in:
parent
8b6f53222b
commit
2c00ac0b53
@ -52,8 +52,6 @@ template<typename Derived> class ArrayBase
|
|||||||
typedef typename NumTraits<Scalar>::Real RealScalar;
|
typedef typename NumTraits<Scalar>::Real RealScalar;
|
||||||
|
|
||||||
typedef DenseBase<Derived> Base;
|
typedef DenseBase<Derived> Base;
|
||||||
using Base::operator*;
|
|
||||||
using Base::operator/;
|
|
||||||
using Base::RowsAtCompileTime;
|
using Base::RowsAtCompileTime;
|
||||||
using Base::ColsAtCompileTime;
|
using Base::ColsAtCompileTime;
|
||||||
using Base::SizeAtCompileTime;
|
using Base::SizeAtCompileTime;
|
||||||
|
@ -75,8 +75,6 @@ template<typename Derived> class DenseBase
|
|||||||
typedef typename NumTraits<Scalar>::Real RealScalar;
|
typedef typename NumTraits<Scalar>::Real RealScalar;
|
||||||
typedef internal::special_scalar_op_base<Derived,Scalar,RealScalar, DenseCoeffsBase<Derived> > Base;
|
typedef internal::special_scalar_op_base<Derived,Scalar,RealScalar, DenseCoeffsBase<Derived> > Base;
|
||||||
|
|
||||||
using Base::operator*;
|
|
||||||
using Base::operator/;
|
|
||||||
using Base::derived;
|
using Base::derived;
|
||||||
using Base::const_cast_derived;
|
using Base::const_cast_derived;
|
||||||
using Base::rows;
|
using Base::rows;
|
||||||
|
@ -80,8 +80,6 @@ template<typename Derived> class MatrixBase
|
|||||||
using Base::operator-=;
|
using Base::operator-=;
|
||||||
using Base::operator*=;
|
using Base::operator*=;
|
||||||
using Base::operator/=;
|
using Base::operator/=;
|
||||||
using Base::operator*;
|
|
||||||
using Base::operator/;
|
|
||||||
|
|
||||||
typedef typename Base::CoeffReturnType CoeffReturnType;
|
typedef typename Base::CoeffReturnType CoeffReturnType;
|
||||||
typedef typename Base::ConstTransposeReturnType ConstTransposeReturnType;
|
typedef typename Base::ConstTransposeReturnType ConstTransposeReturnType;
|
||||||
|
@ -466,34 +466,6 @@ struct special_scalar_op_base : public BaseType
|
|||||||
template<typename Derived,typename Scalar,typename OtherScalar, typename BaseType>
|
template<typename Derived,typename Scalar,typename OtherScalar, typename BaseType>
|
||||||
struct special_scalar_op_base<Derived,Scalar,OtherScalar,BaseType,true> : public BaseType
|
struct special_scalar_op_base<Derived,Scalar,OtherScalar,BaseType,true> : public BaseType
|
||||||
{
|
{
|
||||||
const CwiseUnaryOp<scalar_multiple2_op<Scalar,OtherScalar>, const Derived>
|
|
||||||
operator*(const OtherScalar& scalar) const
|
|
||||||
{
|
|
||||||
#ifdef EIGEN_SPECIAL_SCALAR_MULTIPLE_PLUGIN
|
|
||||||
EIGEN_SPECIAL_SCALAR_MULTIPLE_PLUGIN
|
|
||||||
#endif
|
|
||||||
return CwiseUnaryOp<scalar_multiple2_op<Scalar,OtherScalar>, const Derived>
|
|
||||||
(*static_cast<const Derived*>(this), scalar_multiple2_op<Scalar,OtherScalar>(scalar));
|
|
||||||
}
|
|
||||||
|
|
||||||
inline friend const CwiseUnaryOp<scalar_multiple2_op<Scalar,OtherScalar>, const Derived>
|
|
||||||
operator*(const OtherScalar& scalar, const Derived& matrix)
|
|
||||||
{
|
|
||||||
#ifdef EIGEN_SPECIAL_SCALAR_MULTIPLE_PLUGIN
|
|
||||||
EIGEN_SPECIAL_SCALAR_MULTIPLE_PLUGIN
|
|
||||||
#endif
|
|
||||||
return static_cast<const special_scalar_op_base&>(matrix).operator*(scalar);
|
|
||||||
}
|
|
||||||
|
|
||||||
const CwiseUnaryOp<scalar_quotient2_op<Scalar,OtherScalar>, const Derived>
|
|
||||||
operator/(const OtherScalar& scalar) const
|
|
||||||
{
|
|
||||||
#ifdef EIGEN_SPECIAL_SCALAR_MULTIPLE_PLUGIN
|
|
||||||
EIGEN_SPECIAL_SCALAR_MULTIPLE_PLUGIN
|
|
||||||
#endif
|
|
||||||
return CwiseUnaryOp<scalar_quotient2_op<Scalar,OtherScalar>, const Derived>
|
|
||||||
(*static_cast<const Derived*>(this), scalar_quotient2_op<Scalar,OtherScalar>(scalar));
|
|
||||||
}
|
|
||||||
};
|
};
|
||||||
|
|
||||||
template<typename XprType, typename CastType> struct cast_return_type
|
template<typename XprType, typename CastType> struct cast_return_type
|
||||||
|
@ -72,14 +72,16 @@ struct sparse_time_dense_product_impl<SparseLhsType,DenseRhsType,DenseResType, t
|
|||||||
};
|
};
|
||||||
|
|
||||||
// FIXME: what is the purpose of the following specialization? Is it for the BlockedSparse format?
|
// FIXME: what is the purpose of the following specialization? Is it for the BlockedSparse format?
|
||||||
template<typename T1, typename T2/*, int _Options, typename _StrideType*/>
|
// -> let's disable it for now as it is conflicting with generic scalar*matrix and matrix*scalar operators
|
||||||
struct scalar_product_traits<T1, Ref<T2/*, _Options, _StrideType*/> >
|
// template<typename T1, typename T2/*, int _Options, typename _StrideType*/>
|
||||||
{
|
// struct scalar_product_traits<T1, Ref<T2/*, _Options, _StrideType*/> >
|
||||||
enum {
|
// {
|
||||||
Defined = 1
|
// enum {
|
||||||
};
|
// Defined = 1
|
||||||
typedef typename CwiseUnaryOp<scalar_multiple2_op<T1, typename T2::Scalar>, T2>::PlainObject ReturnType;
|
// };
|
||||||
};
|
// typedef typename CwiseUnaryOp<scalar_multiple2_op<T1, typename T2::Scalar>, T2>::PlainObject ReturnType;
|
||||||
|
// };
|
||||||
|
|
||||||
template<typename SparseLhsType, typename DenseRhsType, typename DenseResType, typename AlphaType>
|
template<typename SparseLhsType, typename DenseRhsType, typename DenseResType, typename AlphaType>
|
||||||
struct sparse_time_dense_product_impl<SparseLhsType,DenseRhsType,DenseResType, AlphaType, ColMajor, true>
|
struct sparse_time_dense_product_impl<SparseLhsType,DenseRhsType,DenseResType, AlphaType, ColMajor, true>
|
||||||
{
|
{
|
||||||
|
@ -143,8 +143,7 @@ template<typename Derived> class SparseMatrixBase
|
|||||||
{ return *static_cast<Derived*>(const_cast<SparseMatrixBase*>(this)); }
|
{ return *static_cast<Derived*>(const_cast<SparseMatrixBase*>(this)); }
|
||||||
|
|
||||||
typedef internal::special_scalar_op_base<Derived, Scalar, RealScalar, EigenBase<Derived> > Base;
|
typedef internal::special_scalar_op_base<Derived, Scalar, RealScalar, EigenBase<Derived> > Base;
|
||||||
using Base::operator*;
|
|
||||||
using Base::operator/;
|
|
||||||
#endif // not EIGEN_PARSED_BY_DOXYGEN
|
#endif // not EIGEN_PARSED_BY_DOXYGEN
|
||||||
|
|
||||||
#define EIGEN_CURRENT_STORAGE_BASE_CLASS Eigen::SparseMatrixBase
|
#define EIGEN_CURRENT_STORAGE_BASE_CLASS Eigen::SparseMatrixBase
|
||||||
|
@ -70,12 +70,18 @@ operator/(const Scalar& scalar) const
|
|||||||
return ScalarQuotient1ReturnType(derived(), internal::scalar_quotient1_op<Scalar>(scalar));
|
return ScalarQuotient1ReturnType(derived(), internal::scalar_quotient1_op<Scalar>(scalar));
|
||||||
}
|
}
|
||||||
|
|
||||||
/** Overloaded for efficient real matrix times complex scalar value */
|
/** Overloaded for efficiently multipling with compatible scalar types */
|
||||||
EIGEN_DEVICE_FUNC
|
template <typename T>
|
||||||
inline const ScalarComplexMultipleReturnType
|
EIGEN_DEVICE_FUNC inline
|
||||||
operator*(const std::complex<Scalar>& scalar) const
|
typename internal::enable_if<internal::scalar_product_traits<T,Scalar>::Defined,
|
||||||
|
const CwiseUnaryOp<internal::scalar_multiple2_op<Scalar,T>, const Derived> >::type
|
||||||
|
operator*(const T& scalar) const
|
||||||
{
|
{
|
||||||
return ScalarComplexMultipleReturnType(derived(), internal::scalar_multiple2_op<Scalar,std::complex<Scalar> >(scalar));
|
#ifdef EIGEN_SPECIAL_SCALAR_MULTIPLE_PLUGIN
|
||||||
|
EIGEN_SPECIAL_SCALAR_MULTIPLE_PLUGIN
|
||||||
|
#endif
|
||||||
|
return CwiseUnaryOp<internal::scalar_multiple2_op<Scalar,T>, const Derived>(
|
||||||
|
derived(), internal::scalar_multiple2_op<Scalar,T>(scalar) );
|
||||||
}
|
}
|
||||||
|
|
||||||
EIGEN_DEVICE_FUNC
|
EIGEN_DEVICE_FUNC
|
||||||
@ -83,11 +89,31 @@ inline friend const ScalarMultipleReturnType
|
|||||||
operator*(const Scalar& scalar, const StorageBaseType& matrix)
|
operator*(const Scalar& scalar, const StorageBaseType& matrix)
|
||||||
{ return matrix*scalar; }
|
{ return matrix*scalar; }
|
||||||
|
|
||||||
EIGEN_DEVICE_FUNC
|
template <typename T>
|
||||||
inline friend const CwiseUnaryOp<internal::scalar_multiple2_op<Scalar,std::complex<Scalar> >, const Derived>
|
EIGEN_DEVICE_FUNC inline friend
|
||||||
operator*(const std::complex<Scalar>& scalar, const StorageBaseType& matrix)
|
typename internal::enable_if<internal::scalar_product_traits<Scalar,T>::Defined,
|
||||||
{ return matrix*scalar; }
|
const CwiseUnaryOp<internal::scalar_multiple2_op<Scalar,T>, const Derived> >::type
|
||||||
|
operator*(const T& scalar, const StorageBaseType& matrix)
|
||||||
|
{
|
||||||
|
#ifdef EIGEN_SPECIAL_SCALAR_MULTIPLE_PLUGIN
|
||||||
|
EIGEN_SPECIAL_SCALAR_MULTIPLE_PLUGIN
|
||||||
|
#endif
|
||||||
|
return CwiseUnaryOp<internal::scalar_multiple2_op<Scalar,T>, const Derived>(
|
||||||
|
matrix.derived(), internal::scalar_multiple2_op<Scalar,T>(scalar) );
|
||||||
|
}
|
||||||
|
|
||||||
|
template <typename T>
|
||||||
|
EIGEN_DEVICE_FUNC inline
|
||||||
|
typename internal::enable_if<internal::scalar_product_traits<Scalar,T>::Defined,
|
||||||
|
const CwiseUnaryOp<internal::scalar_quotient2_op<Scalar,T>, const Derived> >::type
|
||||||
|
operator/(const T& scalar) const
|
||||||
|
{
|
||||||
|
#ifdef EIGEN_SPECIAL_SCALAR_MULTIPLE_PLUGIN
|
||||||
|
EIGEN_SPECIAL_SCALAR_MULTIPLE_PLUGIN
|
||||||
|
#endif
|
||||||
|
return CwiseUnaryOp<internal::scalar_quotient2_op<Scalar,T>, const Derived>(
|
||||||
|
derived(), internal::scalar_quotient2_op<Scalar,T>(scalar) );
|
||||||
|
}
|
||||||
|
|
||||||
template<class NewType> struct CastXpr { typedef typename internal::cast_return_type<Derived,const CwiseUnaryOp<internal::scalar_cast_op<Scalar, NewType>, const Derived> >::type Type; };
|
template<class NewType> struct CastXpr { typedef typename internal::cast_return_type<Derived,const CwiseUnaryOp<internal::scalar_cast_op<Scalar, NewType>, const Derived> >::type Type; };
|
||||||
|
|
||||||
|
Loading…
x
Reference in New Issue
Block a user