mirror of
https://gitlab.com/libeigen/eigen.git
synced 2025-07-16 18:11:47 +08:00
added functions to allow for cwise min/max operations with scalar argument (bug #400).
added function for array.min(), array.max(), matrix.cwiseMin(), matrix.cwiseMax(). The matrix.cwiseMin/Max functions required the definition of the ConstantReturnType typedef. However, it wasn't defined until after MatrixCwiseBinaryOps was included in Eigen/src/SparseCore/SparseMatrixBase.h, so I moved those includes after the definition of the typedefs. tests for both the regular and scalar min/max functions were added as well
This commit is contained in:
parent
238999045c
commit
039408cd66
@ -117,16 +117,6 @@ template<typename Derived> class SparseMatrixBase : public EigenBase<Derived>
|
|||||||
|
|
||||||
typedef SparseMatrix<Scalar, Flags&RowMajorBit ? RowMajor : ColMajor> PlainObject;
|
typedef SparseMatrix<Scalar, Flags&RowMajorBit ? RowMajor : ColMajor> PlainObject;
|
||||||
|
|
||||||
#define EIGEN_CURRENT_STORAGE_BASE_CLASS Eigen::SparseMatrixBase
|
|
||||||
# include "../plugins/CommonCwiseUnaryOps.h"
|
|
||||||
# include "../plugins/CommonCwiseBinaryOps.h"
|
|
||||||
# include "../plugins/MatrixCwiseUnaryOps.h"
|
|
||||||
# include "../plugins/MatrixCwiseBinaryOps.h"
|
|
||||||
# ifdef EIGEN_SPARSEMATRIXBASE_PLUGIN
|
|
||||||
# include EIGEN_SPARSEMATRIXBASE_PLUGIN
|
|
||||||
# endif
|
|
||||||
# undef EIGEN_CURRENT_STORAGE_BASE_CLASS
|
|
||||||
#undef EIGEN_CURRENT_STORAGE_BASE_CLASS
|
|
||||||
|
|
||||||
#ifndef EIGEN_PARSED_BY_DOXYGEN
|
#ifndef EIGEN_PARSED_BY_DOXYGEN
|
||||||
/** This is the "real scalar" type; if the \a Scalar type is already real numbers
|
/** This is the "real scalar" type; if the \a Scalar type is already real numbers
|
||||||
@ -154,6 +144,18 @@ template<typename Derived> class SparseMatrixBase : public EigenBase<Derived>
|
|||||||
{ return *static_cast<Derived*>(const_cast<SparseMatrixBase*>(this)); }
|
{ return *static_cast<Derived*>(const_cast<SparseMatrixBase*>(this)); }
|
||||||
#endif // not EIGEN_PARSED_BY_DOXYGEN
|
#endif // not EIGEN_PARSED_BY_DOXYGEN
|
||||||
|
|
||||||
|
#define EIGEN_CURRENT_STORAGE_BASE_CLASS Eigen::SparseMatrixBase
|
||||||
|
# include "../plugins/CommonCwiseUnaryOps.h"
|
||||||
|
# include "../plugins/CommonCwiseBinaryOps.h"
|
||||||
|
# include "../plugins/MatrixCwiseUnaryOps.h"
|
||||||
|
# include "../plugins/MatrixCwiseBinaryOps.h"
|
||||||
|
# ifdef EIGEN_SPARSEMATRIXBASE_PLUGIN
|
||||||
|
# include EIGEN_SPARSEMATRIXBASE_PLUGIN
|
||||||
|
# endif
|
||||||
|
# undef EIGEN_CURRENT_STORAGE_BASE_CLASS
|
||||||
|
#undef EIGEN_CURRENT_STORAGE_BASE_CLASS
|
||||||
|
|
||||||
|
|
||||||
/** \returns the number of rows. \sa cols() */
|
/** \returns the number of rows. \sa cols() */
|
||||||
inline Index rows() const { return derived().rows(); }
|
inline Index rows() const { return derived().rows(); }
|
||||||
/** \returns the number of columns. \sa rows() */
|
/** \returns the number of columns. \sa rows() */
|
||||||
|
@ -29,6 +29,16 @@ operator/(const EIGEN_CURRENT_STORAGE_BASE_CLASS<OtherDerived> &other) const
|
|||||||
*/
|
*/
|
||||||
EIGEN_MAKE_CWISE_BINARY_OP(min,internal::scalar_min_op)
|
EIGEN_MAKE_CWISE_BINARY_OP(min,internal::scalar_min_op)
|
||||||
|
|
||||||
|
/** \returns an expression of the coefficient-wise min of \c *this and scalar \a other
|
||||||
|
*
|
||||||
|
* \sa max()
|
||||||
|
*/
|
||||||
|
EIGEN_STRONG_INLINE const CwiseBinaryOp<internal::scalar_min_op<Scalar>, const Derived, const ConstantReturnType>
|
||||||
|
(min)(const Scalar &other) const
|
||||||
|
{
|
||||||
|
return (min)(Derived::PlainObject::Constant(rows(), cols(), other));
|
||||||
|
}
|
||||||
|
|
||||||
/** \returns an expression of the coefficient-wise max of \c *this and \a other
|
/** \returns an expression of the coefficient-wise max of \c *this and \a other
|
||||||
*
|
*
|
||||||
* Example: \include Cwise_max.cpp
|
* Example: \include Cwise_max.cpp
|
||||||
@ -38,6 +48,16 @@ EIGEN_MAKE_CWISE_BINARY_OP(min,internal::scalar_min_op)
|
|||||||
*/
|
*/
|
||||||
EIGEN_MAKE_CWISE_BINARY_OP(max,internal::scalar_max_op)
|
EIGEN_MAKE_CWISE_BINARY_OP(max,internal::scalar_max_op)
|
||||||
|
|
||||||
|
/** \returns an expression of the coefficient-wise max of \c *this and scalar \a other
|
||||||
|
*
|
||||||
|
* \sa min()
|
||||||
|
*/
|
||||||
|
EIGEN_STRONG_INLINE const CwiseBinaryOp<internal::scalar_max_op<Scalar>, const Derived, const ConstantReturnType>
|
||||||
|
(max)(const Scalar &other) const
|
||||||
|
{
|
||||||
|
return (max)(Derived::PlainObject::Constant(rows(), cols(), other));
|
||||||
|
}
|
||||||
|
|
||||||
/** \returns an expression of the coefficient-wise \< operator of *this and \a other
|
/** \returns an expression of the coefficient-wise \< operator of *this and \a other
|
||||||
*
|
*
|
||||||
* Example: \include Cwise_less.cpp
|
* Example: \include Cwise_less.cpp
|
||||||
|
@ -91,6 +91,16 @@ cwiseMin(const EIGEN_CURRENT_STORAGE_BASE_CLASS<OtherDerived> &other) const
|
|||||||
return CwiseBinaryOp<internal::scalar_min_op<Scalar>, const Derived, const OtherDerived>(derived(), other.derived());
|
return CwiseBinaryOp<internal::scalar_min_op<Scalar>, const Derived, const OtherDerived>(derived(), other.derived());
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/** \returns an expression of the coefficient-wise min of *this and scalar \a other
|
||||||
|
*
|
||||||
|
* \sa class CwiseBinaryOp, min()
|
||||||
|
*/
|
||||||
|
EIGEN_STRONG_INLINE const CwiseBinaryOp<internal::scalar_min_op<Scalar>, const Derived, const ConstantReturnType>
|
||||||
|
cwiseMin(const Scalar &other) const
|
||||||
|
{
|
||||||
|
return cwiseMin(Derived::PlainObject::Constant(rows(), cols(), other));
|
||||||
|
}
|
||||||
|
|
||||||
/** \returns an expression of the coefficient-wise max of *this and \a other
|
/** \returns an expression of the coefficient-wise max of *this and \a other
|
||||||
*
|
*
|
||||||
* Example: \include MatrixBase_cwiseMax.cpp
|
* Example: \include MatrixBase_cwiseMax.cpp
|
||||||
@ -105,6 +115,17 @@ cwiseMax(const EIGEN_CURRENT_STORAGE_BASE_CLASS<OtherDerived> &other) const
|
|||||||
return CwiseBinaryOp<internal::scalar_max_op<Scalar>, const Derived, const OtherDerived>(derived(), other.derived());
|
return CwiseBinaryOp<internal::scalar_max_op<Scalar>, const Derived, const OtherDerived>(derived(), other.derived());
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/** \returns an expression of the coefficient-wise max of *this and scalar \a other
|
||||||
|
*
|
||||||
|
* \sa class CwiseBinaryOp, min()
|
||||||
|
*/
|
||||||
|
EIGEN_STRONG_INLINE const CwiseBinaryOp<internal::scalar_max_op<Scalar>, const Derived, const ConstantReturnType>
|
||||||
|
cwiseMax(const Scalar &other) const
|
||||||
|
{
|
||||||
|
return cwiseMax(Derived::PlainObject::Constant(rows(), cols(), other));
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
/** \returns an expression of the coefficient-wise quotient of *this and \a other
|
/** \returns an expression of the coefficient-wise quotient of *this and \a other
|
||||||
*
|
*
|
||||||
* Example: \include MatrixBase_cwiseQuotient.cpp
|
* Example: \include MatrixBase_cwiseQuotient.cpp
|
||||||
|
@ -233,6 +233,35 @@ template<typename ArrayType> void array_complex(const ArrayType& m)
|
|||||||
VERIFY_IS_APPROX(m1.sqrt(), internal::sqrt(m1));
|
VERIFY_IS_APPROX(m1.sqrt(), internal::sqrt(m1));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
template<typename ArrayType> void min_max(const ArrayType& m)
|
||||||
|
{
|
||||||
|
typedef typename ArrayType::Index Index;
|
||||||
|
typedef typename ArrayType::Scalar Scalar;
|
||||||
|
|
||||||
|
Index rows = m.rows();
|
||||||
|
Index cols = m.cols();
|
||||||
|
|
||||||
|
ArrayType m1 = ArrayType::Random(rows, cols);
|
||||||
|
|
||||||
|
// min/max with array
|
||||||
|
Scalar maxM1 = m1.maxCoeff();
|
||||||
|
Scalar minM1 = m1.minCoeff();
|
||||||
|
|
||||||
|
VERIFY_IS_APPROX(ArrayType::Constant(rows,cols, minM1), (m1.min)(ArrayType::Constant(rows,cols, minM1)));
|
||||||
|
VERIFY_IS_APPROX(m1, (m1.min)(ArrayType::Constant(rows,cols, maxM1)));
|
||||||
|
|
||||||
|
VERIFY_IS_APPROX(ArrayType::Constant(rows,cols, maxM1), (m1.max)(ArrayType::Constant(rows,cols, maxM1)));
|
||||||
|
VERIFY_IS_APPROX(m1, (m1.max)(ArrayType::Constant(rows,cols, minM1)));
|
||||||
|
|
||||||
|
// min/max with scalar input
|
||||||
|
VERIFY_IS_APPROX(ArrayType::Constant(rows,cols, minM1), (m1.min)( minM1));
|
||||||
|
VERIFY_IS_APPROX(m1, (m1.min)( maxM1));
|
||||||
|
|
||||||
|
VERIFY_IS_APPROX(ArrayType::Constant(rows,cols, maxM1), (m1.max)( maxM1));
|
||||||
|
VERIFY_IS_APPROX(m1, (m1.max)( minM1));
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
void test_array()
|
void test_array()
|
||||||
{
|
{
|
||||||
for(int i = 0; i < g_repeat; i++) {
|
for(int i = 0; i < g_repeat; i++) {
|
||||||
@ -250,6 +279,13 @@ void test_array()
|
|||||||
CALL_SUBTEST_5( comparisons(ArrayXXf(internal::random<int>(1,EIGEN_TEST_MAX_SIZE), internal::random<int>(1,EIGEN_TEST_MAX_SIZE))) );
|
CALL_SUBTEST_5( comparisons(ArrayXXf(internal::random<int>(1,EIGEN_TEST_MAX_SIZE), internal::random<int>(1,EIGEN_TEST_MAX_SIZE))) );
|
||||||
CALL_SUBTEST_6( comparisons(ArrayXXi(internal::random<int>(1,EIGEN_TEST_MAX_SIZE), internal::random<int>(1,EIGEN_TEST_MAX_SIZE))) );
|
CALL_SUBTEST_6( comparisons(ArrayXXi(internal::random<int>(1,EIGEN_TEST_MAX_SIZE), internal::random<int>(1,EIGEN_TEST_MAX_SIZE))) );
|
||||||
}
|
}
|
||||||
|
for(int i = 0; i < g_repeat; i++) {
|
||||||
|
CALL_SUBTEST_1( min_max(Array<float, 1, 1>()) );
|
||||||
|
CALL_SUBTEST_2( min_max(Array22f()) );
|
||||||
|
CALL_SUBTEST_3( min_max(Array44d()) );
|
||||||
|
CALL_SUBTEST_5( min_max(ArrayXXf(internal::random<int>(1,EIGEN_TEST_MAX_SIZE), internal::random<int>(1,EIGEN_TEST_MAX_SIZE))) );
|
||||||
|
CALL_SUBTEST_6( min_max(ArrayXXi(internal::random<int>(1,EIGEN_TEST_MAX_SIZE), internal::random<int>(1,EIGEN_TEST_MAX_SIZE))) );
|
||||||
|
}
|
||||||
for(int i = 0; i < g_repeat; i++) {
|
for(int i = 0; i < g_repeat; i++) {
|
||||||
CALL_SUBTEST_1( array_real(Array<float, 1, 1>()) );
|
CALL_SUBTEST_1( array_real(Array<float, 1, 1>()) );
|
||||||
CALL_SUBTEST_2( array_real(Array22f()) );
|
CALL_SUBTEST_2( array_real(Array22f()) );
|
||||||
|
@ -156,6 +156,35 @@ template<typename VectorType> void lpNorm(const VectorType& v)
|
|||||||
VERIFY_IS_APPROX(internal::pow(u.template lpNorm<5>(), typename VectorType::RealScalar(5)), u.array().abs().pow(5).sum());
|
VERIFY_IS_APPROX(internal::pow(u.template lpNorm<5>(), typename VectorType::RealScalar(5)), u.array().abs().pow(5).sum());
|
||||||
}
|
}
|
||||||
|
|
||||||
|
template<typename MatrixType> void cwise_min_max(const MatrixType& m)
|
||||||
|
{
|
||||||
|
typedef typename MatrixType::Index Index;
|
||||||
|
typedef typename MatrixType::Scalar Scalar;
|
||||||
|
|
||||||
|
Index rows = m.rows();
|
||||||
|
Index cols = m.cols();
|
||||||
|
|
||||||
|
MatrixType m1 = MatrixType::Random(rows, cols);
|
||||||
|
|
||||||
|
// min/max with array
|
||||||
|
Scalar maxM1 = m1.maxCoeff();
|
||||||
|
Scalar minM1 = m1.minCoeff();
|
||||||
|
|
||||||
|
VERIFY_IS_APPROX(MatrixType::Constant(rows,cols, minM1), m1.cwiseMin(MatrixType::Constant(rows,cols, minM1)));
|
||||||
|
VERIFY_IS_APPROX(m1, m1.cwiseMin(MatrixType::Constant(rows,cols, maxM1)));
|
||||||
|
|
||||||
|
VERIFY_IS_APPROX(MatrixType::Constant(rows,cols, maxM1), m1.cwiseMax(MatrixType::Constant(rows,cols, maxM1)));
|
||||||
|
VERIFY_IS_APPROX(m1, m1.cwiseMax(MatrixType::Constant(rows,cols, minM1)));
|
||||||
|
|
||||||
|
// min/max with scalar input
|
||||||
|
VERIFY_IS_APPROX(MatrixType::Constant(rows,cols, minM1), m1.cwiseMin( minM1));
|
||||||
|
VERIFY_IS_APPROX(m1, m1.cwiseMin( maxM1));
|
||||||
|
|
||||||
|
VERIFY_IS_APPROX(MatrixType::Constant(rows,cols, maxM1), m1.cwiseMax( maxM1));
|
||||||
|
VERIFY_IS_APPROX(m1, m1.cwiseMax( minM1));
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
void test_array_for_matrix()
|
void test_array_for_matrix()
|
||||||
{
|
{
|
||||||
for(int i = 0; i < g_repeat; i++) {
|
for(int i = 0; i < g_repeat; i++) {
|
||||||
@ -173,6 +202,13 @@ void test_array_for_matrix()
|
|||||||
CALL_SUBTEST_5( comparisons(MatrixXf(internal::random<int>(1,EIGEN_TEST_MAX_SIZE), internal::random<int>(1,EIGEN_TEST_MAX_SIZE))) );
|
CALL_SUBTEST_5( comparisons(MatrixXf(internal::random<int>(1,EIGEN_TEST_MAX_SIZE), internal::random<int>(1,EIGEN_TEST_MAX_SIZE))) );
|
||||||
CALL_SUBTEST_6( comparisons(MatrixXi(internal::random<int>(1,EIGEN_TEST_MAX_SIZE), internal::random<int>(1,EIGEN_TEST_MAX_SIZE))) );
|
CALL_SUBTEST_6( comparisons(MatrixXi(internal::random<int>(1,EIGEN_TEST_MAX_SIZE), internal::random<int>(1,EIGEN_TEST_MAX_SIZE))) );
|
||||||
}
|
}
|
||||||
|
for(int i = 0; i < g_repeat; i++) {
|
||||||
|
CALL_SUBTEST_1( cwise_min_max(Matrix<float, 1, 1>()) );
|
||||||
|
CALL_SUBTEST_2( cwise_min_max(Matrix2f()) );
|
||||||
|
CALL_SUBTEST_3( cwise_min_max(Matrix4d()) );
|
||||||
|
CALL_SUBTEST_5( cwise_min_max(MatrixXf(internal::random<int>(1,EIGEN_TEST_MAX_SIZE), internal::random<int>(1,EIGEN_TEST_MAX_SIZE))) );
|
||||||
|
CALL_SUBTEST_6( cwise_min_max(MatrixXi(internal::random<int>(1,EIGEN_TEST_MAX_SIZE), internal::random<int>(1,EIGEN_TEST_MAX_SIZE))) );
|
||||||
|
}
|
||||||
for(int i = 0; i < g_repeat; i++) {
|
for(int i = 0; i < g_repeat; i++) {
|
||||||
CALL_SUBTEST_1( lpNorm(Matrix<float, 1, 1>()) );
|
CALL_SUBTEST_1( lpNorm(Matrix<float, 1, 1>()) );
|
||||||
CALL_SUBTEST_2( lpNorm(Vector2f()) );
|
CALL_SUBTEST_2( lpNorm(Vector2f()) );
|
||||||
|
Loading…
x
Reference in New Issue
Block a user