c++ - 比较 Google Test 或 Google Mock 中的特征矩阵

标签 c++ unit-testing eigen googletest googlemock

我想知道有没有好的方法可以测试两个Eigen使用 Google Test近似相等矩阵, 或 Google Mock .

将以下测试用例作为简化示例:我将两个复值矩阵AB 相乘,并期望某个结果C_expect。我使用 Eigen 计算数值结果 C_actual = A * B。现在,我想比较 C_expectC_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 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 迭代多个维度,并将复杂的 float 与近似相等进行比较?

请注意,我不能只将数据指针作为 C 风格数组来处理,因为 storage layout C_expectC_actual 可能不同。此外,实际上,矩阵不仅仅是 2x2 矩阵。 IE。某种循环绝对是必要的。

最佳答案

为什么不使用特征矩阵类型的 isApproxisMuchSmallerThan 成员函数?

上述函数的文档可用here

所以对于大多数情况,ASSERT_TRUE(C_actual.isApprox(C_expect)); 就是您所需要的。您还可以提供精度参数作为 isApprox 的第二个参数。 .

关于c++ - 比较 Google Test 或 Google Mock 中的特征矩阵,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25094989/

相关文章:

iphone - 测试 View 助手

java - 验证方法调用而不在 Spy 上执行其实际实现

c++ - 为什么不能在 switch 语句中声明变量?

c++ - auto* 的类型推导规则是什么?

c++ - 警告从 lambda 返回捕获的引用

unit-testing - 构建 rspec 模块的推荐方法?

c++ - Eigen - 将 const 数组映射到动态 vector

c++ - 使用 std::vector 和 boost::thread 进行内存管理

c++ - 在 Netbeans 中使用 Eigen 库

c++ - 错误 : no match for 'operator<' (operand types are '<unresolved overloaded function type>' and 'Color' )