Compare Eigen matrices in Google Test or Google Mock

后端 未结 3 2030
佛祖请我去吃肉
佛祖请我去吃肉 2021-02-14 13:03

I was wondering if there is a good way to test two Eigen matrices for approximate equality using Google Test, or Google Mock.

Take the following test-case as a

相关标签:
3条回答
  • 2021-02-14 13:23

    EXPECT_PRED2 from GoogleTest can be used for this.

    Under C++11 using a lambda works fine but looks unseemly:

      ASSERT_PRED2([](const MatrixXf &lhs, const MatrixXf &rhs) {
                      return lhs.isApprox(rhs, 1e-4);
                   },
                   C_expect, C_actual);
    

    If that fails, you get a print-out of the input arguments.

    Instead of using a lambda, a normal predicate function can be defined like this:

    bool MatrixEquality(const MatrixXf &lhs, const MatrixXf &rhs) {
      return lhs.isApprox(rhs, 1e-4);
    }
    
    TEST(Eigen, MatrixMultiplication) {
      ...
    
      ASSERT_PRED2(MatrixEquality, C_expected, C_actual);
    }
    

    The later version also works on pre-C++11.

    0 讨论(0)
  • 2021-02-14 13:25

    A simplified solution would be to compare the norm of the difference with some epsilon, i.e.

    (C_expect - C_actual).norm() < 1e-6 
    

    In a vector space || X - Y || == 0 if and only if X == Y, and the norm is always non-negative (real). This way, you won't have to manually do the loop and compare element-wise (of course the norm will perform more calculations in the background than simple element-wise comparisons)

    PS: the Matrix::norm() implemented in Eigen is the Frobenius norm, which is computationally very fast to evaluate, see http://mathworld.wolfram.com/FrobeniusNorm.html

    0 讨论(0)
  • 2021-02-14 13:32

    Why not use the isApprox or isMuchSmallerThan member functions of Eigen Matrix types?

    The documentation of these above functions are available here

    So for most cases ASSERT_TRUE(C_actual.isApprox(C_expect)); is what you need. You can also provide a precision parameter as the second arguement to isApprox.

    0 讨论(0)
提交回复
热议问题