固有では、次のように行列を作成できます。
Matrix3f m;
m << 1, 2, 3,
4, 5, 6,
7, 8, 9;
以下のような対角行列を作成するにはどうすればよいですか
3, 0, 0,
0, 8, 0,
0, 0, 6;
Eigenが対角行列を処理する方法がわかりませんか?ここでは、対角要素のみが重要です。したがって、Eigenは上記の例の9つの要素をすべて保存しますか、それとも3つだけの要素を保存します3,8,6。また、固有値が9つの要素すべてを保存する場合、行列を対角線として定義する必要がありますか、それとも通常の3 * 3行列を定義するのと同じですか?
スタンドアロンの対角行列が必要な場合は、 DiagonalMatrix を作成します。
_DiagonalMatrix<double, 3> m(3, 8, 6);
// Input after construction
m.diagonal() << 3, 8, 6;
_
DiagonalMatrixは通常のマトリックスのように機能しますが、対角線のみを保存します。
_Vector3d v(1, 2, 3);
m * v; // 3 16 18
_
既存のベクトルから対角行列を作成する場合は、. asDiagonal ()を呼び出します。 .diagonal()
は対角をベクトルとして返すため、.diagonal().asDiagonal()
は行列の対角部分を抽出し、対角行列と見なします。
ここにコードがあり、それが出力されます:
コード:
#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;
}
出力:
1 0 0 0 1.41421 0 0 0 1.73205
ご覧のとおり、(3 * 1)ベクトルから作成された出力 asDiagonal() は通常の(3 * 3)行列です(最初に定義する必要があります)。これは、Eigenが9を保持することを意味します対角要素だけではありません。