Constructing diagonal matrix in eigen
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 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.