gpt4 book ai didi

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

转载 作者:塔克拉玛干 更新时间:2023-11-02 23:05:31 31 4
gpt4 key购买 nike

我想知道有没有好的方法可以测试两个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/

31 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com