gpt4 book ai didi

c++ - 在 Eigen3 中添加 Matrix 和 DiagonalMatrix

转载 作者:太空狗 更新时间:2023-10-29 22:57:21 28 4
gpt4 key购买 nike

我想使用 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这是后代的总结:

Eigen MatrixDiagonalMatrixDiagonalWrapper 的“正常”加法不受支持,而乘法或复合 += 添加即可。如果尝试使用 const 对象,则 += 不是一个选项,而是从 asDiagonal() 调用构建显式 Matrix2d - 为什么我没有想过尝试一下吗?! -- 效果很好:

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

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

关于c++ - 在 Eigen3 中添加 Matrix 和 DiagonalMatrix,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44498407/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com