c – 比较Google Test或Google Mock中的Eigen矩阵

前端之家收集整理的这篇文章主要介绍了c – 比较Google Test或Google Mock中的Eigen矩阵前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
我想知道是否有一种很好的方法可以使用 Google TestGoogle 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矩阵.即某种循环肯定是必要的.

解决方法

为什么不使用Eigen Matrix类型的isApprox或isMuchSmallerThan成员函数

上述功能的文档可用于here

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

猜你在找的C&C++相关文章