我有一个整数向量,我想用vectos的元素构造一个对角矩阵作为矩阵的对角线条目。例如:如果向量是1 2 3
,则对角矩阵将是:
1 0 0
0 2 0
0 0 3
这种天真的方式就是迭代它并逐个设置元素。在eigen
中没有其他直接的方法可以做到这一点。在构建对角线之后,我想计算逆(这只是对角线条目的反转),但似乎没有办法在库本身中直接执行此操作(直接,也可以优化方式)。
我在eigen
库中查找了diagonal matrices的文档,但似乎没有办法。如果我在阅读文档时遗漏了一些明显的东西,请指出。
任何帮助表示感谢。
答案 0 :(得分:10)
根据this part of the documentation,你有很多选择,最简单的选择是
auto mat = vec.asDiagonal();
答案 1 :(得分:1)
除非你真的知道自己在做什么,否则你应该使用与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 )
答案 2 :(得分:0)
您也可以采用另一种方法,也可以设置超级/次对角线。
MatrixXd A = ...;
A.diagonal(0) = values_vector; //for 'main' diagonal
A.diagonal(1) = other_values; //for 1st super-diagonal
请参见Eigen Matrix Diagonal() reference(也有示例)