C++でEigenライブラリを使って固有値分解を行う方法
EigenSolverクラスの使用による本質分解の例を次に示します。
#include <iostream>
#include <Eigen/Eigenvalues>
int main() {
Eigen::MatrixXd A(3, 3);
A << 1, 2, 3,
4, 5, 6,
7, 8, 9;
Eigen::EigenSolver<Eigen::MatrixXd> eigensolver(A);
if (eigensolver.info() != Eigen::Success) {
std::cout << "Eigen decomposition failed." << std::endl;
return 1;
}
Eigen::VectorXcd eigenvalues = eigensolver.eigenvalues();
Eigen::MatrixXcd eigenvectors = eigensolver.eigenvectors();
std::cout << "Eigenvalues:" << std::endl << eigenvalues << std::endl;
std::cout << "Eigenvectors:" << std::endl << eigenvectors << std::endl;
return 0;
}
このコード例では、まず3行3列の行列Aを定義し、この行列を使用してEigenSolverオブジェクトを作成します。次に、EigenSolverのinfo()メソッドの戻り値を調べ、Eigen::Successと等しくない場合は固有値分解が失敗したことを示します。そうでない場合は、eigenvalues()メソッドとeigenvectors()メソッドを使用して行列Aの固有値と固有ベクトルを取得できます。
最後に、固有値と固有ベクトルをコンソールに出力します。この例の出力は次のようになります。
Eigenvalues:
(16,0)
(-1,0)
(0,0)
Eigenvectors:
(-0.231971,-0.78583) (-0.525322,0.0867513) (0.377429,0.508176)
(-0.525322,-0.0867513) (0.789849,-0.0867513) (-0.252945,-0.508176)
(0.377429,0.508176) (-0.231971,-0.78583) (0.881894,0)
本例で行列A の固有値は16、-1、および0 です。固有ベクトルは、(-0.231971,-0.78583)、(-0.525322,-0.0867513)、および(0.377429,0.508176) です。