高翔視覚slam十四講書籍ノート(第三講03-Eigen例)
20786 ワード
EigenはC++オープンソース線形代数ライブラリです.行列に関する高速な線形代数演算を提供し,解方程式などの機能も含む.g 2 o、Sophusなど、多くの上位レベルのソフトウェアライブラリでもEigenを使用してマトリクス演算が行われています.この理論の部分に応じて、Eigenのプログラミングを学びましょう.
あなたのPCにはまだEigenがインストールされていないかもしれません.次のコマンドを入力してインストールします.
次の各行のcout印刷の出力は、matrix_に注釈で表記されています.33 = Eigen::Matrix3d::Random(); 生成された乱数に問題があり、ずっと同じマトリクスです.
あなたの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;
}