mirror of
https://gitlab.com/libeigen/eigen.git
synced 2025-03-07 18:27:40 +08:00
extend quotient functor to allow for mixed types (complex-real)
This commit is contained in:
parent
9e8d2dea80
commit
6eee2918d9
@ -204,21 +204,28 @@ struct functor_traits<scalar_difference_op<Scalar> > {
|
|||||||
*
|
*
|
||||||
* \sa class CwiseBinaryOp, Cwise::operator/()
|
* \sa class CwiseBinaryOp, Cwise::operator/()
|
||||||
*/
|
*/
|
||||||
template<typename Scalar> struct scalar_quotient_op {
|
template<typename LhsScalar,typename RhsScalar> struct scalar_quotient_op {
|
||||||
|
enum {
|
||||||
|
// TODO vectorize mixed product
|
||||||
|
Vectorizable = is_same<LhsScalar,RhsScalar>::value && packet_traits<LhsScalar>::HasDiv && packet_traits<RhsScalar>::HasDiv
|
||||||
|
};
|
||||||
|
typedef typename scalar_product_traits<LhsScalar,RhsScalar>::ReturnType result_type;
|
||||||
EIGEN_EMPTY_STRUCT_CTOR(scalar_quotient_op)
|
EIGEN_EMPTY_STRUCT_CTOR(scalar_quotient_op)
|
||||||
EIGEN_STRONG_INLINE const Scalar operator() (const Scalar& a, const Scalar& b) const { return a / b; }
|
EIGEN_STRONG_INLINE const result_type operator() (const LhsScalar& a, const RhsScalar& b) const { return a / b; }
|
||||||
template<typename Packet>
|
template<typename Packet>
|
||||||
EIGEN_STRONG_INLINE const Packet packetOp(const Packet& a, const Packet& b) const
|
EIGEN_STRONG_INLINE const Packet packetOp(const Packet& a, const Packet& b) const
|
||||||
{ return internal::pdiv(a,b); }
|
{ return internal::pdiv(a,b); }
|
||||||
};
|
};
|
||||||
template<typename Scalar>
|
template<typename LhsScalar,typename RhsScalar>
|
||||||
struct functor_traits<scalar_quotient_op<Scalar> > {
|
struct functor_traits<scalar_quotient_op<LhsScalar,RhsScalar> > {
|
||||||
enum {
|
enum {
|
||||||
Cost = 2 * NumTraits<Scalar>::MulCost,
|
Cost = (NumTraits<LhsScalar>::MulCost + NumTraits<RhsScalar>::MulCost), // rough estimate!
|
||||||
PacketAccess = packet_traits<Scalar>::HasDiv
|
PacketAccess = scalar_quotient_op<LhsScalar,RhsScalar>::Vectorizable
|
||||||
};
|
};
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
/** \internal
|
/** \internal
|
||||||
* \brief Template functor to compute the and of two booleans
|
* \brief Template functor to compute the and of two booleans
|
||||||
*
|
*
|
||||||
@ -660,6 +667,7 @@ template<typename Scalar> struct functor_has_linear_access<scalar_identity_op<Sc
|
|||||||
template<typename Functor> struct functor_allows_mixing_real_and_complex { enum { ret = 0 }; };
|
template<typename Functor> struct functor_allows_mixing_real_and_complex { enum { ret = 0 }; };
|
||||||
template<typename LhsScalar,typename RhsScalar> struct functor_allows_mixing_real_and_complex<scalar_product_op<LhsScalar,RhsScalar> > { enum { ret = 1 }; };
|
template<typename LhsScalar,typename RhsScalar> struct functor_allows_mixing_real_and_complex<scalar_product_op<LhsScalar,RhsScalar> > { enum { ret = 1 }; };
|
||||||
template<typename LhsScalar,typename RhsScalar> struct functor_allows_mixing_real_and_complex<scalar_conj_product_op<LhsScalar,RhsScalar> > { enum { ret = 1 }; };
|
template<typename LhsScalar,typename RhsScalar> struct functor_allows_mixing_real_and_complex<scalar_conj_product_op<LhsScalar,RhsScalar> > { enum { ret = 1 }; };
|
||||||
|
template<typename LhsScalar,typename RhsScalar> struct functor_allows_mixing_real_and_complex<scalar_quotient_op<LhsScalar,RhsScalar> > { enum { ret = 1 }; };
|
||||||
|
|
||||||
|
|
||||||
/** \internal
|
/** \internal
|
||||||
|
@ -154,7 +154,6 @@ template<typename LhsScalar, typename RhsScalar, bool ConjLhs=false, bool ConjRh
|
|||||||
template<typename Scalar> struct scalar_sum_op;
|
template<typename Scalar> struct scalar_sum_op;
|
||||||
template<typename Scalar> struct scalar_difference_op;
|
template<typename Scalar> struct scalar_difference_op;
|
||||||
template<typename LhsScalar,typename RhsScalar> struct scalar_conj_product_op;
|
template<typename LhsScalar,typename RhsScalar> struct scalar_conj_product_op;
|
||||||
template<typename Scalar> struct scalar_quotient_op;
|
|
||||||
template<typename Scalar> struct scalar_opposite_op;
|
template<typename Scalar> struct scalar_opposite_op;
|
||||||
template<typename Scalar> struct scalar_conjugate_op;
|
template<typename Scalar> struct scalar_conjugate_op;
|
||||||
template<typename Scalar> struct scalar_real_op;
|
template<typename Scalar> struct scalar_real_op;
|
||||||
@ -185,6 +184,7 @@ template<typename Scalar> struct scalar_identity_op;
|
|||||||
|
|
||||||
template<typename LhsScalar,typename RhsScalar=LhsScalar> struct scalar_product_op;
|
template<typename LhsScalar,typename RhsScalar=LhsScalar> struct scalar_product_op;
|
||||||
template<typename LhsScalar,typename RhsScalar> struct scalar_multiple2_op;
|
template<typename LhsScalar,typename RhsScalar> struct scalar_multiple2_op;
|
||||||
|
template<typename LhsScalar,typename RhsScalar=LhsScalar> struct scalar_quotient_op;
|
||||||
|
|
||||||
} // end namespace internal
|
} // end namespace internal
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user