Eigenで連立方程式を解くには

Tutorial 3/3 - Advanced linear algebra

triangular solver

もし行列がtriangular (upper or lower) で invertible(加法的逆元または乗法的逆元をもつ) つまり、対角成分の係数がすべてゼロでない。
ならば、連立方程式はMatrixBase::solveTriangular()で直接解ける。 MatrixBase::solveTriangularInPlace()でも解けたらなおよい。

コード

#include <iostream>
#include <Eigen/core>
using namespace Eigen;
using namespace std;
void main(){
    Matrix3d m = Matrix3d::Zero();
    m.part<Eigen::UpperTriangular>().setOnes();
    cout << "Here is the matrix m:" << endl << m << endl;
    Matrix3d n = Matrix3d::Ones();
    n.part<Eigen::LowerTriangular>() *= 2;
    cout << "Here is the matrix n:" << endl << n << endl;
    cout << "And now here is m.inverse()*n, taking advantage of the fact that"
            " m is upper-triangular:" << endl
         << m.marked<Eigen::UpperTriangular>().solveTriangular(n);
}

出力結果

Here is the matrix m:
1 1 1
0 1 1
0 0 1
Here is the matrix n:
2 1 1
2 2 1
2 2 2
And now here is m.inverse()*n, taking advantage of the fact that m is upper-triangular:
0 -1 0
0 0 -1
2 2 2

直接.inverse()で解く。

もし行列が小さくで、逆行列可能ならば、直接.inverseするといい。

#include <iostream>
#include <Eigen/Array> //Random()のために必要、。
#include <Eigen/LU>
using namespace Eigen;
using namespace std;
void main(){
    Matrix3d m = Matrix3d::Random();
cout << "Here is the matrix m:" << endl << m << endl;
cout << "Its inverse is:" << endl << m.inverse() << endl;
}
サポートサイト Wikidot.com