我想用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)
只是从库中丢失了?
2条答案
按热度按时间dkqlctbz1#
感谢@CoryKramer链接到KDE/Eigen论坛上提出和回答的类似问题:https://forum.kde.org/viewtopic.php?f=74&t=136617以下是对后代的总结:
不支持本征
Matrix
和DiagonalMatrix
或DiagonalWrapper
的“普通”加法运算,而乘法或复合+=
加法则可以。如果尝试使用const对象,则+=
不是一个选项,但从asDiagonal()
调用构造显式Matrix2d
--为什么我没有想到尝试?!-- works nice:字符串
我猜这可能会带来性能损失,这就是为什么没有类型构造就不支持它的原因。但它们不太可能比手动循环对角索引的肮脏替代方案更糟糕。
qncylg1j2#
很遗憾,KDE论坛的帖子已经无法使用了。除了@andybuckley分享的内容外,这个解决方案可能更清楚意图:
字符串
这段代码使用向量v创建了一个DiagonalWrapper,然后使用它来构造一个DenseMatrix,它可以根据需要用于其他矩阵的操作。