mirror of
https://gitlab.com/libeigen/eigen.git
synced 2025-08-12 03:39:01 +08:00
Add isfinite array support as isFinite
This commit is contained in:
parent
7b829940d1
commit
46cf9cda32
@ -216,6 +216,7 @@ EIGEN_MKL_VML_DECLARE_UNARY_CALLS_LA(floor, Floor)
|
||||
EIGEN_MKL_VML_DECLARE_UNARY_CALLS_LA(ceil, Ceil)
|
||||
EIGEN_MKL_VML_DECLARE_UNARY_CALLS_LA(isNaN, IsNaN)
|
||||
EIGEN_MKL_VML_DECLARE_UNARY_CALLS_LA(isinf, Isinf)
|
||||
EIGEN_MKL_VML_DECLARE_UNARY_CALLS_LA(isFinite, IsFinite)
|
||||
|
||||
EIGEN_MKL_VML_DECLARE_UNARY_CALLS_REAL(square, Sqr)
|
||||
|
||||
|
@ -78,7 +78,8 @@ struct default_packet_traits
|
||||
HasFloor = 0,
|
||||
HasCeil = 0,
|
||||
HasIsNaN = 0,
|
||||
HasIsinf = 0
|
||||
HasIsinf = 0,
|
||||
HasIsFinite = 0
|
||||
};
|
||||
};
|
||||
|
||||
@ -403,6 +404,10 @@ Packet pisNaN(const Packet& a) { using numext::isNaN; return isNaN(a); }
|
||||
template<typename Packet> EIGEN_DECLARE_FUNCTION_ALLOWING_MULTIPLE_DEFINITIONS
|
||||
Packet pisinf(const Packet& a) { using numext::isinf; return isinf(a); }
|
||||
|
||||
/** \internal \returns the isFinite of \a a (coeff-wise) */
|
||||
template<typename Packet> EIGEN_DECLARE_FUNCTION_ALLOWING_MULTIPLE_DEFINITIONS
|
||||
Packet pisFinite(const Packet& a) { using numext::isfinite; return isfinite(a); }
|
||||
|
||||
/***************************************************************************
|
||||
* The following functions might not have to be overwritten for vectorized types
|
||||
***************************************************************************/
|
||||
|
@ -61,6 +61,7 @@ namespace Eigen
|
||||
EIGEN_ARRAY_DECLARE_GLOBAL_UNARY(ceil,scalar_ceil_op)
|
||||
EIGEN_ARRAY_DECLARE_GLOBAL_UNARY(isNaN,scalar_isNaN_op)
|
||||
EIGEN_ARRAY_DECLARE_GLOBAL_UNARY(isinf,scalar_isinf_op)
|
||||
EIGEN_ARRAY_DECLARE_GLOBAL_UNARY(isFinite,scalar_isFinite_op)
|
||||
|
||||
template<typename Derived>
|
||||
inline const Eigen::CwiseUnaryOp<Eigen::internal::scalar_pow_op<typename Derived::Scalar>, const Derived>
|
||||
|
@ -606,6 +606,26 @@ struct functor_traits<scalar_isinf_op<Scalar> >
|
||||
};
|
||||
};
|
||||
|
||||
/** \internal
|
||||
* \brief Template functor to compute the isFinite of a scalar
|
||||
* \sa class CwiseUnaryOp, ArrayBase::isFinite()
|
||||
*/
|
||||
template<typename Scalar> struct scalar_isFinite_op {
|
||||
EIGEN_EMPTY_STRUCT_CTOR(scalar_isFinite_op)
|
||||
typedef bool result_type;
|
||||
EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE result_type operator() (const Scalar& a) const { return numext::isfinite(a); }
|
||||
typedef typename packet_traits<Scalar>::type Packet;
|
||||
inline Packet packetOp(const Packet& a) const { return internal::pisFinite(a); }
|
||||
};
|
||||
template<typename Scalar>
|
||||
struct functor_traits<scalar_isFinite_op<Scalar> >
|
||||
{
|
||||
enum {
|
||||
Cost = NumTraits<Scalar>::MulCost,
|
||||
PacketAccess = packet_traits<Scalar>::HasIsFinite
|
||||
};
|
||||
};
|
||||
|
||||
} // end namespace internal
|
||||
|
||||
} // end namespace Eigen
|
||||
|
@ -26,6 +26,7 @@ typedef CwiseUnaryOp<internal::scalar_floor_op<Scalar>, const Derived> FloorRetu
|
||||
typedef CwiseUnaryOp<internal::scalar_ceil_op<Scalar>, const Derived> CeilReturnType;
|
||||
typedef CwiseUnaryOp<internal::scalar_isNaN_op<Scalar>, const Derived> IsNaNReturnType;
|
||||
typedef CwiseUnaryOp<internal::scalar_isinf_op<Scalar>, const Derived> IsinfReturnType;
|
||||
typedef CwiseUnaryOp<internal::scalar_isFinite_op<Scalar>, const Derived> IsFiniteReturnType;
|
||||
|
||||
/** \returns an expression of the coefficient-wise absolute value of \c *this
|
||||
*
|
||||
@ -369,7 +370,7 @@ ceil() const
|
||||
* Example: \include Cwise_isNaN.cpp
|
||||
* Output: \verbinclude Cwise_isNaN.out
|
||||
*
|
||||
* \sa isinf()
|
||||
* \sa isFinite(), isinf()
|
||||
*/
|
||||
inline const IsNaNReturnType
|
||||
isNaN() const
|
||||
@ -390,6 +391,19 @@ isinf() const
|
||||
return IsinfReturnType(derived());
|
||||
}
|
||||
|
||||
/** \returns an expression of the coefficient-wise isFinite of *this.
|
||||
*
|
||||
* Example: \include Cwise_isFinite.cpp
|
||||
* Output: \verbinclude Cwise_isFinite.out
|
||||
*
|
||||
* \sa isNaN()
|
||||
*/
|
||||
inline const IsFiniteReturnType
|
||||
isFinite() const
|
||||
{
|
||||
return IsFiniteReturnType(derived());
|
||||
}
|
||||
|
||||
#define EIGEN_MAKE_SCALAR_CWISE_UNARY_OP(METHOD_NAME,FUNCTOR) \
|
||||
EIGEN_DEVICE_FUNC \
|
||||
inline const CwiseUnaryOp<std::binder2nd<FUNCTOR<Scalar> >, const Derived> \
|
||||
|
5
doc/snippets/Cwise_isFinite.cpp
Normal file
5
doc/snippets/Cwise_isFinite.cpp
Normal file
@ -0,0 +1,5 @@
|
||||
Array3d v(1,2,3);
|
||||
v(1) *= 0.0/0.0;
|
||||
v(2) /= 0.0;
|
||||
cout << v << endl << endl;
|
||||
cout << isFinite(v) << endl;
|
@ -215,6 +215,7 @@ template<typename ArrayType> void array_real(const ArrayType& m)
|
||||
VERIFY_IS_APPROX(m1.ceil(), ceil(m1));
|
||||
VERIFY_IS_APPROX(m1.isNaN(), isNaN(m1));
|
||||
VERIFY_IS_APPROX(m1.isinf(), isinf(m1));
|
||||
VERIFY_IS_APPROX(m1.isFinite(), isFinite(m1));
|
||||
VERIFY_IS_APPROX(m1.square(), square(m1));
|
||||
|
||||
VERIFY_IS_APPROX(cos(m1+RealScalar(3)*m2), cos((m1+RealScalar(3)*m2).eval()));
|
||||
@ -283,6 +284,7 @@ template<typename ArrayType> void array_complex(const ArrayType& m)
|
||||
VERIFY_IS_APPROX(m1.ceil(), ceil(m1));
|
||||
VERIFY_IS_APPROX(m1.isNaN(), isNaN(m1));
|
||||
VERIFY_IS_APPROX(m1.isinf(), isinf(m1));
|
||||
VERIFY_IS_APPROX(m1.isFinite(), isFinite(m1));
|
||||
VERIFY_IS_APPROX(m1.square(), square(m1));
|
||||
VERIFY_IS_APPROX(m1.sin(), sin(m1));
|
||||
VERIFY_IS_APPROX(m1.cos(), cos(m1));
|
||||
|
Loading…
x
Reference in New Issue
Block a user