Constructing diagonal matrix in eigen

人盡茶涼 提交于 2019-12-10 12:38:20

问题


In eigen, we can create a matrix as

Matrix3f m;
m << 1, 2, 3,
     4, 5, 6,
     7, 8, 9;

How can I create a diagonal matrix like the one below

 3, 0, 0,
 0, 8, 0,
 0, 0, 6;

I don't understand how Eigen handle diagonal matrix? Only the diagonal elements are important here. So does Eigen save all 9 elements from above example or Eigen just save only 3 elements 3,8,6. Also, if eigen save all 9 elements then is it necessary to define the matrix as diagonal or is it the same as defining normal 3*3 matrix?


回答1:


If you want a standalone diagonal matrix, construct a DiagonalMatrix.

DiagonalMatrix<double, 3> m(3, 8, 6);

// Input after construction
m.diagonal() << 3, 8, 6;

A DiagonalMatrix works like a normal matrix but stores only the diagonal.

Vector3d v(1, 2, 3);
m * v;  // 3 16 18

If you want to make a diagonal matrix out of an existing vector, call .asDiagonal(). Note that .diagonal() returns the diagonal as a vector, so .diagonal().asDiagonal() extract the diagonal part of a matrix and regard it as a diagonal matrix.




回答2:


Here's a code and it's output :

Code:

#include <iostream>
#include "Eigen/Dense"

int main()
{
    Eigen::Matrix< double, 3, 1> v ;
    v << 1, 2, 3;
    Eigen::Matrix< double, 3, 3> m = v.array().sqrt().matrix().asDiagonal();

    std::cout << m << "\n";

    return 0;
}

Output :

  1       0       0
  0 1.41421       0
  0       0 1.73205

As you can see, the output created asDiagonal() from a (3*1) vector is a normal (3*3) matrix (that you have to define first), meaning that Eigen holds the 9 elements not just the diagonal ones.



来源:https://stackoverflow.com/questions/37492099/constructing-diagonal-matrix-in-eigen

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!