mirror of
https://gitlab.com/libeigen/eigen.git
synced 2026-04-10 11:34:33 +08:00
the big Array/Cwise rework as discussed on the mailing list. The new API
can be seen in Eigen/src/Core/Cwise.h.
This commit is contained in:
@@ -44,15 +44,15 @@ template<typename MatrixType> void scalarAdd(const MatrixType& m)
|
||||
Scalar s1 = ei_random<Scalar>(),
|
||||
s2 = ei_random<Scalar>();
|
||||
|
||||
VERIFY_IS_APPROX(m1.array() + s1, s1 + m1.array());
|
||||
VERIFY_IS_APPROX(m1.array() + s1, MatrixType::constant(rows,cols,s1) + m1);
|
||||
VERIFY_IS_APPROX((m1*Scalar(2)).array() - s2, (m1+m1) - MatrixType::constant(rows,cols,s2) );
|
||||
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) );
|
||||
m3 = m1;
|
||||
m3.array() += s2;
|
||||
VERIFY_IS_APPROX(m3, m1.array() + s2);
|
||||
m3.cwise() += s2;
|
||||
VERIFY_IS_APPROX(m3, m1.cwise() + s2);
|
||||
m3 = m1;
|
||||
m3.array() -= s1;
|
||||
VERIFY_IS_APPROX(m3, m1.array() - s1);
|
||||
m3.cwise() -= s1;
|
||||
VERIFY_IS_APPROX(m3, m1.cwise() - s1);
|
||||
}
|
||||
|
||||
template<typename MatrixType> void comparisons(const MatrixType& m)
|
||||
@@ -70,14 +70,14 @@ template<typename MatrixType> void comparisons(const MatrixType& m)
|
||||
m2 = MatrixType::random(rows, cols),
|
||||
m3(rows, cols);
|
||||
|
||||
VERIFY((m1.array() + Scalar(1)).array() > m1.array());
|
||||
VERIFY((m1.array() - Scalar(1)).array() < m1.array());
|
||||
VERIFY(((m1.cwise() + Scalar(1)).cwise() > m1).all());
|
||||
VERIFY(((m1.cwise() - Scalar(1)).cwise() < m1).all());
|
||||
if (rows*cols>1)
|
||||
{
|
||||
m3 = m1;
|
||||
m3(r,c) += 1;
|
||||
VERIFY(! (m1.array() < m3.array()) );
|
||||
VERIFY(! (m1.array() > m3.array()) );
|
||||
VERIFY(! (m1.cwise() < m3).all() );
|
||||
VERIFY(! (m1.cwise() > m3).all() );
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -55,7 +55,7 @@ template<typename MatrixType> void cwiseops(const MatrixType& m)
|
||||
v2 = VectorType::random(rows),
|
||||
vzero = VectorType::zero(rows);
|
||||
|
||||
m2 = m2.template cwise<AddIfNull<Scalar> >(mones);
|
||||
m2 = m2.template binaryExpr<AddIfNull<Scalar> >(mones);
|
||||
|
||||
VERIFY_IS_APPROX( mzero, m1-m1);
|
||||
VERIFY_IS_APPROX( m2, m1+m2-m1);
|
||||
@@ -63,13 +63,13 @@ template<typename MatrixType> void cwiseops(const MatrixType& m)
|
||||
if(NumTraits<Scalar>::HasFloatingPoint)
|
||||
#endif
|
||||
{
|
||||
VERIFY_IS_APPROX( mones, m2.cwiseQuotient(m2));
|
||||
VERIFY_IS_APPROX( mones, m2.cwise()/m2);
|
||||
}
|
||||
VERIFY_IS_APPROX( m1.cwiseProduct(m2), m2.cwiseProduct(m1));
|
||||
VERIFY_IS_APPROX( m1.cwise() * m2, m2.cwise() * m1);
|
||||
|
||||
VERIFY( m1.cwiseLessThan(m1.cwise(bind2nd(plus<Scalar>(), Scalar(1)))).all() );
|
||||
VERIFY( !m1.cwiseLessThan(m1.cwise(bind2nd(minus<Scalar>(), Scalar(1)))).all() );
|
||||
VERIFY( !m1.cwiseGreaterThan(m1.cwise(bind2nd(plus<Scalar>(), Scalar(1)))).any() );
|
||||
VERIFY( (m1.cwise()<m1.unaryExpr(bind2nd(plus<Scalar>(), Scalar(1)))).all() );
|
||||
VERIFY( !(m1.cwise()<m1.unaryExpr(bind2nd(minus<Scalar>(), Scalar(1)))).all() );
|
||||
VERIFY( !(m1.cwise()>m1.unaryExpr(bind2nd(plus<Scalar>(), Scalar(1)))).any() );
|
||||
//VERIFY_IS_APPROX( m1, m2.cwiseProduct(m1).cwiseQuotient(m2));
|
||||
|
||||
// VERIFY_IS_APPROX( cwiseMin(m1,m2), cwiseMin(m2,m1) );
|
||||
|
||||
@@ -65,7 +65,7 @@ template<typename Scalar> void geometry(void)
|
||||
VERIFY_IS_APPROX(Quaternion(EulerAngles(q1)) * v1, q1 * v1);
|
||||
EulerAngles ea = q2;
|
||||
VERIFY_IS_APPROX(EulerAngles(Quaternion(ea)).coeffs(), ea.coeffs());
|
||||
VERIFY_IS_NOT_APPROX(EulerAngles(Quaternion(EulerAngles(v2.cwiseProduct(Vector3(0.2,-0.2,1))))).coeffs(), v2);
|
||||
VERIFY_IS_NOT_APPROX(EulerAngles(Quaternion(EulerAngles(v2.cwise() * Vector3(0.2,-0.2,1)))).coeffs(), v2);
|
||||
|
||||
// angle-axis conversion
|
||||
AngleAxis aa = q1;
|
||||
@@ -128,7 +128,7 @@ template<typename Scalar> void geometry(void)
|
||||
t0.pretranslate(v0);
|
||||
t0.scale(v1);
|
||||
t1.affine() = q1.conjugate().toRotationMatrix();
|
||||
t1.prescale(v1.cwiseInverse());
|
||||
t1.prescale(v1.cwise().inverse());
|
||||
t1.translate(-v0);
|
||||
|
||||
VERIFY((t0.matrix() * t1.matrix()).isIdentity());
|
||||
@@ -147,7 +147,7 @@ template<typename Scalar> void geometry(void)
|
||||
|
||||
t21.setIdentity();
|
||||
t21.affine() = Rotation2D<Scalar>(-a).toRotationMatrix();
|
||||
VERIFY( (t20.fromPositionOrientationScale(v20,a,v21) * (t21.prescale(v21.cwiseInverse()).translate(-v20))).isIdentity() );
|
||||
VERIFY( (t20.fromPositionOrientationScale(v20,a,v21) * (t21.prescale(v21.cwise().inverse()).translate(-v20))).isIdentity() );
|
||||
}
|
||||
|
||||
void test_geometry()
|
||||
|
||||
@@ -85,7 +85,7 @@ template<typename MatrixType> void linearStructure(const MatrixType& m)
|
||||
|
||||
// use .block to disable vectorization and compare to the vectorized version
|
||||
VERIFY_IS_APPROX(m1+m1.block(0,0,rows,cols), m1+m1);
|
||||
VERIFY_IS_APPROX(m1.cwiseProduct(m1.block(0,0,rows,cols)), m1.cwiseProduct(m1));
|
||||
VERIFY_IS_APPROX(m1.cwise() * m1.block(0,0,rows,cols), m1.cwise() * m1);
|
||||
VERIFY_IS_APPROX(m1 - m1.block(0,0,rows,cols), m1 - m1);
|
||||
VERIFY_IS_APPROX(m1.block(0,0,rows,cols) * s1, m1 * s1);
|
||||
}
|
||||
|
||||
@@ -75,7 +75,7 @@ template<typename MatrixType> void nomalloc(const MatrixType& m)
|
||||
|
||||
VERIFY_IS_APPROX((m1+m2)*s1, s1*m1+s1*m2);
|
||||
VERIFY_IS_APPROX((m1+m2)(r,c), (m1(r,c))+(m2(r,c)));
|
||||
VERIFY_IS_APPROX(m1.cwiseProduct(m1.block(0,0,rows,cols)), m1.cwiseProduct(m1));
|
||||
VERIFY_IS_APPROX(m1.cwise() * m1.block(0,0,rows,cols), m1.cwise() * m1);
|
||||
VERIFY_IS_APPROX((m1*m1.transpose())*m2, m1*(m1.transpose()*m2));
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user