1、Eigen 库的基本使用
#include<iostream>
#include <ctime>
#include"Eigen/Core"
#include "Eigen/Dense"
using namespace std;
using namespace Eigen;
#define MATRIX_SIZE 50
int main(int argc,char** argv)
{
Matrix<float, 2 , 3> matrix_23;
Vector3d v_3d;
Matrix<float ,3,1> vd_3d;
Matrix3d matrix_33=Matrix3d::Zero();
Matrix<double, Dynamic,Dynamic> matrix_dynamic;
MatrixXd matrix_x;
matrix_23<< 1, 2, 3, 4, 5, 6;
cout<< "matrix_23 = " << endl<< matrix_23 <<endl;
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;
Matrix<double, 2, 1> result = matrix_23.cast<double>()*v_3d;
cout<< "( 强制将matrix_23转为float )matrix_23*v_3d" <<endl<<result<<endl;
Matrix<float, 2, 1> result_2= matrix_23*vd_3d;
cout<< "matrix_23*vd_3d = " <<endl<<result_2 <<endl;
matrix_33 = Matrix3d::Random();
cout<< "matrix_33 = " <<endl<< matrix_33<<endl;
cout<< "matrix_33.transpose() = " <<endl<<matrix_33.transpose() <<endl;
cout<< " matrix_33各元素的和 = " << matrix_33.sum() <<endl;
cout<< " matrix_33的trace = " << matrix_33.trace() <<endl;
cout<< " 10*matrix_33 = " << 10*matrix_33 <<endl;
cout<< " matrix_33的inverse = " << matrix_33.inverse() <<endl;
cout<< " matrix_33的det = " << matrix_33.determinant()<<endl;
SelfAdjointEigenSolver<Matrix3d> eigen_solver(matrix_33.transpose()*matrix_33);
cout<< "eigen values of matrix_33.transpose()*matrix_33 = " << endl <<eigen_solver.eigenvalues()<<endl;
cout<< "eigen vectors of matrix_33.transpose()*matrix_33 = " <<endl<<eigen_solver.eigenvectors()<<endl;
cout<<"**********************************"<<endl;
Matrix<double, MATRIX_SIZE, MATRIX_SIZE> matrix_NN=MatrixXd::Random();
matrix_NN=matrix_NN*matrix_NN.transpose();
Matrix<double, MATRIX_SIZE, 1> v_Nd=MatrixXd::Random();
clock_t time_stt=clock();
Matrix<double, MATRIX_SIZE, 1> x=matrix_NN.inverse()*v_Nd;
cout<<"time of normal inverse is "
<<1000*(clock()-time_stt)/(double) CLOCKS_PER_SEC<<"ms"<<endl;
cout<< "X = " << endl <<x.transpose() <<endl;
cout<<"**********************************"<<endl;
time_stt=clock();
x=matrix_NN.colPivHouseholderQr().solve(v_Nd);
cout<<"time of normal inverse is "
<<1000*(clock()-time_stt)/(double) CLOCKS_PER_SEC<<"ms"<<endl;
cout<< "X = " << endl <<x.transpose() <<endl;
cout<<"**********************************"<<endl;
time_stt=clock();
x=matrix_NN.ldlt().solve(v_Nd);
cout<<"time of normal inverse is "
<<1000*(clock()-time_stt)/(double) CLOCKS_PER_SEC<<"ms"<<endl;
cout<< "X = " << endl <<x.transpose() <<endl;
return 0;
}
运行结果如下:
```cpp
matrix_23 =
1 2 3
4 5 6
1 2 3
4 5 6
( 强制将matrix_23转为float )matrix_23*v_3d
10
28
matrix_23*vd_3d =
32
77
matrix_33 =
0.680375 0.59688 -0.329554
-0.211234 0.823295 0.536459
0.566198 -0.604897 -0.444451
matrix_33.transpose() =
0.680375 -0.211234 0.566198
0.59688 0.823295 -0.604897
-0.329554 0.536459 -0.444451
matrix_33各元素的和 = 1.61307
matrix_33的trace = 1.05922
10*matrix_33 = 6.80375 5.9688 -3.29554
-2.11234 8.23295 5.36459
5.66198 -6.04897 -4.44451
matrix_33的inverse = -0.198521 2.22739 2.8357
1.00605 -0.555135 -1.41603
-1.62213 3.59308 3.28973
matrix_33的det = 0.208598
eigen values of matrix_33.transpose()*matrix_33 =
0.0242899
0.992154
1.80558
eigen vectors of matrix_33.transpose()*matrix_33 =
-0.549013 -0.735943 0.396198
0.253452 -0.598296 -0.760134
-0.796459 0.316906 -0.514998
**********************************
time of normal inverse is 0.203ms
X =
-55.7896 -298.793 130.113 -388.455 -159.312 160.654 -40.0416 -193.561 155.844 181.144 185.125 -62.7786 19.8333 -30.8772 -200.746 55.8385 -206.604 26.3559 -14.6789 122.719 -221.449 26.233 -318.95 -78.6931 50.1446 87.1986 -194.922 132.319 -171.78 -4.19736 11.876 -171.779 48.3047 84.1812 -104.958 -47.2103 -57.4502 -48.9477 -19.4237 28.9419 111.421 92.1237 -288.248 -23.3478 -275.22 -292.062 -92.698 5.96847 -93.6244 109.734
**********************************
time of normal inverse is 0.099ms
X =
-55.7896 -298.793 130.113 -388.455 -159.312 160.654 -40.0416 -193.561 155.844 181.144 185.125 -62.7786 19.8333 -30.8772 -200.746 55.8385 -206.604 26.3559 -14.6789 122.719 -221.449 26.233 -318.95 -78.6931 50.1446 87.1986 -194.922 132.319 -171.78 -4.19736 11.876 -171.779 48.3047 84.1812 -104.958 -47.2103 -57.4502 -48.9477 -19.4237 28.9419 111.421 92.1237 -288.248 -23.3478 -275.22 -292.062 -92.698 5.96847 -93.6244 109.734
**********************************
time of normal inverse is 0.028ms
X =
-55.7896 -298.793 130.113 -388.455 -159.312 160.654 -40.0416 -193.561 155.844 181.144 185.125 -62.7786 19.8333 -30.8772 -200.746 55.8385 -206.604 26.3559 -14.6789 122.719 -221.449 26.233 -318.95 -78.6931 50.1446 87.1986 -194.922 132.319 -171.78 -4.19736 11.876 -171.779 48.3047 84.1812 -104.958 -47.2103 -57.4502 -48.9477 -19.4237 28.9419 111.421 92.1237 -288.248 -23.3478 -275.22 -292.062 -92.698 5.96847 -93.6244 109.734
2、 Eigen 库的几何模型
#include<iostream>
#include <ctime>
#include"Eigen/Core"
#include "Eigen/Geometry"
using namespace std;
using namespace Eigen;
int main(int argc,char** argv)
{
Matrix3d rotatian_matrix=Matrix3d::Identity();
AngleAxisd rotation_vector(M_PI/4,Vector3d(0,0,1));
cout<<" rotatian_matrix = "<<endl<<rotation_vector.matrix()<<endl;
rotatian_matrix=rotation_vector.toRotationMatrix();
Vector3d v(1,0,0);
Vector3d v_rotate=rotation_vector*v;
cout<<"v_rotate = "<<v_rotate.transpose()<<" (using rotation_vector) "<<endl;
v_rotate=rotatian_matrix*v;
cout<<"v_rotate = "<<v_rotate.transpose()<<" (using rotation_matrix) "<<endl;
Vector3d euler_angles= rotatian_matrix.eulerAngles(0.707107,0.707107,0);
cout<<" roll pitch yaw = "<< euler_angles.transpose() <<endl;
Isometry3d T=Isometry3d ::Identity();
T.rotate(rotation_vector);
T.pretranslate(Vector3d(1,3,4));
cout<<"Transform matrix = "<< endl <<T.matrix() <<endl;
Vector3d v_transformed =T*v;
cout<<" v_transformed = "<< v_transformed.transpose() <<endl;
cout<<"*******仿射变换 Affine3d和 射影变换Projective3d********"<<endl;
Affine3d Aff=Affine3d ::Identity();
Aff.rotate(rotation_vector);
Aff.pretranslate(Vector3d(1,3,4));
cout<<"Affine matrix = "<< endl <<Aff.matrix() <<endl;
Projective3d Pro=Projective3d ::Identity();
Pro.rotate(rotation_vector);
Pro.pretranslate(Vector3d(1,3,4));
cout<<"Projective matrix = "<< endl <<Pro.matrix() <<endl;
cout<<"******************四元数****************"<<endl;
Quaterniond q= Quaterniond(rotation_vector);
cout<<"Quaterniond from rotation_vector = "<<endl<<q.coeffs().transpose()<<endl;
q=Quaterniond(rotatian_matrix);
cout<<"Quaterniond from rotation_matrix = "<<endl<<q.coeffs().transpose()<<endl;
v_rotate=q*v;
cout<<"(1,0,0)after rotation = "<< v_rotate.transpose() <<endl;
cout<<"用数学方法表述 = q*quaterniond(0,1,0,0)*q(-1) = "<<(q*Quaterniond(0,1,0,0)*q.inverse()).coeffs().transpose()<<endl;
return 0;
}
运行结果如下:
rotatian_matrix =
0.707107 -0.707107 0
0.707107 0.707107 0
0 0 1
v_rotate = 0.707107 0.707107 0 (using rotation_vector)
v_rotate = 0.707107 0.707107 0 (using rotation_matrix)
roll pitch yaw = 0 0.785398 0
Transform matrix =
0.707107 -0.707107 0 1
0.707107 0.707107 0 3
0 0 1 4
0 0 0 1
v_transformed = 1.70711 3.70711 4
*******仿射变换 Affine3d和 射影变换Projective3d********
Affine matrix =
0.707107 -0.707107 0 1
0.707107 0.707107 0 3
0 0 1 4
0 0 0 1
Projective matrix =
0.707107 -0.707107 0 1
0.707107 0.707107 0 3
0 0 1 4
0 0 0 1
******************四元数****************
Quaterniond from rotation_vector =
0 0 0.382683 0.92388
Quaterniond from rotation_matrix =
0 0 0.382683 0.92388
(1,0,0)after rotation = 0.707107 0.707107 0
用数学方法表述 = q*quaterniond(0,1,0,0)*q(-1) = 0.707107 0.707107 0 0