Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Constructing diagonal matrix in eigen

Tags:

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?

like image 813
asdfkjasdfjk Avatar asked May 27 '16 20:05

asdfkjasdfjk


People also ask

How do you make a diagonal matrix?

Use diag to create a matrix with the elements of v on the main diagonal. Create a matrix with the elements of v on the first super diagonal ( k=1 ). The result is a 6-by-6 matrix. When you specify a vector of length n as an input, diag returns a square matrix of size n+abs(k) .

Is the diagonal matrix just the eigenvalues?

Yes. Assuming that your matrix is in fact diagonalizable (which will happen if all of the eigenvalues are distinct, but can also sometimes happen when you have repeated eigenvalues), then your matrix will be similar to ANY diagonal matrix that has the eigenvalues (with proper multiplicities) along the diagonal.


2 Answers

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.

like image 121
jdh8 Avatar answered Sep 17 '22 18:09

jdh8


Here's a code and its 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 (31) vector is a normal (33) matrix (that you have to define first), meaning that Eigen holds the 9 elements not just the diagonal ones.

like image 42
Vtik Avatar answered Sep 19 '22 18:09

Vtik