c++ 特征3中的加法矩阵与对角矩阵

cnh2zyt3  于 11个月前  发布在  其他
关注(0)|答案(2)|浏览(117)

我想用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)只是从库中丢失了?

dkqlctbz

dkqlctbz1#

感谢@CoryKramer链接到KDE/Eigen论坛上提出和回答的类似问题:https://forum.kde.org/viewtopic.php?f=74&t=136617以下是对后代的总结:
不支持本征MatrixDiagonalMatrixDiagonalWrapper的“普通”加法运算,而乘法或复合+=加法则可以。如果尝试使用const对象,则+=不是一个选项,但从asDiagonal()调用构造显式Matrix2d--为什么我没有想到尝试?!-- works nice:

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

字符串
我猜这可能会带来性能损失,这就是为什么没有类型构造就不支持它的原因。但它们不太可能比手动循环对角索引的肮脏替代方案更糟糕。

qncylg1j

qncylg1j2#

很遗憾,KDE论坛的帖子已经无法使用了。除了@andybuckley分享的内容外,这个解决方案可能更清楚意图:

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

字符串
这段代码使用向量v创建了一个DiagonalWrapper,然后使用它来构造一个DenseMatrix,它可以根据需要用于其他矩阵的操作。

相关问题