You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

基于Eigen库:求满足a*c=b的旋转矩阵c

解决方法

首先纠正你代码里的一个错误:定义矩阵b时,你误写为对a赋值,正确代码应该是:

Eigen::Matrix3d b;
b = Eigen::AngleAxisd(0.25*M_PI,   Eigen::Vector3d::UnitX())
  * Eigen::AngleAxisd(0.0,         Eigen::Vector3d::UnitY())
  * Eigen::AngleAxisd(0.25*M_PI,   Eigen::Vector3d::UnitZ());

方法一:直接用矩阵运算(推荐)

因为旋转矩阵是正交矩阵,其逆矩阵等于自身的转置,所以从公式a*c = b可以直接推导出:
c = a.inverse() * b
等价于更高效的写法(利用正交矩阵性质):
c = a.transpose() * b

直接实现的代码如下:

Eigen::Matrix3d c = a.transpose() * b;

得到的c自然是满足条件的旋转矩阵,因为旋转矩阵的乘积仍然是旋转矩阵。

方法二:基于角轴形式计算(仅作原理参考)

如果你一定要通过角轴推导c,步骤如下:

  1. 求矩阵a的逆对应的角轴:由于a是旋转矩阵,其逆等于转置,先计算a_inv = a.transpose(),再转成角轴Eigen::AngleAxisd angleAxisAInv(a_inv)。
  2. 角轴的乘法顺序与矩阵乘法一致,所以c的角轴可通过angleAxisAInv * angleAxisB得到。
  3. 将得到的角轴转换为矩阵形式。

代码示例:

Eigen::AngleAxisd angleAxisAInv(a.transpose());
Eigen::AngleAxisd angleAxisC = angleAxisAInv * angleAxisB;
Eigen::Matrix3d c = angleAxisC.toRotationMatrix();

这种方法本质和直接矩阵运算一致,但多了类型转换步骤,效率更低,因此更推荐第一种方法。

内容的提问来源于stack exchange,提问作者user22132012

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.13 05:07:06