从整数向量构造对角矩阵:函数本征

Constructing a diagonal matrix from vector of integers: function eigen

本文关键字:函数 向量 整数      更新时间:2023-10-16

我有一个整数向量,我想用vectos的元素作为矩阵的对角项来构造一个对角矩阵。例如:若矢量为1 2 3,则对角矩阵为:

1 0 0
0 2 0
0 0 3

做这件事的天真方法就是对它进行迭代并逐个设置元素。在eigen中,是否没有其他直接方法可以做到这一点。同样,在构造对角线之后,我想计算倒数(这只是颠倒对角线条目),但在库本身中似乎也没有这样做的方法(直接地,这也会被优化)。

我在eigen库中查找了对角矩阵的文档,但似乎没有办法。如果我在阅读文档时遗漏了一些明显的内容,请指出。

感谢您的帮助。

根据文档的这一部分,您有很多选项,最简单的是

auto mat = vec.asDiagonal();

除非你真的知道你在做什么,否则你应该使用Eigen的正确类型

//Create a 4x4 diagonal matrix from the vector [ 5 6 7 8 ]
Eigen::Vector4d vec;
vec << 5, 6, 7, 8;
Eigen::DiagonalMatrix<double, 4> mat = vec.asDiagonal();

使用auto是一个非常棘手的问题,通常你不知道编译器使用什么作为类型,再加上Eigen,这是发现棘手错误的常见来源之一(请参阅https://eigen.tuxfamily.org/dox/TopicPitfalls.html)

您也可以用另一种方法来实现,这允许您设置超级/子对角

MatrixXd A = ...;
A.diagonal(0) = values_vector; //for 'main' diagonal
A.diagonal(1) = other_values; //for 1st super-diagonal

参见特征矩阵对角线()参考(还有一个例子)