我想使用 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();
但这不起作用:我收到一个编译器错误,说没有operator+
。添加两个MatrixXd
确实有效,因此我希望它适用于对角线专业化。
消除恒定性无济于事。使用静态大小的矩阵没有区别,因此它不是一个动态大小调整的事情。显式构造DiagonalMatrix
而不是使用 asDiagonal()
返回的DiagonalWrapper
也会给出相同的错误。
对于这些类型,乘法的格式很好:MatrixXd c = a * v.asDiagonal();
编译和运行得很好。是我做错了什么,还是operator+(Matrix,DiagonalMatrix)
只是从图书馆里消失了?
感謝@CoryKramer連結到 KDE/Eigen 論壇上提出和回答的等效問題: https://forum.kde.org/viewtopic.php?f=74&t=136617 以下是给后人的总结:
特征Matrix
和DiagonalMatrix
或DiagonalWrapper
的"正常"添加不是受支持的操作,而乘法或复合+=
加法是可以的。 如果尝试使用 const 对象,+=
不是一个选项,而是从 asDiagonal()
调用构造显式Matrix2d
- 为什么我没有想到尝试呢?!-- 效果很好:
MatrixXd b = a + Matrix2d(v.asDiagonal());
我想有潜在的性能损失,这就是为什么在没有类型构造的情况下不支持它的原因。但它们不太可能比手动循环对角线索引的肮脏替代方案更糟糕。