我想知道是否有一种好方法可以使用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(3, 2),
Complex(2, 3), Complex(1, 1);
C_expect << Complex(-5, 20), Complex(0, 10),
Complex(0, 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, j).real(), 1e-7)
<< "Re(" << i << "," << j << ")";
EXPECT_NEAR(C_expect(i, j).imag(), C_actual(i, j).imag(), 1e-7)
<< "Im(" << i << "," << j << ")";
}
}
}
这有什么问题?好吧,我必须手动遍历矩阵的所有索引,然后分别比较实部和虚部。我更喜欢类似于 Google MockElementsAreArray
匹配器的东西。例如
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 样式数组处理,因为存储布局可能在C_expect
, 和C_actual
. 此外,实际上,这些矩阵不仅仅是 2x2 矩阵。即某种循环绝对是必要的。