Add a Select expression in the Array module which mimics a coeff-wise ?: operator.
Example:
mat = (mat.cwise().abs().cwise() < Ones()).select(0,mat);
replaces all small values by 0. (the scalar version is "s = abs(s)<1 ? 0 : s")
diff --git a/test/array.cpp b/test/array.cpp
index f0b0905..0fa13b6 100644
--- a/test/array.cpp
+++ b/test/array.cpp
@@ -25,7 +25,7 @@
#include "main.h"
#include <Eigen/Array>
-template<typename MatrixType> void scalarAdd(const MatrixType& m)
+template<typename MatrixType> void array(const MatrixType& m)
{
/* this test covers the following files:
Array.cpp
@@ -45,6 +45,7 @@
Scalar s1 = ei_random<Scalar>(),
s2 = ei_random<Scalar>();
+ // scalar addition
VERIFY_IS_APPROX(m1.cwise() + s1, s1 + m1.cwise());
VERIFY_IS_APPROX(m1.cwise() + s1, MatrixType::Constant(rows,cols,s1) + m1);
VERIFY_IS_APPROX((m1*Scalar(2)).cwise() - s2, (m1+m1) - MatrixType::Constant(rows,cols,s2) );
@@ -55,6 +56,7 @@
m3.cwise() -= s1;
VERIFY_IS_APPROX(m3, m1.cwise() - s1);
+ // reductions
VERIFY_IS_APPROX(m1.colwise().sum().sum(), m1.sum());
VERIFY_IS_APPROX(m1.rowwise().sum().sum(), m1.sum());
if (!ei_isApprox(m1.sum(), (m1+m2).sum()))
@@ -86,17 +88,31 @@
VERIFY(! (m1.cwise() < m3).all() );
VERIFY(! (m1.cwise() > m3).all() );
}
+
+ // test Select
+ VERIFY_IS_APPROX( (m1.cwise()<m2).select(m1,m2), m1.cwise().min(m2) );
+ VERIFY_IS_APPROX( (m1.cwise()>m2).select(m1,m2), m1.cwise().max(m2) );
+ Scalar mid = (m1.cwise().abs().minCoeff() + m1.cwise().abs().maxCoeff())/Scalar(2);
+ for (int j=0; j<cols; ++j)
+ for (int i=0; i<rows; ++i)
+ m3(i,j) = ei_abs(m1(i,j))<mid ? 0 : m1(i,j);
+ VERIFY_IS_APPROX( (m1.cwise().abs().cwise()<MatrixType::Constant(rows,cols,mid))
+ .select(MatrixType::Zero(rows,cols),m1), m3);
+ VERIFY_IS_APPROX( (m1.cwise().abs().cwise()<MatrixType::Constant(rows,cols,mid))
+ .select(0,m1), m3);
+ VERIFY_IS_APPROX( (m1.cwise().abs().cwise()>=MatrixType::Constant(rows,cols,mid))
+ .select(m1,0), m3);
}
void test_array()
{
for(int i = 0; i < g_repeat; i++) {
- CALL_SUBTEST( scalarAdd(Matrix<float, 1, 1>()) );
- CALL_SUBTEST( scalarAdd(Matrix2f()) );
- CALL_SUBTEST( scalarAdd(Matrix4d()) );
- CALL_SUBTEST( scalarAdd(MatrixXcf(3, 3)) );
- CALL_SUBTEST( scalarAdd(MatrixXf(8, 12)) );
- CALL_SUBTEST( scalarAdd(MatrixXi(8, 12)) );
+ CALL_SUBTEST( array(Matrix<float, 1, 1>()) );
+ CALL_SUBTEST( array(Matrix2f()) );
+ CALL_SUBTEST( array(Matrix4d()) );
+ CALL_SUBTEST( array(MatrixXcf(3, 3)) );
+ CALL_SUBTEST( array(MatrixXf(8, 12)) );
+ CALL_SUBTEST( array(MatrixXi(8, 12)) );
}
for(int i = 0; i < g_repeat; i++) {
CALL_SUBTEST( comparisons(Matrix<float, 1, 1>()) );