工作之餘,學習了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;
}