Add vectorized clip functor for Eigen Tensors.

This commit is contained in:
Rasmus Munk Larsen
2018-05-14 16:07:13 -07:00
parent 6118c6ff4f
commit b8c8e5f436
3 changed files with 46 additions and 0 deletions

View File

@@ -209,6 +209,12 @@ class TensorBase<Derived, ReadOnlyAccessors>
return unaryExpr(internal::scalar_abs_op<Scalar>());
}
EIGEN_DEVICE_FUNC
EIGEN_STRONG_INLINE const TensorCwiseUnaryOp<internal::scalar_clip_op<Scalar>, const Derived>
clip(Scalar min, Scalar max) const {
return unaryExpr(internal::scalar_clip_op<Scalar>(min, max));
}
EIGEN_DEVICE_FUNC
EIGEN_STRONG_INLINE const TensorCwiseUnaryOp<internal::scalar_conjugate_op<Scalar>, const Derived>
conjugate() const {

View File

@@ -487,6 +487,25 @@ struct functor_traits<GaussianGenerator<T, Index, NumDims> > {
};
};
template <typename Scalar>
struct scalar_clip_op {
EIGEN_DEVICE_FUNC inline scalar_clip_op(const Scalar& _min, const Scalar& _max) : m_min(_min), m_max(_max) {}
EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE const Scalar
operator()(const Scalar& x) const {
return numext::mini(numext::maxi(x, m_min), m_max);
}
template <typename Packet>
EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE const Packet
packetOp(const Packet& x) const {
return internal::pmin(internal::pmax(x, pset1<Packet>(m_min)), pset1<Packet>(m_max));
}
const Scalar m_min;
const Scalar m_max;
};
template<typename Scalar>
struct functor_traits<scalar_clip_op<Scalar> >
{ enum { Cost = 2 * NumTraits<Scalar>::AddCost, PacketAccess = (packet_traits<Scalar>::HasMin && packet_traits<Scalar>::HasMax)}; };
} // end namespace internal
} // end namespace Eigen