linux下Eiegn的用法_2

 

  工作之餘,學習了linux下Eigen的用法。主要是一些基本用法,包括Eigen的聲明,計算,求解方程等。主要運行了高祥SLAM一書的代碼,熟練了一下。


 #include<iostream>

 #include<ctime>

using namespace std;

//Eigen 部分

#include<Eigen/Core>

//稠密矩陣的代數運算(逆 特證值)

#include<Eigen/Dense>


#define MATRIX_SIZE 50


int main(int argc,char *argv[])
{
 //Eigen 以矩陣爲基本數據單元,它是一個模板類,它的前三個參數是:數據類型,行,列

 Eigen:: Matrix<float,2,3> matrix_23;
 
 Eigen:: Vector3d v_3d;     //typede類型

 Eigen:: Matrix3d matrix_33=Eigen::Matrix3d::Zero();  //初始化矩陣爲零

 //如果不確定矩陣的大小,可以用動態大小的矩陣

 Eigen::Matrix<double,Eigen::Dynamic,Eigen::Dynamic> matrix_dynamic;

 //更爲簡單的方法

 Eigen::MatrixXd matrix_x;

 //下面對矩陣進行操作

 matrix_23<<1,2,3,4,5,6;

 //輸出
 
 cout<<matrix_23<<endl;

 //用()訪問額矩陣中的元素

 for(int i = 0; i<1; i++)
    for(int j = 0; j<2; j++)
      cout<<matrix_23(i,j)<<endl;

  v_3d<<3,2,1;

 //矩陣向量相乘
 //不同類型的矩陣相稱是錯誤的

 //Eigen::Matrix<double,2,1> result_wrong_type = matrix_23*v_3d;

 //應該顯示轉換

 Eigen::Matrix<double,2,1> result = matrix_23.cast<double>()*v_3d;

 cout<<result<<endl;
 //矩陣維數出錯

 //Eigen::Matrix<double,2,3> result = matrix_23.cast<double>()*v_3d;

 //一般矩陣的運算

 matrix_33 = Eigen::Matrix3d::Random();

 cout << matrix_33<<endl;

 cout << matrix_33.transpose() << endl; //求矩陣的轉秩

 cout<<matrix_33.sum() << endl;       //求各元素之和

 cout<<matrix_33.trace() << endl;     //跡

 cout<<matrix_33.inverse() << endl;   //求矩陣的逆

 cout<<matrix_33.determinant()<<endl; //行列式值

 //特鉦值
 //是對稱矩陣可以保證對角化

 Eigen::SelfAdjointEigenSolver<Eigen::Matrix3d>eigen_solver(matrix_33.transpose()*matrix_33);

 cout<<"Eigen values = \n"<<eigen_solver.eigenvalues()<<endl;

 cout<<"Eigen vectors = \n"<<eigen_solver.eigenvectors()<<endl;

 //解方程
 //我們求解matrix_NN *x = v_Nd這個方程
 //矩陣由隨機數生成
 //直接求逆自然是最直接的,但運算量較大
 
 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;

 cout<<"time use in normal inverse is" <<1000*(clock()-time_stt)/(double)CLOCKS_PER_SEC<<"ms"<<endl;

 //用矩陣分解來求

 time_stt = clock();

 x = matrix_NN.colPivHouseholderQr().solve(v_Nd);

 cout<<"time use in Qr decomposition is" <<1000*(clock()-time_stt)/(double)CLOCKS_PER_SEC<<"ms"<<endl;



 return 0;
}

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章