aboutsummaryrefslogtreecommitdiffhomepage
path: root/test
diff options
context:
space:
mode:
authorGravatar Abraham Bachrach <abachrach@gmail.com>2012-01-11 11:00:30 -0500
committerGravatar Abraham Bachrach <abachrach@gmail.com>2012-01-11 11:00:30 -0500
commit039408cd66fdf106e153169c250a6ad696b84af3 (patch)
treee8969d50b4f05424fb18d61f10b7d8bf98ec5f19 /test
parent238999045c0c870834620d9d86a0254d2dd2f6d6 (diff)
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
Diffstat (limited to 'test')
-rw-r--r--test/array.cpp36
-rw-r--r--test/array_for_matrix.cpp36
2 files changed, 72 insertions, 0 deletions
diff --git a/test/array.cpp b/test/array.cpp
index 8bd62c4e9..662368c62 100644
--- a/test/array.cpp
+++ b/test/array.cpp
@@ -233,6 +233,35 @@ template<typename ArrayType> void array_complex(const ArrayType& m)
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()
{
for(int i = 0; i < g_repeat; i++) {
@@ -251,6 +280,13 @@ void test_array()
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++) {
CALL_SUBTEST_1( array_real(Array<float, 1, 1>()) );
CALL_SUBTEST_2( array_real(Array22f()) );
CALL_SUBTEST_3( array_real(Array44d()) );
diff --git a/test/array_for_matrix.cpp b/test/array_for_matrix.cpp
index 63c723e60..465b8998b 100644
--- a/test/array_for_matrix.cpp
+++ b/test/array_for_matrix.cpp
@@ -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());
}
+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()
{
for(int i = 0; i < g_repeat; i++) {
@@ -174,6 +203,13 @@ void test_array_for_matrix()
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++) {
CALL_SUBTEST_1( lpNorm(Matrix<float, 1, 1>()) );
CALL_SUBTEST_2( lpNorm(Vector2f()) );
CALL_SUBTEST_7( lpNorm(Vector3d()) );