我想知道是否有一种很好的方法可以使用
Google Test或
Google Mock测试两个
Eigen矩阵的近似相等性.
以下面的测试用例作为简化示例:我将两个复值矩阵A和B相乘,并期望得到某个结果C_expect.我使用Eigen计算数值结果C_actual = A * B.现在,我想比较C_expect和C_actual.现在,相应的代码如下所示:
#include <complex> #include <Eigen/Dense> #include <gtest/gtest.h> #include <gmock/gmock.h> typedef std::complex<double> Complex; typedef Eigen::Matrix2cd Matrix; TEST(Eigen,MatrixMultiplication) { Matrix A,B,C_expect,C_actual; A << Complex(1,1),Complex(2,3),Complex(3,2),Complex(4,4); B << Complex(4,4),Complex(1,1); C_expect << Complex(-5,20),Complex(0,10),40),Complex(5,20); C_actual = A * B; // !!! These are the lines that bother me. for (int j = 0; j < C_actual.cols(); ++j) { for (int i = 0; i < C_actual.rows(); ++i) { EXPECT_NEAR(C_expect(i,j).real(),C_actual(i,1e-7) << "Re(" << i << "," << j << ")"; EXPECT_NEAR(C_expect(i,j).imag(),1e-7) << "Im(" << i << "," << j << ")"; } } }
这有什么问题?好吧,我必须手动迭代矩阵的所有索引,然后分别比较实部和虚部.我更喜欢Google Mock的ElementsAreArray匹配器.例如.
EXPECT_THAT(C_actual,ElementsAreArray(C_expect)); // or EXPECT_THAT(C_actual,Pointwise(MyComplexNear(1e-7),C_expect));
不幸的是,Google Mock的内置功能似乎只适用于一维C风格或STL类型的容器.此外,我需要对矩阵的复数值进行近似比较.
我的问题:你知道是否(以及如何)教导Google Mock迭代多维度,并将复杂的浮点数与近似相等进行比较?
请注意,我不能将数据指针作为C样式数组处理,因为storage layout可能在C_expect和C_actual之间有所不同.而且,实际上,矩阵大于2×2矩阵.即某种循环肯定是必要的.