mirror of
https://gitlab.com/libeigen/eigen.git
synced 2025-08-12 11:49:02 +08:00
Expose log1p to Array.
This commit is contained in:
parent
afd33539dd
commit
89099b0cf7
@ -62,6 +62,7 @@ struct default_packet_traits
|
|||||||
HasRsqrt = 0,
|
HasRsqrt = 0,
|
||||||
HasExp = 0,
|
HasExp = 0,
|
||||||
HasLog = 0,
|
HasLog = 0,
|
||||||
|
HasLog1p = 0,
|
||||||
HasLog10 = 0,
|
HasLog10 = 0,
|
||||||
HasPow = 0,
|
HasPow = 0,
|
||||||
|
|
||||||
@ -403,6 +404,10 @@ Packet pexp(const Packet& a) { using std::exp; return exp(a); }
|
|||||||
template<typename Packet> EIGEN_DECLARE_FUNCTION_ALLOWING_MULTIPLE_DEFINITIONS
|
template<typename Packet> EIGEN_DECLARE_FUNCTION_ALLOWING_MULTIPLE_DEFINITIONS
|
||||||
Packet plog(const Packet& a) { using std::log; return log(a); }
|
Packet plog(const Packet& a) { using std::log; return log(a); }
|
||||||
|
|
||||||
|
/** \internal \returns the log1p of \a a (coeff-wise) */
|
||||||
|
template<typename Packet> EIGEN_DECLARE_FUNCTION_ALLOWING_MULTIPLE_DEFINITIONS
|
||||||
|
Packet plog1p(const Packet& a) { return numext::log1p(a); }
|
||||||
|
|
||||||
/** \internal \returns the log10 of \a a (coeff-wise) */
|
/** \internal \returns the log10 of \a a (coeff-wise) */
|
||||||
template<typename Packet> EIGEN_DECLARE_FUNCTION_ALLOWING_MULTIPLE_DEFINITIONS
|
template<typename Packet> EIGEN_DECLARE_FUNCTION_ALLOWING_MULTIPLE_DEFINITIONS
|
||||||
Packet plog10(const Packet& a) { using std::log10; return log10(a); }
|
Packet plog10(const Packet& a) { using std::log10; return log10(a); }
|
||||||
|
@ -1,7 +1,7 @@
|
|||||||
// This file is part of Eigen, a lightweight C++ template library
|
// This file is part of Eigen, a lightweight C++ template library
|
||||||
// for linear algebra.
|
// for linear algebra.
|
||||||
//
|
//
|
||||||
// Copyright (C) 2010-2012 Gael Guennebaud <gael.guennebaud@inria.fr>
|
// Copyright (C) 2010-2016 Gael Guennebaud <gael.guennebaud@inria.fr>
|
||||||
// Copyright (C) 2010 Benoit Jacob <jacob.benoit.1@gmail.com>
|
// Copyright (C) 2010 Benoit Jacob <jacob.benoit.1@gmail.com>
|
||||||
//
|
//
|
||||||
// This Source Code Form is subject to the terms of the Mozilla
|
// This Source Code Form is subject to the terms of the Mozilla
|
||||||
@ -18,7 +18,7 @@
|
|||||||
|
|
||||||
DOC_DETAILS
|
DOC_DETAILS
|
||||||
|
|
||||||
\sa class CwiseUnaryOp
|
\sa <a href="group__CoeffwiseMathFunctions.html#cwisetable_##NAME">Math functions</a>, class CwiseUnaryOp
|
||||||
*/ \
|
*/ \
|
||||||
template<typename Derived> \
|
template<typename Derived> \
|
||||||
inline const Eigen::CwiseUnaryOp<Eigen::internal::FUNCTOR<typename Derived::Scalar>, const Derived> \
|
inline const Eigen::CwiseUnaryOp<Eigen::internal::FUNCTOR<typename Derived::Scalar>, const Derived> \
|
||||||
@ -72,6 +72,7 @@ namespace Eigen
|
|||||||
EIGEN_ARRAY_DECLARE_GLOBAL_UNARY(erfc,scalar_erfc_op,complement error function,\sa ArrayBase::erfc)
|
EIGEN_ARRAY_DECLARE_GLOBAL_UNARY(erfc,scalar_erfc_op,complement error function,\sa ArrayBase::erfc)
|
||||||
EIGEN_ARRAY_DECLARE_GLOBAL_UNARY(exp,scalar_exp_op,exponential,\sa ArrayBase::exp)
|
EIGEN_ARRAY_DECLARE_GLOBAL_UNARY(exp,scalar_exp_op,exponential,\sa ArrayBase::exp)
|
||||||
EIGEN_ARRAY_DECLARE_GLOBAL_UNARY(log,scalar_log_op,natural logarithm,\sa ArrayBase::log)
|
EIGEN_ARRAY_DECLARE_GLOBAL_UNARY(log,scalar_log_op,natural logarithm,\sa ArrayBase::log)
|
||||||
|
EIGEN_ARRAY_DECLARE_GLOBAL_UNARY(log1p,scalar_log1p_op,natural logarithm of 1 plus the value,\sa ArrayBase::log1p)
|
||||||
EIGEN_ARRAY_DECLARE_GLOBAL_UNARY(log10,scalar_log10_op,base 10 logarithm,)
|
EIGEN_ARRAY_DECLARE_GLOBAL_UNARY(log10,scalar_log10_op,base 10 logarithm,)
|
||||||
EIGEN_ARRAY_DECLARE_GLOBAL_UNARY(abs,scalar_abs_op,absolute value,\sa ArrayBase::abs DOXCOMMA MatrixBase::cwiseAbs)
|
EIGEN_ARRAY_DECLARE_GLOBAL_UNARY(abs,scalar_abs_op,absolute value,\sa ArrayBase::abs DOXCOMMA MatrixBase::cwiseAbs)
|
||||||
EIGEN_ARRAY_DECLARE_GLOBAL_UNARY(abs2,scalar_abs2_op,squared absolute value,\sa ArrayBase::abs2 DOXCOMMA MatrixBase::cwiseAbs2)
|
EIGEN_ARRAY_DECLARE_GLOBAL_UNARY(abs2,scalar_abs2_op,squared absolute value,\sa ArrayBase::abs2 DOXCOMMA MatrixBase::cwiseAbs2)
|
||||||
|
@ -266,7 +266,7 @@ struct functor_traits<scalar_exp_op<Scalar> > {
|
|||||||
*
|
*
|
||||||
* \brief Template functor to compute the logarithm of a scalar
|
* \brief Template functor to compute the logarithm of a scalar
|
||||||
*
|
*
|
||||||
* \sa class CwiseUnaryOp, Cwise::log()
|
* \sa class CwiseUnaryOp, ArrayBase::log()
|
||||||
*/
|
*/
|
||||||
template<typename Scalar> struct scalar_log_op {
|
template<typename Scalar> struct scalar_log_op {
|
||||||
EIGEN_EMPTY_STRUCT_CTOR(scalar_log_op)
|
EIGEN_EMPTY_STRUCT_CTOR(scalar_log_op)
|
||||||
@ -293,6 +293,26 @@ struct functor_traits<scalar_log_op<Scalar> > {
|
|||||||
};
|
};
|
||||||
};
|
};
|
||||||
|
|
||||||
|
/** \internal
|
||||||
|
*
|
||||||
|
* \brief Template functor to compute the logarithm of 1 plus a scalar value
|
||||||
|
*
|
||||||
|
* \sa class CwiseUnaryOp, ArrayBase::log1p()
|
||||||
|
*/
|
||||||
|
template<typename Scalar> struct scalar_log1p_op {
|
||||||
|
EIGEN_EMPTY_STRUCT_CTOR(scalar_log1p_op)
|
||||||
|
EIGEN_DEVICE_FUNC inline const Scalar operator() (const Scalar& a) const { return numext::log1p(a); }
|
||||||
|
template <typename Packet>
|
||||||
|
EIGEN_DEVICE_FUNC inline Packet packetOp(const Packet& a) const { return internal::plog1p(a); }
|
||||||
|
};
|
||||||
|
template <typename Scalar>
|
||||||
|
struct functor_traits<scalar_log1p_op<Scalar> > {
|
||||||
|
enum {
|
||||||
|
PacketAccess = packet_traits<Scalar>::HasLog1p,
|
||||||
|
Cost = functor_traits<scalar_log_op<Scalar> >::Cost // TODO measure cost of log1p
|
||||||
|
};
|
||||||
|
};
|
||||||
|
|
||||||
/** \internal
|
/** \internal
|
||||||
*
|
*
|
||||||
* \brief Template functor to compute the base-10 logarithm of a scalar
|
* \brief Template functor to compute the base-10 logarithm of a scalar
|
||||||
|
@ -244,6 +244,7 @@ template<typename ArrayType> void array_real(const ArrayType& m)
|
|||||||
VERIFY_IS_APPROX(m3.sqrt(), sqrt(abs(m1)));
|
VERIFY_IS_APPROX(m3.sqrt(), sqrt(abs(m1)));
|
||||||
VERIFY_IS_APPROX(m3.rsqrt(), Scalar(1)/sqrt(abs(m1)));
|
VERIFY_IS_APPROX(m3.rsqrt(), Scalar(1)/sqrt(abs(m1)));
|
||||||
VERIFY_IS_APPROX(m3.log(), log(m3));
|
VERIFY_IS_APPROX(m3.log(), log(m3));
|
||||||
|
VERIFY_IS_APPROX(m3.log1p(), log1p(m3));
|
||||||
VERIFY_IS_APPROX(m3.log10(), log10(m3));
|
VERIFY_IS_APPROX(m3.log10(), log10(m3));
|
||||||
|
|
||||||
|
|
||||||
@ -275,6 +276,7 @@ template<typename ArrayType> void array_real(const ArrayType& m)
|
|||||||
// shift argument of logarithm so that it is not zero
|
// shift argument of logarithm so that it is not zero
|
||||||
Scalar smallNumber = NumTraits<Scalar>::dummy_precision();
|
Scalar smallNumber = NumTraits<Scalar>::dummy_precision();
|
||||||
VERIFY_IS_APPROX((m3 + smallNumber).log() , log(abs(m1) + smallNumber));
|
VERIFY_IS_APPROX((m3 + smallNumber).log() , log(abs(m1) + smallNumber));
|
||||||
|
VERIFY_IS_APPROX((m3 + smallNumber + 1).log() , log1p(abs(m1) + smallNumber));
|
||||||
|
|
||||||
VERIFY_IS_APPROX(m1.exp() * m2.exp(), exp(m1+m2));
|
VERIFY_IS_APPROX(m1.exp() * m2.exp(), exp(m1+m2));
|
||||||
VERIFY_IS_APPROX(m1.exp(), exp(m1));
|
VERIFY_IS_APPROX(m1.exp(), exp(m1));
|
||||||
|
Loading…
x
Reference in New Issue
Block a user