| 10 | #include "main.h" |
| 11 | |
| 12 | template<typename MatrixType> void array_for_matrix(const MatrixType& m) |
| 13 | { |
| 14 | typedef typename MatrixType::Index Index; |
| 15 | typedef typename MatrixType::Scalar Scalar; |
| 16 | typedef Matrix<Scalar, MatrixType::RowsAtCompileTime, 1> ColVectorType; |
| 17 | typedef Matrix<Scalar, 1, MatrixType::ColsAtCompileTime> RowVectorType; |
| 18 | |
| 19 | Index rows = m.rows(); |
| 20 | Index cols = m.cols(); |
| 21 | |
| 22 | MatrixType m1 = MatrixType::Random(rows, cols), |
| 23 | m2 = MatrixType::Random(rows, cols), |
| 24 | m3(rows, cols); |
| 25 | |
| 26 | ColVectorType cv1 = ColVectorType::Random(rows); |
| 27 | RowVectorType rv1 = RowVectorType::Random(cols); |
| 28 | |
| 29 | Scalar s1 = internal::random<Scalar>(), |
| 30 | s2 = internal::random<Scalar>(); |
| 31 | |
| 32 | // scalar addition |
| 33 | VERIFY_IS_APPROX(m1.array() + s1, s1 + m1.array()); |
| 34 | VERIFY_IS_APPROX((m1.array() + s1).matrix(), MatrixType::Constant(rows,cols,s1) + m1); |
| 35 | VERIFY_IS_APPROX(((m1*Scalar(2)).array() - s2).matrix(), (m1+m1) - MatrixType::Constant(rows,cols,s2) ); |
| 36 | m3 = m1; |
| 37 | m3.array() += s2; |
| 38 | VERIFY_IS_APPROX(m3, (m1.array() + s2).matrix()); |
| 39 | m3 = m1; |
| 40 | m3.array() -= s1; |
| 41 | VERIFY_IS_APPROX(m3, (m1.array() - s1).matrix()); |
| 42 | |
| 43 | // reductions |
| 44 | VERIFY_IS_MUCH_SMALLER_THAN(m1.colwise().sum().sum() - m1.sum(), m1.squaredNorm()); |
| 45 | VERIFY_IS_MUCH_SMALLER_THAN(m1.rowwise().sum().sum() - m1.sum(), m1.squaredNorm()); |
| 46 | VERIFY_IS_MUCH_SMALLER_THAN(m1.colwise().sum() + m2.colwise().sum() - (m1+m2).colwise().sum(), (m1+m2).squaredNorm()); |
| 47 | VERIFY_IS_MUCH_SMALLER_THAN(m1.rowwise().sum() - m2.rowwise().sum() - (m1-m2).rowwise().sum(), (m1-m2).squaredNorm()); |
| 48 | VERIFY_IS_APPROX(m1.colwise().sum(), m1.colwise().redux(internal::scalar_sum_op<Scalar,Scalar>())); |
| 49 | |
| 50 | // vector-wise ops |
| 51 | m3 = m1; |
| 52 | VERIFY_IS_APPROX(m3.colwise() += cv1, m1.colwise() + cv1); |
| 53 | m3 = m1; |
| 54 | VERIFY_IS_APPROX(m3.colwise() -= cv1, m1.colwise() - cv1); |
| 55 | m3 = m1; |
| 56 | VERIFY_IS_APPROX(m3.rowwise() += rv1, m1.rowwise() + rv1); |
| 57 | m3 = m1; |
| 58 | VERIFY_IS_APPROX(m3.rowwise() -= rv1, m1.rowwise() - rv1); |
| 59 | |
| 60 | // empty objects |
| 61 | VERIFY_IS_APPROX(m1.block(0,0,0,cols).colwise().sum(), RowVectorType::Zero(cols)); |
| 62 | VERIFY_IS_APPROX(m1.block(0,0,rows,0).rowwise().prod(), ColVectorType::Ones(rows)); |
| 63 | |
| 64 | // verify the const accessors exist |
| 65 | const Scalar& ref_m1 = m.matrix().array().coeffRef(0); |
| 66 | const Scalar& ref_m2 = m.matrix().array().coeffRef(0,0); |
| 67 | const Scalar& ref_a1 = m.array().matrix().coeffRef(0); |
| 68 | const Scalar& ref_a2 = m.array().matrix().coeffRef(0,0); |
| 69 | VERIFY(&ref_a1 == &ref_m1); |