mirror of
https://gitlab.com/libeigen/eigen.git
synced 2025-07-16 01:51:51 +08:00
fix array_comp *= array_real
This commit is contained in:
parent
7fd8418b19
commit
e3853353fb
@ -39,7 +39,10 @@
|
|||||||
* \sa class SwapWrapper for a similar trick.
|
* \sa class SwapWrapper for a similar trick.
|
||||||
*/
|
*/
|
||||||
template<typename BinaryOp, typename MatrixType>
|
template<typename BinaryOp, typename MatrixType>
|
||||||
struct ei_traits<SelfCwiseBinaryOp<BinaryOp,MatrixType> > : ei_traits<MatrixType> {};
|
struct ei_traits<SelfCwiseBinaryOp<BinaryOp,MatrixType> > : ei_traits<MatrixType>
|
||||||
|
{
|
||||||
|
|
||||||
|
};
|
||||||
|
|
||||||
template<typename BinaryOp, typename MatrixType> class SelfCwiseBinaryOp
|
template<typename BinaryOp, typename MatrixType> class SelfCwiseBinaryOp
|
||||||
: public ei_dense_xpr_base< SelfCwiseBinaryOp<BinaryOp, MatrixType> >::type
|
: public ei_dense_xpr_base< SelfCwiseBinaryOp<BinaryOp, MatrixType> >::type
|
||||||
@ -113,6 +116,29 @@ template<typename BinaryOp, typename MatrixType> class SelfCwiseBinaryOp
|
|||||||
m_functor.packetOp(m_matrix.template packet<StoreMode>(index),_other.template packet<LoadMode>(index)) );
|
m_functor.packetOp(m_matrix.template packet<StoreMode>(index),_other.template packet<LoadMode>(index)) );
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// reimplement lazyAssign to handle complex *= real
|
||||||
|
// see CwiseBinaryOp ctor for details
|
||||||
|
template<typename RhsDerived>
|
||||||
|
EIGEN_STRONG_INLINE SelfCwiseBinaryOp& lazyAssign(const DenseBase<RhsDerived>& rhs)
|
||||||
|
{
|
||||||
|
EIGEN_STATIC_ASSERT_SAME_MATRIX_SIZE(MatrixType,RhsDerived)
|
||||||
|
|
||||||
|
EIGEN_STATIC_ASSERT((ei_functor_allows_mixing_real_and_complex<BinaryOp>::ret
|
||||||
|
? int(ei_is_same_type<typename MatrixType::RealScalar, typename RhsDerived::RealScalar>::ret)
|
||||||
|
: int(ei_is_same_type<typename MatrixType::Scalar, typename RhsDerived::Scalar>::ret)),
|
||||||
|
YOU_MIXED_DIFFERENT_NUMERIC_TYPES__YOU_NEED_TO_USE_THE_CAST_METHOD_OF_MATRIXBASE_TO_CAST_NUMERIC_TYPES_EXPLICITLY)
|
||||||
|
|
||||||
|
#ifdef EIGEN_DEBUG_ASSIGN
|
||||||
|
ei_assign_traits<SelfCwiseBinaryOp, RhsDerived>::debug();
|
||||||
|
#endif
|
||||||
|
ei_assert(rows() == rhs.rows() && cols() == rhs.cols());
|
||||||
|
ei_assign_impl<SelfCwiseBinaryOp, RhsDerived>::run(*this,rhs.derived());
|
||||||
|
#ifndef EIGEN_NO_DEBUG
|
||||||
|
checkTransposeAliasing(rhs.derived());
|
||||||
|
#endif
|
||||||
|
return *this;
|
||||||
|
}
|
||||||
|
|
||||||
protected:
|
protected:
|
||||||
MatrixType& m_matrix;
|
MatrixType& m_matrix;
|
||||||
const BinaryOp& m_functor;
|
const BinaryOp& m_functor;
|
||||||
|
@ -97,6 +97,13 @@ template<int SizeAtCompileType> void mixingtypes(int size = SizeAtCompileType)
|
|||||||
|
|
||||||
// check outer product
|
// check outer product
|
||||||
VERIFY_IS_APPROX((vf * vcf.transpose()).eval(), (vf.template cast<complex<float> >() * vcf.transpose()).eval());
|
VERIFY_IS_APPROX((vf * vcf.transpose()).eval(), (vf.template cast<complex<float> >() * vcf.transpose()).eval());
|
||||||
|
|
||||||
|
// coeff wise product
|
||||||
|
|
||||||
|
VERIFY_IS_APPROX((vf * vcf.transpose()).eval(), (vf.template cast<complex<float> >() * vcf.transpose()).eval());
|
||||||
|
|
||||||
|
Mat_cd mcd2 = mcd;
|
||||||
|
VERIFY_IS_APPROX(mcd.array() *= md.array(), mcd2.array() *= md.array().template cast<std::complex<double> >());
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
Loading…
x
Reference in New Issue
Block a user