mirror of
https://gitlab.com/libeigen/eigen.git
synced 2025-07-21 04:14:26 +08:00
bug #1193: fix lpNorm<Infinity> for empty input.
This commit is contained in:
parent
d616a81294
commit
8b6f53222b
@ -227,9 +227,12 @@ struct lpNorm_selector<Derived, 2>
|
|||||||
template<typename Derived>
|
template<typename Derived>
|
||||||
struct lpNorm_selector<Derived, Infinity>
|
struct lpNorm_selector<Derived, Infinity>
|
||||||
{
|
{
|
||||||
|
typedef typename NumTraits<typename traits<Derived>::Scalar>::Real RealScalar;
|
||||||
EIGEN_DEVICE_FUNC
|
EIGEN_DEVICE_FUNC
|
||||||
static inline typename NumTraits<typename traits<Derived>::Scalar>::Real run(const MatrixBase<Derived>& m)
|
static inline RealScalar run(const MatrixBase<Derived>& m)
|
||||||
{
|
{
|
||||||
|
if(Derived::SizeAtCompileTime==0 || (Derived::SizeAtCompileTime==Dynamic && m.size()==0))
|
||||||
|
return RealScalar(0);
|
||||||
return m.cwiseAbs().maxCoeff();
|
return m.cwiseAbs().maxCoeff();
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
@ -240,6 +243,8 @@ struct lpNorm_selector<Derived, Infinity>
|
|||||||
* of the coefficients of \c *this. If \a p is the special value \a Eigen::Infinity, this function returns the \f$ \ell^\infty \f$
|
* of the coefficients of \c *this. If \a p is the special value \a Eigen::Infinity, this function returns the \f$ \ell^\infty \f$
|
||||||
* norm, that is the maximum of the absolute values of the coefficients of \c *this.
|
* norm, that is the maximum of the absolute values of the coefficients of \c *this.
|
||||||
*
|
*
|
||||||
|
* In all cases, if \c *this is empty, then the value 0 is returned.
|
||||||
|
*
|
||||||
* \note For matrices, this function does not compute the <a href="https://en.wikipedia.org/wiki/Operator_norm">operator-norm</a>. That is, if \c *this is a matrix, then its coefficients are interpreted as a 1D vector. Nonetheless, you can easily compute the 1-norm and \f$\infty\f$-norm matrix operator norms using \link TutorialReductionsVisitorsBroadcastingReductionsNorm partial reductions \endlink.
|
* \note For matrices, this function does not compute the <a href="https://en.wikipedia.org/wiki/Operator_norm">operator-norm</a>. That is, if \c *this is a matrix, then its coefficients are interpreted as a 1D vector. Nonetheless, you can easily compute the 1-norm and \f$\infty\f$-norm matrix operator norms using \link TutorialReductionsVisitorsBroadcastingReductionsNorm partial reductions \endlink.
|
||||||
*
|
*
|
||||||
* \sa norm()
|
* \sa norm()
|
||||||
|
@ -438,7 +438,9 @@ DenseBase<Derived>::maxCoeff() const
|
|||||||
return derived().redux(Eigen::internal::scalar_max_op<Scalar>());
|
return derived().redux(Eigen::internal::scalar_max_op<Scalar>());
|
||||||
}
|
}
|
||||||
|
|
||||||
/** \returns the sum of all coefficients of *this
|
/** \returns the sum of all coefficients of \c *this
|
||||||
|
*
|
||||||
|
* If \c *this is empty, then the value 0 is returned.
|
||||||
*
|
*
|
||||||
* \sa trace(), prod(), mean()
|
* \sa trace(), prod(), mean()
|
||||||
*/
|
*/
|
||||||
|
@ -144,9 +144,21 @@ template<typename MatrixType> void comparisons(const MatrixType& m)
|
|||||||
template<typename VectorType> void lpNorm(const VectorType& v)
|
template<typename VectorType> void lpNorm(const VectorType& v)
|
||||||
{
|
{
|
||||||
using std::sqrt;
|
using std::sqrt;
|
||||||
|
typedef typename VectorType::RealScalar RealScalar;
|
||||||
VectorType u = VectorType::Random(v.size());
|
VectorType u = VectorType::Random(v.size());
|
||||||
|
|
||||||
VERIFY_IS_APPROX(u.template lpNorm<Infinity>(), u.cwiseAbs().maxCoeff());
|
if(v.size()==0)
|
||||||
|
{
|
||||||
|
VERIFY_IS_APPROX(u.template lpNorm<Infinity>(), RealScalar(0));
|
||||||
|
VERIFY_IS_APPROX(u.template lpNorm<1>(), RealScalar(0));
|
||||||
|
VERIFY_IS_APPROX(u.template lpNorm<2>(), RealScalar(0));
|
||||||
|
VERIFY_IS_APPROX(u.template lpNorm<5>(), RealScalar(0));
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
VERIFY_IS_APPROX(u.template lpNorm<Infinity>(), u.cwiseAbs().maxCoeff());
|
||||||
|
}
|
||||||
|
|
||||||
VERIFY_IS_APPROX(u.template lpNorm<1>(), u.cwiseAbs().sum());
|
VERIFY_IS_APPROX(u.template lpNorm<1>(), u.cwiseAbs().sum());
|
||||||
VERIFY_IS_APPROX(u.template lpNorm<2>(), sqrt(u.array().abs().square().sum()));
|
VERIFY_IS_APPROX(u.template lpNorm<2>(), sqrt(u.array().abs().square().sum()));
|
||||||
VERIFY_IS_APPROX(numext::pow(u.template lpNorm<5>(), typename VectorType::RealScalar(5)), u.array().abs().pow(5).sum());
|
VERIFY_IS_APPROX(numext::pow(u.template lpNorm<5>(), typename VectorType::RealScalar(5)), u.array().abs().pow(5).sum());
|
||||||
@ -255,6 +267,8 @@ void test_array_for_matrix()
|
|||||||
CALL_SUBTEST_5( lpNorm(VectorXf(internal::random<int>(1,EIGEN_TEST_MAX_SIZE))) );
|
CALL_SUBTEST_5( lpNorm(VectorXf(internal::random<int>(1,EIGEN_TEST_MAX_SIZE))) );
|
||||||
CALL_SUBTEST_4( lpNorm(VectorXcf(internal::random<int>(1,EIGEN_TEST_MAX_SIZE))) );
|
CALL_SUBTEST_4( lpNorm(VectorXcf(internal::random<int>(1,EIGEN_TEST_MAX_SIZE))) );
|
||||||
}
|
}
|
||||||
|
CALL_SUBTEST_5( lpNorm(VectorXf(0)) );
|
||||||
|
CALL_SUBTEST_4( lpNorm(VectorXcf(0)) );
|
||||||
for(int i = 0; i < g_repeat; i++) {
|
for(int i = 0; i < g_repeat; i++) {
|
||||||
CALL_SUBTEST_4( resize(MatrixXcf(internal::random<int>(1,EIGEN_TEST_MAX_SIZE), internal::random<int>(1,EIGEN_TEST_MAX_SIZE))) );
|
CALL_SUBTEST_4( resize(MatrixXcf(internal::random<int>(1,EIGEN_TEST_MAX_SIZE), internal::random<int>(1,EIGEN_TEST_MAX_SIZE))) );
|
||||||
CALL_SUBTEST_5( resize(MatrixXf(internal::random<int>(1,EIGEN_TEST_MAX_SIZE), internal::random<int>(1,EIGEN_TEST_MAX_SIZE))) );
|
CALL_SUBTEST_5( resize(MatrixXf(internal::random<int>(1,EIGEN_TEST_MAX_SIZE), internal::random<int>(1,EIGEN_TEST_MAX_SIZE))) );
|
||||||
|
Loading…
x
Reference in New Issue
Block a user