2016-06-10 102 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

迴應你的編輯:我正在計算(複雜)特徵值而不是特徵向量。其次,當我打印結果和輸出時,我得到了同樣的結果,所以我不認爲訂單是一個問題。 –

相關問題