我已經通讀了很多documentation,但是如果您發現某些我錯過了可以解釋我的問題的信息,我會很高興。對於背景,我正在使用3.2.7 Eigen庫在Visual Studio 2015中的x86 Windows 10上進行編譯。 3.2.7版本是從5月份開始的,雖然從那時起已經有發佈,但我還沒有看到changelog中的任何內容,這表明我的問題已得到解決。特徵庫中的大塊係數方式乘法失敗C++
該問題似乎只出現在特定大小以上的矩陣上。我不知道這是否是我的系統特有的某些副產品或Eigen固有的東西。
以下代碼在調試和發佈模式下都會產生訪問衝突。
int mx1Rows = 255, cols = 254;
{//this has an access violation at the assignment of mx2
Eigen::MatrixXd mx1(mx1Rows, cols);
Eigen::MatrixXd mx2(mx1Rows + 1, cols);
Eigen::Block<Eigen::MatrixXd, -1, -1, false> temp = mx2.topRows(mx1Rows);
mx2 = temp.array() * mx1.array();//error
}
我相信係數態乘法的分配是安全的,因爲其結果應該是aliased。
當mx1Rows減少到值254時,此問題變得很有趣,則不會出現訪問衝突。這是正確的,256乘以254的mx2尺寸會產生問題,但255乘以254的尺寸不會。如果我增加列大小,我也可以得到訪問衝突,所以問題可能與條目總數有關。即使mx1和mx2填充了值,也會出現問題,填充矩陣不必重現問題。
未將topRows()塊分配給temp的類似代碼不會在發佈模式下產生訪問衝突。我相信還有更多的東西,因爲我最初在代碼中發現了這個問題,這個代碼是相當複雜的,它只在一定數量的循環之後出現(矩陣大小在循環之間是一致的)。在我的代碼中有太多的事情,我無法隔離訪問衝突僅在一定數量的循環之後出現的條件。
我很好奇,想知道什麼是
1)我在一些明顯錯誤的方式使用本徵?
2)你能重現這個問題嗎? (你的環境細節是什麼?)
3)這是Eigen庫中的一個bug嗎?
通過將塊分配給臨時矩陣而不是塊可以很容易地解決此問題,即使它效率低下,所以我對此不感興趣。
看起來像一個錯誤,假設負1索引是允許的,他們似乎是。如果初始化矩陣,您將看到即使在mx1Rows和cols值較小的情況下,也會將垃圾放入數組mult中。運行'temp.array()。eval()。array()'可以正常工作。您不會在數據之外進行別名。它在x64中執行但不正確。它只是沒有錯。 – doug