当前位置:   article > 正文

视觉SLAM学习笔记3——eigen库的基础编程_selfadjointeigensolver

selfadjointeigensolver

 

一、头文件

一般情况下,只需要:

  1. #include <Eigen/Core>
  2. #include <Eigen/Dense>

二、矩阵与向量的定义

Eigen 中所有向量和矩阵都是Eigen::Matrix,它是一个模板类。

它的前三个参数为:数据类型,行,列。

  1. // 声明一个2*3的float矩阵
  2. Eigen::Matrix<float, 2, 3> matrix_23;
  3. //声明一个5*1的double向量
  4. Eigen::Matrix<double, 5, 1> matrix_51;

后面的名称为变量名,按自己习惯定义即可。

同时,Eigen 通过 typedef 提供了许多内置类型,不过底层仍是Eigen::Matrix,比如以下两种d定义向量的方式是一样的:

  1. Eigen::Matrix<double, 3, 1> v_3d; //即三维double向量
  2. Eigen::Vector3d v_3d;

 以下两种定义3*3方阵的方式也是一定的:

  1. Eigen::Matrix<double, 3, 3> matrix_33 ;
  2. Eigen::Matrix3d matrix_33 ;

 初始化为0:

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

 若不确定矩阵大小,可以使用动态大小的矩阵:

  1. Eigen::Matrix< double, Eigen::Dynamic, Eigen::Dynamic > matrix_dynamic;
  2. // 更简单的
  3. Eigen::MatrixXd matrix_x;

三、矩阵的输入与输出 

例如定义2*3矩阵:

 Eigen::Matrix<float, 2, 3> matrix_23;

矩阵初始化(输入):

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

矩阵显示(输出):

 cout << matrix_23 << endl;
  1. 1 2 3
  2. 4 5 6

与matlab类似,可以用括号访问矩阵中的元素:

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

1    2    3    
4    5    6    

也可以基于整行或整列操作:

  1. Eigen::MatrixXf m(3,3);
  2. m << 1,2,3,
  3. 4,5,6,
  4. 7,8,9;
  5. cout << "Here is the matrix m:" << endl << m << endl;
  6. cout << "2nd Row: " << m.row(1) << endl;
  7. m.col(2) += 3 * m.col(0);
  8. cout << "After adding 3 times the first column into the third column, the matrix m is:\n";
  9. cout << m << endl;
  1. Here is the matrix m:
  2. 1 2 3
  3. 4 5 6
  4. 7 8 9
  5. 2nd Row: 4 5 6
  6. After adding 3 times the first column into the third column, the matrix m is:
  7. 1 2 6
  8. 4 5 18
  9. 7 8 30

四、矩阵的加减乘除

需要注意此类操作数据类型应该一致,矩阵维度也要满足运算要求,以乘法操作为例:

  1. Eigen::Vector3d v_3d;
  2. Eigen::Matrix<float,3,1> vd_3d;
  3. v_3d << 3, 2, 1;
  4. vd_3d << 4,5,6;
  5. Eigen::Matrix<double, 2, 1> result = matrix_23.cast<double>() * v_3d; //数据类型转换
  6. cout << result << endl;
  7. Eigen::Matrix<float, 2, 1> result2 = matrix_23 * vd_3d;
  8. cout << result2 << endl;
  1. 10
  2. 28
  3. 32
  4. 77

其它四则运算类似,改用+-*/即可。

五、随机数、数乘、转置、行列式、逆  等

  1. matrix_33 = Eigen::Matrix3d::Random(); // 随机数矩阵
  2. cout << matrix_33 << endl << endl;
  3. cout << matrix_33.transpose() << endl; // 转置
  4. cout << matrix_33.sum() << endl; // 各元素和
  5. cout << matrix_33.trace() << endl; // 迹
  6. cout << 10*matrix_33 << endl; // 数乘
  7. cout << matrix_33.inverse() << endl; // 逆
  8. cout << matrix_33.determinant() << endl; // 行列式

输出为: 

  1. 0.680375 0.59688 -0.329554
  2. -0.211234 0.823295 0.536459
  3. 0.566198 -0.604897 -0.444451
  4. 0.680375 -0.211234 0.566198
  5. 0.59688 0.823295 -0.604897
  6. -0.329554 0.536459 -0.444451
  7. 1.61307
  8. 1.05922
  9. 6.80375 5.9688 -3.29554
  10. -2.11234 8.23295 5.36459
  11. 5.66198 -6.04897 -4.44451
  12. -0.198521 2.22739 2.8357
  13. 1.00605 -0.555135 -1.41603
  14. -1.62213 3.59308 3.28973
  15. 0.208598

六、特征值与特征向量

  1. // 实对称矩阵可以保证对角化成功
  2. Eigen::SelfAdjointEigenSolver<Eigen::Matrix3d> eigen_solver ( matrix_33.transpose()*matrix_33 );
  3. cout << "Eigen values = \n" << eigen_solver.eigenvalues() << endl;
  4. cout << "Eigen vectors = \n" << eigen_solver.eigenvectors() << endl;

输出:

  1. Eigen values =
  2. 0.0242899
  3. 0.992154
  4. 1.80558
  5. Eigen vectors =
  6. -0.549013 -0.735943 0.396198
  7. 0.253452 -0.598296 -0.760134
  8. -0.796459 0.316906 -0.514998

七、解方程

求解 matrix_NN * x = v_Nd 这个方程

定义

#define MATRIX_SIZE 5
  1. Eigen::Matrix< double, MATRIX_SIZE, MATRIX_SIZE > matrix_NN;
  2. matrix_NN = Eigen::MatrixXd::Random( MATRIX_SIZE, MATRIX_SIZE );
  3. Eigen::Matrix< double, MATRIX_SIZE, 1> v_Nd;
  4. v_Nd = Eigen::MatrixXd::Random( MATRIX_SIZE,1 );

直接求逆求解直接但运算量大:

  1. Eigen::Matrix<double,MATRIX_SIZE,1> x = matrix_NN.inverse()*v_Nd;
  2. cout << "x=" << x <<endl;
  1. x=-0.745267
  2. -1.09144
  3. -0.737525
  4. -1.21405
  5. -1.18348

通常用矩阵分解来求,例如QR分解,速度会快很多:

  1. x = matrix_NN.colPivHouseholderQr().solve(v_Nd);
  2. cout << "x=" << x <<endl;
  1. x=-0.745267
  2. -1.09144
  3. -0.737525
  4. -1.21405
  5. -1.18348

运算结果当然是一致的。

八、矩阵的角操作

  1. Eigen::Matrix4f m_44;
  2. m_44 << 1, 2, 3, 4,
  3. 5, 6, 7, 8,
  4. 9, 10,11,12,
  5. 13,14,15,16;
  6. cout << "m_44.leftCols(2) =" << endl << m_44.leftCols(2) << endl << endl;
  7. cout << "m_44.bottomRows<2>() =" << endl << m_44.bottomRows<2>() << endl << endl;
  8. m_44.topLeftCorner(1,3) = m_44.bottomRightCorner(3,1).transpose();
  9. cout << "After assignment, m_44 = " << endl << m_44 << endl;

 输出为:

  1. m_44.leftCols(2) =
  2. 1 2
  3. 5 6
  4. 9 10
  5. 13 14
  6. m_44.bottomRows<2>() =
  7. 9 10 11 12
  8. 13 14 15 16
  9. After assignment, m_44 =
  10. 8 12 16 4
  11. 5 6 7 8
  12. 9 10 11 12
  13. 13 14 15 16

九、均值、求和、最值、迹  等

  1. Eigen::Matrix2d mat;
  2. mat << 1, 2,3, 4;
  3. cout << "Here is mat.sum(): " << mat.sum() << endl;
  4. cout << "Here is mat.prod(): " << mat.prod() << endl;
  5. cout << "Here is mat.mean(): " << mat.mean() << endl;
  6. cout << "Here is mat.minCoeff(): " << mat.minCoeff() << endl;
  7. cout << "Here is mat.maxCoeff(): " << mat.maxCoeff() << endl;
  8. cout << "Here is mat.trace(): " << mat.trace() << endl;

输出为:

  1. Here is mat.sum(): 10
  2. Here is mat.prod(): 24
  3. Here is mat.mean(): 2.5
  4. Here is mat.minCoeff(): 1
  5. Here is mat.maxCoeff(): 4
  6. Here is mat.trace(): 5

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/不正经/article/detail/78198
推荐阅读
相关标签
  

闽ICP备14008679号