Eigen是一个开源矩阵运算库,使用模板编程。

  1. eigen 中四元数、欧拉角、旋转矩阵、旋转向量
  2. Eigen库使用指南

其他

  1. float toRadian(float degress){ //角度(°)转弧度
  2. return degress / 180.0*acos(-1);
  3. }

常用头文件

  1. #include <Eigen/Dense> //包含了下面的Core/Geometry/LU/Cholesky/SVD/QR/Eigenvalues模块
  2. #include <Eigen/Core> // 包含Matrix和Array类,基础的线性代数运算和数组操作
  3. #include <Eigen/LU> // 包含求逆,行列式,LU分解
  4. #include <Eigen/Geometry> //包含旋转,平移,缩放,2维和3维的各种变换。
  5. #include <Eigen/Cholesky> //包含LLT和LDLT Cholesky分解
  6. #include <Eigen/SVD> //包含SVD分解
  7. #include <Eigen/QR> //包含QR分解
  8. #include <Eigen/Eigenvalues> //包含特征值,特征向量分解
  9. #include <Eigen/Sparse> //包含稀疏矩阵的存储和运算
  10. #include <Eigen/Eigen> //包含Dense和Sparse

向量

向量初始化与访问

  1. Eigen::Vector3f v1 = Eigen::Vector3f::Zero();
  2. cout << v1(1) << endl;
  3. Eigen::VectorXf v3(20); //维度为20的向量,未初始化.
  4. v3 << 1.0 , 2.0 , 3.0;
  5. v3(0), v3(1), v3(2)
  6. //Eigen的向量默认为列向量,比如Vector3f是一个3x1的矩阵。
  7. //不过也有行向量RowVectorXd
  8. using namespace Eigen;
  9. RowVectorXd rv1(1,2,3);
  10. RowVectorXd rv2(4);
  11. rv2 << 1,2,3,4;
  12. RowVectorXd joined_rv12(7);
  13. joined_rv12 << rv1 , rv2; //rv1后接rv2
  14. //joined_rv12 is:
  15. 1 2 3 1 2 3 4;

向量方法

  1. u.norm(); //向量的模
  2. u.dot(v); //点乘,即对应元素乘积的和,返回一个标量。与v.dot(u),u.transpose()*v,v.transpose()*u相同。
  3. u.cross(v); //叉乘,返回向量。与v.cross(u)相差一个负号。
  4. u.adjoint(); //返回u的共轭向量,若u为实向量,则返回结果与u相同。
  5. //获得前3个分量
  6. Eigen::Vector4f vec4(3, 4, 5, 1);
  7. Eigen::Vector3f vec3 = vec4.head<3>();

矩阵

矩阵初始化

  1. //2x2
  2. Eigen::Matrix<double, 2, 2> m;
  3. m << 1, 2, 3, 4;
  4. //2x3
  5. Eigen::MatrixXf m1(2, 3);
  6. m1 << 1, 2, 3,
  7. 4, 5, 6;
  8. cout << m1(0, 0) << endl; //1.00000000
  9. cout << m1(1, 1) << endl; //5.00000000
  10. cout << m1(1, 2) << endl; //6.00000000
  11. //3x3
  12. Eigen::Matrix3f mat;
  13. //第0列 第1列 第2列
  14. mat << 1.0, 2.0, 3.0, //第0行
  15. 4.0, 5.0, 6.0, //第1行
  16. 7.0, 8.0, 9.0; //第2行
  17. //mat(行, 列)
  18. Eigen::Matrix3d m2 = Eigen::Matrix3d::Identity();//Eigen::Matrix3d::Zero();
  19. Eigen::Matrix3d m3 = Eigen::Matrix3d::Random(); //随机初始化

矩阵方法

  1. MatrixXf m7 = MatrixXf::Random(3,3);
  2. m7.row(i); //矩阵第i行
  3. m7.col(j); //矩阵第j列
  4. m7.transpose(); //矩阵转置
  5. m7.conjugate(); //共轭
  6. m7.adjoint(); //共轭转置
  7. m7.minCoeff();//所有元素中最小元素
  8. m7.maxCoeff();//所有元素中最大元素
  9. m7.trace();//迹,对角元素的和
  10. m7.sum(); //所有元素求和
  11. m7.prod(); //所有元素求积
  12. m7.mean(); //所有元素求平均
  13. mat.norm(); //返回矩阵的Frobenius范数,即元素平方的和的平方根
  14. mat.transpose(); //矩阵转置
  15. mat.trace(); //返回矩阵的迹,即返回主对角线上元素的和。如果不是方阵或者为向量,仍返回对角线元素的和。

旋转矩阵

  1. //获得旋转矩阵
  2. Eigen::AngleAxisf rotation_vec(45, Eigen::Vector3f(0, 0, 1)); //旋转轴
  3. Eigen::Matrix3f mat = rotation_vec.toRotationMatrix(); //旋转矩阵
  4. Eigen::Matrix4f mat1 = Eigen::Matrix4f::Identity(); //转成四维
  5. for (int i = 0; i < 3; ++i)
  6. for (int j = 0; j < 3; ++j)
  7. mat1(i, j) = mat(i, j);

向量与矩阵

  1. //向量与矩阵的乘法
  2. //Eigen的向量默认为列向量,是一个3x1的矩阵。所以是矩阵*向量
  3. newP = mat2 * mat1 * P;
  4. /** 矩阵的+、-、数×、乘法
  5. 左右两侧变量具有相同的尺寸(行和列),并且元素类型相同(Eigen不自动转化类型),
  6. 其运算和int,float等基本类型相同。*/
  7. Vector3f v6 = m7 * v5;
  8. Matrix3f m_sum = m6 + m7;
  9. Matrix3f m_dec = m6 - m7;
  10. Matrix3f m_prod = 2.5 * m7;
  11. Matrix3f m_prod2 = m6 * m7;
  12. Matrix3d m_dev = m7 / 2.0;

错误合集

error C2338: INVALID_MATRIX_PRODUCT

Eigen使用时矩阵的使用越界了,比如使用了43的矩阵,但是给它赋值的行或列超过了43。
检查错误然后将超出存储空间的代码修改就可以了

error C2338: FLOATING_POINT_ARGUMENT_PASSED__INTEGER_WAS_EXPECTED