Added support for scalar / array division.

This commit is contained in:
Hauke Heibel 2012-03-02 16:27:27 +01:00
parent 8a7d16d523
commit 8cb3e36e14
3 changed files with 31 additions and 1 deletions

View File

@ -813,6 +813,20 @@ template<typename Scalar>
struct functor_traits<scalar_pow_op<Scalar> > struct functor_traits<scalar_pow_op<Scalar> >
{ enum { Cost = 5 * NumTraits<Scalar>::MulCost, PacketAccess = false }; }; { enum { Cost = 5 * NumTraits<Scalar>::MulCost, PacketAccess = false }; };
/** \internal
* \brief Template functor to compute the quotient between a scalar and array entries.
* \sa class CwiseUnaryOp, Cwise::inverse()
*/
template<typename Scalar>
struct scalar_inverse_mult_op {
scalar_inverse_mult_op(const Scalar& other) : m_other(other) {}
inline Scalar operator() (const Scalar& a) const { return m_other / a; }
template<typename Packet>
inline const Packet packetOp(const Packet& a) const
{ return internal::pdiv(pset1<Packet>(m_other),a); }
Scalar m_other;
};
/** \internal /** \internal
* \brief Template functor to compute the inverse of a scalar * \brief Template functor to compute the inverse of a scalar
* \sa class CwiseUnaryOp, Cwise::inverse() * \sa class CwiseUnaryOp, Cwise::inverse()

View File

@ -71,6 +71,19 @@ namespace std
} }
} }
/**
* \brief Component-wise division of a scalar by array elements.
**/
template <typename Derived>
inline const Eigen::CwiseUnaryOp<Eigen::internal::scalar_inverse_mult_op<typename Derived::Scalar>, const Derived>
operator/(typename Derived::Scalar s, const Eigen::ArrayBase<Derived>& a)
{
return Eigen::CwiseUnaryOp<Eigen::internal::scalar_inverse_mult_op<typename Derived::Scalar>, const Derived>(
a.derived(),
Eigen::internal::scalar_inverse_mult_op<typename Derived::Scalar>(s)
);
}
namespace Eigen namespace Eigen
{ {
namespace internal namespace internal

View File

@ -43,7 +43,10 @@ template<typename ArrayType> void array(const ArrayType& m)
RowVectorType rv1 = RowVectorType::Random(cols); RowVectorType rv1 = RowVectorType::Random(cols);
Scalar s1 = internal::random<Scalar>(), Scalar s1 = internal::random<Scalar>(),
s2 = internal::random<Scalar>(); s2 = internal::random<Scalar>();
// scalar by array division
VERIFY_IS_APPROX(s1/m1, s1 * m1.inverse());
// scalar addition // scalar addition
VERIFY_IS_APPROX(m1 + s1, s1 + m1); VERIFY_IS_APPROX(m1 + s1, s1 + m1);