在特征3中添加矩阵和对角矩阵



我想使用 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 以下是给后人的总结:

特征MatrixDiagonalMatrixDiagonalWrapper的"正常"添加不是受支持的操作,而乘法或复合+=加法是可以的。 如果尝试使用 const 对象,+=不是一个选项,而是从 asDiagonal() 调用构造显式Matrix2d - 为什么我没有想到尝试呢?!-- 效果很好:

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

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

相关内容

  • 没有找到相关文章

最新更新