2017-06-12 65 views
3

我想用Eigen3庫(版本3.3.2)將元素添加到Eigen :: MatrixXd對象的對角線上。在Eigen3中添加矩陣和DiagonalMatrix

無論對於優化和能夠使用常量性,我希望通過增加對角矩陣原來的,這樣

const MatrixXd a(2,2); a << 1, 2, 3, 4; 
const VectorXd v(2); v << 10, 20; 
const MatrixXd b = a + v.asDiagonal(); 

這樣做,但這個不起作用:我得到一個編譯器錯誤沒有operator+。添加兩個MatrixXd確實有效,所以我希望它能夠表現爲對角線專業化。

刪除常量不起作用。使用靜態大小的矩陣沒有區別,所以它不是一個動態大小的事情。並且明確地構造DiagonalMatrix而不是使用由asDiagonal()返回的DiagonalWrapper也給出相同的錯誤。

乘法良好的這些類型:MatrixXd c = a * v.asDiagonal();編譯和運行得很好。我做錯了什麼,或者只是從圖書館丟失了operator+(Matrix,DiagonalMatrix)

+1

https://forum.kde.org/viewtopic.php?f=74&t=136617 – CoryKramer

+0

也有關:http://eigen.tuxfamily.org/bz/show_bug.cgi?id=610 – chtz

回答

1

感謝@CoryKramer鏈接到一個相當的問題被提出和回答的KDE /徵論壇:https://forum.kde.org/viewtopic.php?f=74&t=136617下面是後人總結:

「正常」另外的固有Matrix的,要麼一DiagonalMatrixDiagonalWrapper不是支持的操作,而乘法或複合+=加法是好的。 +=不是一個選項,如果試圖使用const對象,但從asDiagonal()呼叫構建顯式Matrix2d - 爲什麼我沒有想到嘗試?! - 很好地工作:

MatrixXd b = a + Matrix2d(v.asDiagonal()); 

我想有潛在的性能損失,這就是爲什麼不支持沒有類型構造。但它們不太可能比手動循環對角線索引的骯髒選擇更糟。