- 最小二乘法
拟合程度比较好,算力快,但是不会经过起始点
https://zhuanlan.zhihu.com/p/268884807
上述链接的函数实现有问题,可以使用
#include "LeastSquareMethod.h"
/**
* @brief Fit polynomial using Least Square Method.
*
* @param X X-axis coordinate vector of sample data.
* @param Y Y-axis coordinate vector of sample data.
* @param orders Fitting order which should be larger than zero.
* @return Eigen::VectorXf Coefficients vector of fitted polynomial.
*/
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).ldlt().solve(mtxVandermonde.transpose()*sampleY);
return result;
}
.Idlt().solve()的理解,可以参考博客https://www.zhihu.com/column/c_1584844668977840128?utm_id=0
-
Spline
分段控制曲线,曲线经过控制点,可能会有小S弯 -
Bezier
所有的控制点一起控制整条曲线,动一个点,整条曲线都会变动,算力比较大 -
B-Spline
分段控制曲线,但是曲线不会经过控制点,可能会有小S弯