高翔視覚slam十四講書籍ノート(第三講03-Eigen例)

20786 ワード

EigenはC++オープンソース線形代数ライブラリです.行列に関する高速な線形代数演算を提供し,解方程式などの機能も含む.g 2 o、Sophusなど、多くの上位レベルのソフトウェアライブラリでもEigenを使用してマトリクス演算が行われています.この理論の部分に応じて、Eigenのプログラミングを学びましょう.
あなたのPCにはまだEigenがインストールされていないかもしれません.次のコマンドを入力してインストールします.
sudo apt-get install libeigen3-dev

次の各行のcout印刷の出力は、matrix_に注釈で表記されています.33 = Eigen::Matrix3d::Random(); 生成された乱数に問題があり、ずっと同じマトリクスです.
#include 
using namespace std;
#include 
// Eigen   
#include 
//          ( ,    )
#include 

#define MATRIX_SIZE 50

/****************************
*        Eigen        
****************************/

int main( int argc, char** argv )
{
     
    // Eigen           Eigen::Matrix,       。        :    , , 
    //     2*3 float  
    Eigen::Matrix<float, 2, 3> matrix_23;

    //   ,Eigen    typedef          ,      Eigen::Matrix
    //    Vector3d      Eigen::Matrix
    Eigen::Vector3d v_3d;
	//      
    Eigen::Matrix<float,3,1> vd_3d;

    // Matrix3d      Eigen::Matrix
    Eigen::Matrix3d matrix_33 = Eigen::Matrix3d::Zero(); //     
    //          ,           
    Eigen::Matrix< double, Eigen::Dynamic, Eigen::Dynamic > matrix_dynamic;
    //     
    Eigen::MatrixXd matrix_x;
    //         ,       

    //     Eigen    
    //     (   )
    matrix_23 << 1, 2, 3, 4, 5, 6;
    //   
    // 1 2 3
    // 4 5 6
    cout << matrix_23 << endl;

    //  (  )        
    // 1    2   3
    // 4    5   6
    for (int i=0; i<2; i++) {
     
        for (int j=0; j<3; j++)
            cout<<matrix_23(i,j)<<"\t";
        cout<<endl;
    }

    //        (          )
    v_3d << 3, 2, 1;
    vd_3d << 4,5,6;
    //    Eigen               ,      
    // Eigen::Matrix result_wrong_type = matrix_23 * v_3d;
    //       
    Eigen::Matrix<double, 2, 1> result = matrix_23.cast<double>() * v_3d;
    // 10
    // 28
    cout << result << endl;

    Eigen::Matrix<float, 2, 1> result2 = matrix_23 * vd_3d;
    // 32
    // 77
    cout << result2 << endl;

    //             
    //          ,  Eigen     
    //                      ,    , mxp   · pxn   = mxn  
    // Eigen::Matrix result_wrong_dimension = matrix_23.cast() * v_3d;

    //       
    //          ,   +-*/  。
    //           ,      
    matrix_33 = Eigen::Matrix3d::Random();      //       (         )
    // 1 2 3
    // 4 5 6
    // 7 8 9
    cout << matrix_33 << endl << endl;

    // 1 4 7
    // 2 5 8
    // 3 6 9
    cout << matrix_33.transpose() << endl;      //   
    // 45
    cout << matrix_33.sum() << endl;            //     
    //   nxn  A     (            )               ,      tr(A)
    // 15
    cout << matrix_33.trace() << endl;          //  
    // 10 20 30
    // 40 50 60
    // 70 80 90 
    cout << 10*matrix_33 << endl;               //   
    //  A   n   ,      n   B,  : AB=BA=E ,    A  ,    B A    
    // 1 0 -1       ,     
    // 0 1 2
    // 0 0 0 
    cout << matrix_33.inverse() << endl;        //  
    //   n×n   A      det(A)  |A|,  2×2         : 
    // det(a b) = ad - bc
    //    (c d)
    cout << matrix_33.determinant() << endl;    //    

    //    
    //               ,         ,         
    Eigen::SelfAdjointEigenSolver<Eigen::Matrix3d> eigen_solver ( matrix_33.transpose()*matrix_33 );
    //      A     
    // f(λ) = |λ·E - A|    λ      
    cout << "Eigen values = 
"
<< eigen_solver.eigenvalues() << endl; // A // λ (λ·E - A)χ = 0, cout << "Eigen vectors =
"
<< eigen_solver.eigenvectors() << endl; // // matrix_NN * x = v_Nd // N , // , Eigen::Matrix< double, MATRIX_SIZE, MATRIX_SIZE > matrix_NN; matrix_NN = Eigen::MatrixXd::Random( MATRIX_SIZE, MATRIX_SIZE ); Eigen::Matrix< double, MATRIX_SIZE, 1> v_Nd; v_Nd = Eigen::MatrixXd::Random( MATRIX_SIZE,1 ); clock_t time_stt = clock(); // // Eigen::Matrix<double,MATRIX_SIZE,1> x = matrix_NN.inverse()*v_Nd; // 3.013ms cout <<"time use in normal inverse is " << 1000* (clock() - time_stt)/(double)CLOCKS_PER_SEC << "ms"<< endl; // , QR , time_stt = clock(); x = matrix_NN.colPivHouseholderQr().solve(v_Nd); // 0.06ms cout <<"time use in Qr decomposition is " <<1000* (clock() - time_stt)/(double)CLOCKS_PER_SEC <<"ms" << endl; return 0; }