C++ 矩阵操作,Eigen::MatrixXf一些见解

1 Eigen::MatrixXf矩阵运算加速方法

  • 舍弃不必要的计算:用不着的数据去掉;
  • 尽量引用加const传递变量;
  • 尽量不自己写for计算;
  • 加入O3优化:在CMakeLists中添加
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -O3")
message(${CMAKE_CXX_FLAGS})

2 Error:cannot call member function without object

有问题代码:

class Tools {
   public:
   cv::Mat eulerAnglesToRotationMatrix(cv::Vec3f &theta);
}

在类中定义函数时没有把成员函数声明为static函数,否则需要通过对象来调用函数,修改为:

class Tools {
   public:
   static cv::Mat eulerAnglesToRotationMatrix(cv::Vec3f &theta);
}

3 Eigen::MatrixXf矩阵操作问题

Eigen::MatrixXf与matlab矩阵操作对照表

4 欧拉角和旋转矩阵相互转换

改成cv::Vec3d(欧拉角)与Eigen::MatrixXf(旋转矩阵)变换C++代码

/**欧拉角计算对应的旋转矩阵**/
Eigen::MatrixXf Tools::eulerAnglesToRotationMatrix(cv::Vec3d &theta)
{
    // 计算旋转矩阵的X分量
    Eigen::MatrixXf R_x = MatrixXf::Zero(3, 3);
    R_x << 1, 0, 0, 0, cos(theta[0]), -sin(theta[0]),0, sin(theta[0]), cos(theta[0]);
    // 计算旋转矩阵的Y分量
    Eigen::MatrixXf R_y = MatrixXf::Zero(3, 3);
    R_y << cos(theta[1]), 0, sin(theta[1]),0, 1, 0,-sin(theta[1]), 0, cos(theta[1]);
    // 计算旋转矩阵的Z分量
    Eigen::MatrixXf R_z = MatrixXf::Zero(3, 3);
    R_z <<cos(theta[2]),  -sin(theta[2]), 0,sin(theta[2]), cos(theta[2]), 0, 0, 0, 1;
    // 合并
    Eigen::MatrixXf R = R_z * R_y * R_x;
    return R;
}

/*** 功能: 通过给定的旋转矩阵计算对应的欧拉角**/
cv::Vec3d Tools::rotationMatrixToEulerAngles(Eigen::MatrixXf &R)
{
    float sy = sqrt(R(2,1) * R(2,1) + R(2,2) * R(2,2));
    bool singular = sy < 1e-6; // If
    float x, y, z;
    if (!singular) {
        x = atan2(R(2,1) , R(2,2));
        y = atan2(-R(2,0), sy);
        z = atan2(R(1,0), R(0,0));
    } else {
        x = atan2(-R(1,2), R(1,1));
        y = atan2(-R(2,0), sy);
        z = 0;
    }
    return cv::Vec3d(x, y, z);
}
  • 1
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Eigen::MatrixXf matrixXf(row, col);是一个使用Eigen库创建一个指定大小的浮点类型矩阵的语句。其中,row表示矩阵的行数,col表示矩阵的列数。在这个例子中,matrixXf是一个4行10列的矩阵。通过使用<<运算符,可以将数据逐个元素地输入到矩阵中。在这个例子中,矩阵的元素按从左到右、从上到下的顺序依次填充。所以,matrixXf中的第一个元素是1,第二个元素是2,以此类推,直到填充完最后一个元素20。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* [pcl点云数据 转化为 Eigen::Map](https://blog.csdn.net/weixin_36354875/article/details/126134952)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 33.333333333333336%"] - *2* [matlab.zip_4 3 2 1_eigen matrix](https://download.csdn.net/download/weixin_42659252/86629828)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 33.333333333333336%"] - *3* [Eigen 学习文档: 块操作](https://blog.csdn.net/wanzew/article/details/125703046)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 33.333333333333336%"] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值