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
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.
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
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.