C++类中依赖函数初始化变量的实现问题(Matlab转C++)
解决RobotParameters类中Corrqds变量初始化问题
1. 明确Matlab中prodDqiDqj的逻辑
Matlab里的prodDqiDqj函数是对6维向量做两两组合(i < j)的乘积计算,最终生成15维结果(6选2的组合数为15)。比如输入向量[dq1, dq2, dq3, dq4, dq5, dq6],输出顺序为:dq1*dq2, dq1*dq3, dq1*dq4, dq1*dq5, dq1*dq6, dq2*dq3, dq2*dq4, dq2*dq5, dq2*dq6, dq3*dq4, dq3*dq5, dq3*dq6, dq4*dq5, dq4*dq6, dq5*dq6
2. C++中函数的声明与实现
方案一:使用std::array(固定大小,更高效)
在RobotParameters类的头文件中声明函数:
#include <array> class RobotParameters { private: std::array<double, 15> Corrqds; // 声明静态成员函数,输入6维数组,返回15维数组 static std::array<double, 15> prodDqiDqj(const std::array<double, 6>& dq); public: // 构造函数,用于初始化Corrqds RobotParameters(const std::array<double, 6>& dq); // 其他成员定义... };
在cpp文件中实现函数:
#include "RobotParameters.h" std::array<double, 15> RobotParameters::prodDqiDqj(const std::array<double, 6>& dq) { std::array<double, 15> result; int idx = 0; // 遍历所有i < j的组合 for (int i = 0; i < 6; ++i) { for (int j = i + 1; j < 6; ++j) { result[idx++] = dq[i] * dq[j]; } } return result; }
方案二:使用std::vector(灵活适配动态大小)
头文件声明:
#include <vector> class RobotParameters { private: std::vector<double> Corrqds; static std::vector<double> prodDqiDqj(const std::vector<double>& dq); public: RobotParameters(const std::vector<double>& dq); // 其他成员定义... };
cpp文件实现:
#include "RobotParameters.h" #include <cassert> std::vector<double> RobotParameters::prodDqiDqj(const std::vector<double>& dq) { // 断言输入为6维,防止越界 assert(dq.size() == 6); std::vector<double> result; result.reserve(15); // 预分配空间提升效率 for (int i = 0; i < 6; ++i) { for (int j = i + 1; j < 6; ++j) { result.push_back(dq[i] * dq[j]); } } return result; }
3. 完成Corrqds的初始化
在构造函数中通过成员初始化列表直接调用prodDqiDqj函数:
对应std::array的构造函数
RobotParameters::RobotParameters(const std::array<double, 6>& dq) : Corrqds(prodDqiDqj(dq)) { // 其他初始化逻辑 }
对应std::vector的构造函数
RobotParameters::RobotParameters(const std::vector<double>& dq) : Corrqds(prodDqiDqj(dq)) { // 其他初始化逻辑 }
内容的提问来源于stack exchange,提问作者mikel lasa
相关产品推荐
相关产品推荐

