Eigen是一个开源矩阵运算库,使用模板编程。
其他
float toRadian(float degress){ //角度(°)转弧度return degress / 180.0*acos(-1);}
常用头文件
#include <Eigen/Dense> //包含了下面的Core/Geometry/LU/Cholesky/SVD/QR/Eigenvalues模块#include <Eigen/Core> // 包含Matrix和Array类,基础的线性代数运算和数组操作#include <Eigen/LU> // 包含求逆,行列式,LU分解#include <Eigen/Geometry> //包含旋转,平移,缩放,2维和3维的各种变换。#include <Eigen/Cholesky> //包含LLT和LDLT Cholesky分解#include <Eigen/SVD> //包含SVD分解#include <Eigen/QR> //包含QR分解#include <Eigen/Eigenvalues> //包含特征值,特征向量分解#include <Eigen/Sparse> //包含稀疏矩阵的存储和运算#include <Eigen/Eigen> //包含Dense和Sparse
向量
向量初始化与访问
Eigen::Vector3f v1 = Eigen::Vector3f::Zero();cout << v1(1) << endl;Eigen::VectorXf v3(20); //维度为20的向量,未初始化.v3 << 1.0 , 2.0 , 3.0;v3(0), v3(1), v3(2)//Eigen的向量默认为列向量,比如Vector3f是一个3x1的矩阵。//不过也有行向量RowVectorXdusing namespace Eigen;RowVectorXd rv1(1,2,3);RowVectorXd rv2(4);rv2 << 1,2,3,4;RowVectorXd joined_rv12(7);joined_rv12 << rv1 , rv2; //rv1后接rv2//joined_rv12 is:1 2 3 1 2 3 4;
向量方法
u.norm(); //向量的模u.dot(v); //点乘,即对应元素乘积的和,返回一个标量。与v.dot(u),u.transpose()*v,v.transpose()*u相同。u.cross(v); //叉乘,返回向量。与v.cross(u)相差一个负号。u.adjoint(); //返回u的共轭向量,若u为实向量,则返回结果与u相同。//获得前3个分量Eigen::Vector4f vec4(3, 4, 5, 1);Eigen::Vector3f vec3 = vec4.head<3>();
矩阵
矩阵初始化
//2x2Eigen::Matrix<double, 2, 2> m;m << 1, 2, 3, 4;//2x3Eigen::MatrixXf m1(2, 3);m1 << 1, 2, 3,4, 5, 6;cout << m1(0, 0) << endl; //1.00000000cout << m1(1, 1) << endl; //5.00000000cout << m1(1, 2) << endl; //6.00000000//3x3Eigen::Matrix3f mat;//第0列 第1列 第2列mat << 1.0, 2.0, 3.0, //第0行4.0, 5.0, 6.0, //第1行7.0, 8.0, 9.0; //第2行//mat(行, 列)Eigen::Matrix3d m2 = Eigen::Matrix3d::Identity();//Eigen::Matrix3d::Zero();Eigen::Matrix3d m3 = Eigen::Matrix3d::Random(); //随机初始化
矩阵方法
MatrixXf m7 = MatrixXf::Random(3,3);m7.row(i); //矩阵第i行m7.col(j); //矩阵第j列m7.transpose(); //矩阵转置m7.conjugate(); //共轭m7.adjoint(); //共轭转置m7.minCoeff();//所有元素中最小元素m7.maxCoeff();//所有元素中最大元素m7.trace();//迹,对角元素的和m7.sum(); //所有元素求和m7.prod(); //所有元素求积m7.mean(); //所有元素求平均mat.norm(); //返回矩阵的Frobenius范数,即元素平方的和的平方根mat.transpose(); //矩阵转置mat.trace(); //返回矩阵的迹,即返回主对角线上元素的和。如果不是方阵或者为向量,仍返回对角线元素的和。
旋转矩阵
//获得旋转矩阵Eigen::AngleAxisf rotation_vec(45, Eigen::Vector3f(0, 0, 1)); //旋转轴Eigen::Matrix3f mat = rotation_vec.toRotationMatrix(); //旋转矩阵Eigen::Matrix4f mat1 = Eigen::Matrix4f::Identity(); //转成四维for (int i = 0; i < 3; ++i)for (int j = 0; j < 3; ++j)mat1(i, j) = mat(i, j);
向量与矩阵
//向量与矩阵的乘法//Eigen的向量默认为列向量,是一个3x1的矩阵。所以是矩阵*向量newP = mat2 * mat1 * P;/** 矩阵的+、-、数×、乘法左右两侧变量具有相同的尺寸(行和列),并且元素类型相同(Eigen不自动转化类型),其运算和int,float等基本类型相同。*/Vector3f v6 = m7 * v5;Matrix3f m_sum = m6 + m7;Matrix3f m_dec = m6 - m7;Matrix3f m_prod = 2.5 * m7;Matrix3f m_prod2 = m6 * m7;Matrix3d m_dev = m7 / 2.0;
错误合集
error C2338: INVALID_MATRIX_PRODUCT
Eigen使用时矩阵的使用越界了,比如使用了43的矩阵,但是给它赋值的行或列超过了43。
检查错误然后将超出存储空间的代码修改就可以了
