Eigen3的库使用

本文详细介绍了Eigen3库的使用,包括向量的一元操作(模、转置)、二元操作(内积、叉积)、共轭,矩阵的赋值、转置、块操作,以及坐标变换中的旋转矩阵、四元数和欧拉角等。此外,还有数据类型转换和矩阵分解的Cholesky分解实例。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

eigen3lib的使用

向量

Eigen::Vector3f u;//3行*1列 列向量

向量一元操作

u.norm();//向量的模
u.transpose()//向量的转置

向量二元操作

Eigen::Vector3f v;
u.dot(v);//向量内积 u·v
u.cross(v);//向量叉积 u×v

共轭

u.adjoint();//返回u的共轭向量,若u为实向量,则返回结果与u相同。

矩阵

Eigen::Matrix3d A;//3*3方阵
Eigen::Matrix<double, 3, 6> B;//3行*6列矩阵

矩阵赋值

A<<1,0,0,
    0,1,0,
    0,0,1;
A = Eigen::Matrix3d::Identity();//单位矩阵

转置

A.transpose();

矩阵块操作

取行

Eigen::Vector3d n0,n1,n2;
A12.row(0) = n0.transpose();//第0行
A12.row(1) = n1.transpose();//第1行
A12.row(2) = n2.transpose();//第2行

取列

Eigen::Vector3d n0,n1,n2;
A.col(0) = n0; //第0列
A.col(1) = n1; //第1列
A.col(2) = n2; //第2列

取任意大小的块

B.block<1, 3>(2, 0)=n1.transpose();//每块大小<1,3>1行*3列 位置(2,0)第2行,第0列的块
B.leftCols<3>() = Eigen::Matrix3d::Identity();//按照列从左边取<3>列
B.rightCols<3>() = Eigen::Matrix3d::Identity();//按照列右边取<3>列

矩阵分解

分解矩阵A

Cholesky分解

将A分解成 下三角矩阵L*L^T

Eigen::Matrix3d L,LT;
L = Eigen::LLT<Eigen::Matrix3d>(A).matrixL();
LT = Eigen::LLT<Eigen::Matrix3d>(A).matrixL().transpose();

原理介绍:https://blog.csdn.net/wfei101/article/details/81951888

坐标变换

坐标轴

Eigen::Vector3d::UnitX();  //x轴单位向量
Eigen::Vector3d::UnitY();  //x轴单位向量
Eigen::Vector3d::UnitZ();  //x轴单位向量

旋转

旋转矩阵

Eigen::Matrix3d rotation_matrix =Eigen::Matrix3d::Identity();

// 旋转矩阵 => 旋转四元数
Eigen::Quaterniond quaternion(rotation_matrix);

Eigen::Quaterniond quaternion;
quaternion = rotation_matrix;

// 旋转矩阵 => 欧拉角(Z - Y - X,即Row、Pitch、Yaw)
Eigen::Vector3d eulerAngle = rotation_matrix.eulerAngles(2, 1, 0);

// 旋转矩阵 => 旋转向量
Eigen::AngleAxisd rotation_vector(rotation_matrix);

Eigen::AngleAxisd rotation_vector;
rotation_vector = rotation_matrix;

Eigen::AngleAxisd rotation_vector;
rotation_vector.fromRotationMatrix(rotation_matrix);

旋转四元数

double x,y,z,w;
Eigen::Quaterniond quaternion(w, x, y, z);

//  旋转四元数 => 旋转矩阵
Eigen::Matrix3d rotation_matrix;
rotation_matrix = quaternion.matrix();

Eigen::Matrix3d rotation_matrix;
rotation_matrix = quaternion.toRotationMatrix();

//  旋转四元数 => 欧拉角(Z - Y - X,即Row、Pitch、Yaw)
Eigen::Vector3d eulerAngle = quaternion.matrix().eulerAngles(2, 1, 0);

//  旋转四元数 => 旋转向量
Eigen::AngleAxisd rotation_vector(quaternion);

Eigen::AngleAxisd rotation_vector;
rotation_vector = quaternion;

欧拉角

Eigen::Vector3d eulerAngle(yaw, pitch, roll);

// 欧拉角 => 四元数
Eigen::AngleAxisd rollAngle(AngleAxisd(eulerAngle(2), Vector3d::UnitX()));
Eigen::AngleAxisd pitchAngle(AngleAxisd(eulerAngle(1), Vector3d::UnitY()));
Eigen::AngleAxisd yawAngle(AngleAxisd(eulerAngle(0), Vector3d::UnitZ()));
Eigen::Quaterniond quaternion;
quaternion = yawAngle * pitchAngle * rollAngle;

// 欧拉角 => 旋转矩阵
Eigen::AngleAxisd rollAngle(AngleAxisd(eulerAngle(2), Vector3d::UnitX()));
Eigen::AngleAxisd pitchAngle(AngleAxisd(eulerAngle(1), Vector3d::UnitY()));
Eigen::AngleAxisd yawAngle(AngleAxisd(eulerAngle(0), Vector3d::UnitZ()));
Eigen::Matrix3d rotation_matrix;
rotation_matrix = yawAngle * pitchAngle * rollAngle;


// 欧拉角 => 旋转向量
Eigen::AngleAxisd rollAngle(AngleAxisd(eulerAngle(2), Vector3d::UnitX()));
Eigen::AngleAxisd pitchAngle(AngleAxisd(eulerAngle(1), Vector3d::UnitY()));
Eigen::AngleAxisd yawAngle(AngleAxisd(eulerAngle(0), Vector3d::UnitZ()));
Eigen::AngleAxisd rotation_vector;
rotation_vector = yawAngle * pitchAngle * rollAngle;

旋转向量

Eigen::AngleAxisd rotation_vector(alpha, Vector3d(x, y, z));

// 旋转向量 => 旋转矩阵
Eigen::Matrix3d rotation_matrix;
rotation_matrix = rotation_vector.matrix();

Eigen::Matrix3d rotation_matrix;
rotation_matrix = rotation_vector.toRotationMatrix();

// 旋转向量 => 四元数
Eigen::Quaterniond quaternion(rotation_vector);

Eigen::Quaterniond quaternion;
Quaterniond quaternion;

Eigen::Quaterniond quaternion;
quaternion = rotation_vector;

// 旋转向量 => 欧拉角(Z - Y - X,即Row、Pitch、Yaw)
Eigen::Vector3d eulerAngle = rotation_vector.matrix().eulerAngles(2, 1, 0);

数据类型转化

double数字转化为矩阵

double nums[1][9];
Eigen::Map<Eigen::Matrix<double, 3, 6, Eigen::RowMajor>> A(nums[0]);
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值