2016-11-28 22 views
1

我在Windows機器上使用Eigen lib版本3.2.7。奇怪的結果當使用Eigen :: Array對象的自動說明符

我得到了奇怪的結果,當我跑下面的代碼:

auto a = Eigen::Array4i{ 95,95,95,95 }-Eigen::Array4i{ 0,1,0,1 }; 
Eigen::Array4i b = Eigen::Array4i{ 95,95,95,95 }-Eigen::Array4i{ 0,1,0,1 }; 
std::cout << a; 
std::cout << b; 

,而不是打印相同載體兩次,我得到了以下結果:

[0; 0; 0; 0][95; 94; 95; 94] 

有趣的是,出現在發佈此問題模式。調試模式的輸出是正確的。

有沒有人對此有過解釋?

謝謝!

+1

這可能是由於特徵表達模板延遲了評估。即「a」可能只是一個未評估的表達式,而不是一些具體的結果。你可以檢查「a」的類型嗎? https://eigen.tuxfamily.org/dox/group__TutorialMatrixArithmetic.html – sgarizvi

回答

1
auto a = Eigen::Array4i{ 95,95,95,95 }-Eigen::Array4i{ 0,1,0,1 }; 

a是表達式類型。臨時的Eigen::Array4i{ 95,95,95,95 }-Eigen::Array4i{ 0,1,0,1 }在發佈模式下在該行後面「死亡」(已發佈),但在Debug中保留一段時間。您可以使用.eval()強制評估表達式:

auto c = (Eigen::Array4i{ 95,95,95,95 }-Eigen::Array4i{ 0,1,0,1 }).eval(); 
+1

更確切地說,它不是表達式'-',而是它的兩個嵌套臨時數組'''Array4i',它們被引用嵌套在表示'-'操作的表達式。 – ggael