2016-06-10 61 views
0

我正在为尚未实现的函数编写测试。在下面的代码中,即使输出和结果向量具有相同的值,QCOMPARE也会返回False。有人能解释为什么吗?为什么QCOMPARE在这种情况下返回True?

void EigenValuesTest::EigenValuesTestx2_data() 
{ 
QTest::addColumn<Eigen::MatrixXd>("data"); 

Eigen::MatrixXd a(2,2); 
a<<12,3,4,5; 

QTest::newRow("0") << a ; 
} 

void EigenValuesTest::EigenValuesTestx2() 
{ 
QFETCH(Eigen::MatrixXd, data); 

Eigen::EigenSolver<Eigen::MatrixXd> es(data,false); 

Eigen::Vector2cd result; 
result << std::complex<double>(13.4244,0),std::complex<double>(3.57557,0); 

Eigen::Vector2cd output; 
output = es.eigenvalues(); 

QCOMPARE(result,output); 

} 
+0

Eigen :: Vector2cd :: operator =='如何实现? –

+0

@JeffreyvandeGlind我一直没有找到关于==的任何文档。 Eigen教程似乎只提到算术运算符。但是,如果我声明两个相同类型的向量并使用==比较它们,它将返回True。 –

回答

0

我想从文档

引用在比较浮点型和双的情况下,qFuzzyCompare()用于比较。这意味着与0比较可能会失败。对此的一个解决方案是与1进行比较,并将生成的输出加1。

到目前为止,这么好。自动完成,但现在

请注意,比较其中p1或p2为0.0的值将不起作用。解决方法是比较大于或等于1.0的值。

可能会导致问题,因为您的比较值中有零。

此外,我不能肯定地说,如果Q_COMPARE适用于提供的类型。任何输出都可能有帮助。

如果比较失败,QCOMPARE会尝试输出值的内容,所以从测试日志中可以看到比较失败的原因。

+0

我不认为我可以加1到输出,因为eigenvalues()返回一个常量值 –

2

您需要使用

QCOMPARE(result.isApprox(output), true); 

Eigen documentation

bool operator== (const MatrixBase<OtherDerived> & other) const 

返回true的每个系数*本等都是正是 相等。警告当使用浮点标量值你可能 而应使用模糊比较如isApprox()请参见 isApprox(),运营商=

编辑:
你征向量不正确。零应该是1,即(13.4244, 1.0)(3.57557, 1.0)。此外,它们可能会以与参考矢量result中指定的顺序不同的顺序出现。你需要考虑到这一点,以进行更坚实的测试。

+0

已经尝试过,它不起作用。 –

+0

回应你的编辑:我正在计算(复杂)特征值而不是特征向量。其次,当我打印结果和输出时,我得到了同样的结果,所以我不认为订单是一个问题。 –

相关问题