在 Eigen3 中添加矩阵和对角矩阵

and*_*ley 5 c++ matrix eigen eigen3

我想使用 Eigen3 库(版本 3.3.2)将元素添加到 Eigen::MatrixXd 对象的对角线上。

为了优化和能够使用常量,我想通过向原始矩阵添加对角矩阵来做到这一点,就像这样

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

但这不起作用:我收到一个关于没有operator+. 添加两个MatrixXd确实有效,所以我希望它对对角线专业化表现得很好。

删除常量无济于事。使用静态大小的矩阵没有区别,所以它不是动态大小的事情。并且显式构造 aDiagonalMatrix而不是使用DiagonalWrapper返回的 byasDiagonal()也会给出相同的错误。

乘法对于这些类型良构的:MatrixXd c = a * v.asDiagonal();编译和运行都很好。我做错了什么,还是operator+(Matrix,DiagonalMatrix)只是从图书馆里失踪了?

and*_*ley 2

感谢 @CoryKramer 链接到 KDE/Eigen 论坛上提出和回答的等效问题:https://forum.kde.org/viewtopic.php? f=74&t=136617 以下是供后代使用的摘要:

特征值的“正常”加法Matrix和 a 或DiagonalMatrix不是DiagonalWrapper受支持的运算,而乘法或复合+=加法则可以。+=如果尝试使用 const 对象,但从调用Matrix2d中构造显式对象,则不是一个选项asDiagonal()- 为什么我没有想到尝试这样做?-- 效果很好:

MatrixXd b = a + Matrix2d(v.asDiagonal());
Run Code Online (Sandbox Code Playgroud)

我猜想这会带来潜在的性能损失,这就是为什么在没有类型构造的情况下不支持这一点。但它们不太可能比手动循环对角线索引的肮脏替代方案更糟糕。