Eigen::VectorXf FitterLeastSquareMethod(vector<float> &X, vector<float> &Y, uint8_t orders) { // abnormal input verification if (X.size() < 2 || Y.size() < 2 || X.size() != Y.size() || orders < 1) exit(EXIT_FAILURE); // map sample data from STL vector to eigen vector Eigen::Map<Eigen::VectorXf> sampleX(X.data(), X.size()); Eigen::Map<Eigen::VectorXf> sampleY(Y.data(), Y.size()); Eigen::MatrixXf mtxVandermonde(X.size(), orders + 1); // Vandermonde matrix of X-axis coordinate vector of sample data Eigen::VectorXf colVandermonde = sampleX; // Vandermonde column // construct Vandermonde matrix column by column for (size_t i = 0; i < orders + 1; ++i) { if (0 == i) { mtxVandermonde.col(0) = Eigen::VectorXf::Constant(X.size(), 1, 1); continue; } if (1 == i) { mtxVandermonde.col(1) = colVandermonde; continue; } colVandermonde = colVandermonde.array()*sampleX.array(); mtxVandermonde.col(i) = colVandermonde; } // calculate coefficients vector of fitted polynomial Eigen::VectorXf result = (mtxVandermonde.transpose()*mtxVandermonde).inverse()*(mtxVandermonde.transpose())*sampleY; return result; } 详细解释以上代码,并说明原理
时间: 2024-04-20 15:24:42 浏览: 120
以上代码实现了最小二乘法拟合多项式函数。函数输入参数X和Y,分是样本数据的X轴和Y轴坐标,以及orders,表示拟合项式的阶数。
代码中首先进行了异常输入验证,确输入数据的正确性。然后通过Eigen库的Map功能将输入的STL vector映射为Eigen库的VectorXf类型,方便后续矩阵计算。
接下来,代码构建了Vandermonde矩阵mtxVandermonde,该矩阵的行数为样本数据的个数,列数为orders + 1。Vandermonde矩阵的每一列都是X轴坐标向量的不同次幂,其中第一列为全为1的列向量,第二列为X轴坐标向量本身,后续列则通过逐次相乘得到。这样构建的矩阵可以用于拟合多项式。
最后,通过最小二乘法公式计算拟合多项式的系数向量result。具体计算过程为:将矩阵mtxVandermonde的转置矩阵与自身相乘,再取其逆矩阵,然后再与mtxVandermonde的转置矩阵相乘,并将结果与Y轴坐标向量sampleY相乘,得到拟合多项式的系数向量。
最后,函数返回拟合多项式的系数向量result。
相关问题
imuState<S> imu_state_; std::vector<camState<S>> cam_states_; std::vector<camState<S>> pruned_states_; std::vector<Vector3<S>, Eigen::aligned_allocator<Vector3<S>>> map_; imuState<S> imu_state_; std::vector<camState<S>> cam_states_; std::vector<camState<S>> pruned_states_; std::vector<Vector3<S>, Eigen::aligned_allocator<Vector3<S>>> map_;
这是一段 C++ 代码,其中定义了一个模板类,类名为 imuState,模板参数 S 表示数据类型。类中有四个成员变量:一个 imuState 类型的 imu_state_,一个 vector 类型的 cam_states_,一个 vector 类型的 pruned_states_,以及一个 vector 类型的 map_,其中 map_ 的元素类型为 Vector3<S>,并使用 Eigen 库的 aligned_allocator。
这个类的具体实现需要查看更多代码。
pcl::SHOTEstimation<PointInT, PointNT, PointOutT, PointRFT>::computePointSHOT ( const int index, const std::vector<int> &indices, const std::vector<float> &sqr_dists, Eigen::VectorXf &shot)
该函数是 PCL 库中的一个函数,用于计算一个点的 SHOT 描述符。其中具体参数含义如下:
- index:需要计算 SHOT 描述符的点在点云中的索引;
- indices:在计算 SHOT 描述符时,使用的点的索引,不一定包含需要计算 SHOT 的点;
- sqr_dists:需要计算 SHOT 描述符的点与 indices 中每个点之间的距离的平方;
- shot:计算出的 SHOT 描述符。
函数主要步骤如下:
1. 从输入点云中获取需要计算 SHOT 描述符的点的法向量和 RFT(Reference Frame Transform)描述符;
2. 对于每个邻域点,计算其相对于需要计算 SHOT 描述符的点的 RFT 描述符,并用这些 RFT 描述符计算一个 9 维的直方图;
3. 将直方图归一化,得到 352 维的 SHOT 描述符。
这个函数的主要作用是计算点云中的 SHOT 描述符,可以用于点云配准、物体识别等任务。
阅读全文