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?
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) .
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.
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.
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.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With