//直接复制到cpp文件中就可以直接使用
在这里插入代码片
void gauss_solve(int n, double A[], double x[], double b[]);/polyfit(n,x,y,poly_n,a)=/
/=拟合y=a0+a1x+a2x2+……+apoly_n*xpoly_n==/
/=n是数据个数 xy是数据值 poly_n是多项式的项数==/
/=返回a0,a1,a2,……a[poly_n],系数比项数多一(常数项)===/
void polyfit(int n, double x[], double y[], int poly_n, double p[])
{int i, j;
double *tempx, *tempy, *sumxx, *sumxy, *ata;
tempx = (double *)calloc(n, sizeof(double));
sumxx = (double *)calloc((poly_n * 2 + 1), sizeof(double));
tempy = (double *)calloc(n, sizeof(double));
sumxy = (double *)calloc((poly_n + 1), sizeof(double));
ata = (double *)calloc((poly_n + 1)*(poly_n + 1), sizeof(double));
for (i = 0; i<n; i++)
{tempx[i] = 1;tempy[i] = y[i];
}
for (i = 0; i<2 * poly_n + 1; i++)
{for (sumxx[i] = 0, j = 0; j<n; j++){sumxx[i] += tempx[j];tempx[j] *= x[j];}
}
for (i = 0; i<poly_n + 1; i++)
{for (sumxy[i] = 0, j = 0; j<n; j++){sumxy[i] += tempy[j];tempy[j] *= x[j];}
}
for (i = 0; i<poly_n + 1; i++)
{for (j = 0; j<poly_n + 1; j++){ata[i*(poly_n + 1) + j] = sumxx[i + j];}
}
gauss_solve(poly_n + 1, ata, p, sumxy);free(tempx);
free(sumxx);
free(tempy);
free(sumxy);
free(ata);
}
/============================================================
高斯消元法计算得到n次多项式的系数
n : 系数的个数
ata : 线性矩阵
sumxy : 线性方程组的Y值
p : 返回拟合的结果
============================================================/
void gauss_solve(int n, double A[], double x[], double b[])
{int i, j, k, r;
double max;
for (k = 0; k<n - 1; k++)
{max = fabs(A[kn + k]); // find maxmum
r = k;
for (i = k + 1; i<n - 1; i++)
{if (max<fabs(A[in + i]))
{max = fabs(A[in + i]);
r = i;
}
}
if (r != k)
{for (i = 0; i<n; i++) //change array:A[k]&A[r]
{max = A[kn + i];
A[kn + i] = A[rn + i];
A[r*n + i] = max;
}
max = b[k]; //change array:b[k]&b[r]
b[k] = b[r];
b[r] = max;
}
}//曲线拟合结果以及特征点计算并保存到txt文档
//注意:拟合计算出来的结果是double,需要强制类型转换利用四舍五入算法对特征点所在的行数进行处理
void Computational_feature_points(const Mat &src)
{int num = getSample(src); //获得样本个数
int FeatureCol = Get_FeatureCol(src); //获得特征点所在的列数
int row_result;//特征点所在的行double P[3];
int dimension = 2; //5次多项式拟合//此方法定义数组可以使得数组的长度为变量
double* xx = new double[num];//样本的x坐标
double* yy = new double[num];//样本的y坐标for (int j = 0, i = 0; i <num; i++, j++)
{                   //  要拟合的数据xx[j] = e_col[i];yy[j] = d_row[i];
}polyfit(num, xx, yy, dimension, P);//printf("拟合系数, 按升序排列如下:\n");
for (int i = 0; i < dimension + 1; i++)              //这里是升序排列,Matlab是降序排列
{printf("P[%d]=%lf\n", i, P[i]);
}row_result = P[0] + P[1] * FeatureCol + P[2] * FeatureCol*FeatureCol;
cout << "所在的行数" << row_result << "   " << "所在的列数" << FeatureCol << endl;//将特征点从像素坐标系下转移至相机坐标系下
/*相机的内外参使用的是a平面标定的结果:内参矩阵如下所示:
[6026.7679813        0         1295.5
0          6026.7679813   971.5
0               0           1    ]
*/
double Xc, Yc, Zc;
double  mid_result;
mid_result = α1 + 0.004005*(FeatureCol - 1295.5) + 6.654*(row_result - 971.5);
Zc = 220.15 * α1 / mid_result;
Xc = (FeatureCol - 1295.5)*Zc / α1;
Yc = (row_result - 971.5)*Zc / α1;//将计算出来的特征点写入到txt文档中
fstream f;
//追加写入,在原来基础上加了ios::app
/*f.open("data.txt", ios::out | ios::app);*/
f.open("data.txt", ios::out | ios::app);
//输入你想写入的内容
f <<"Xc:"<< Xc << "   " << "Yc:" << Yc << "   " << "Zc:" << Zc << endl;
f << endl;
f.close();

最小二乘法曲线拟合(c++实现)相关推荐

  1. matlab polyfit c语言,算法——纯C语言最小二乘法曲线拟合

    算法--纯C语言最小二乘法曲线拟合 [复制链接] 写完,还没来得及写注释,已通过Matlab的polyfit验证(阶数高或者数据量太大会有double数据溢出的危险,低阶的都吻合),时间有点紧,程序注 ...

  2. 多项式最小二乘法曲线拟合Python程序

    #多项式最小二乘法曲线拟合 from numpy import * from numpy.linalg import * X = [1, 3, 4, 5, 6, 7, 8, 9, 10] Y = [2 ...

  3. c语言平曲线,算法——纯C语言最小二乘法曲线拟合

    算法--纯C语言最小二乘法曲线拟合 写完,还没来得及写注释,已通过Matlab的polyfit验证(阶数高或者数据量太大会有double数据溢出的危险,低阶的都吻合),时间有点紧,程序注释,数学推导等 ...

  4. 最小二乘法曲线拟合 java_最小二乘法拟合java实现源程序(转)

    因为我所在的项目要用到最小二乘法拟合,所有我抽时间将C++实现的程序改为JAVA实现,现在贴出来,供大家参考使用. /** * 函数功能:最小二乘法曲线拟合 * @param x 实型一维数组,长度为 ...

  5. 最小二乘法曲线拟合(源代码)

    在已知曲线函数的情况下,对已知数据使用最小二乘法进行参数求解,从而实现曲线拟合的方法最为简便高效. 数据如下,匹配函数为 y = a0+a1*x . 0 1 2 3 4 5 x 1.5 2.5 3.5 ...

  6. 最小二乘法曲线拟合 C语言实现

    简单思路如下: 1,采用目标函数对多项式系数求偏导,得到最优值条件,组成一个方程组: 2,方程组的解法采用行列式变换(两次变换:普通行列式--三角行列式--对角行列式--求解),行列式的求解算法上优化 ...

  7. 最小二乘法曲线拟合原理与实现

    参考文章http://blog.csdn.net/jairuschan/article/details/7517773 最小二乘学习法是对模型的输出和训练集输出的平方误差为最小时的参数进行学习,式中之 ...

  8. 最小二乘法曲线拟合程序matlab,最小二乘法曲线拟合(代码环境:matlab)

    题目一: 1.用表1-1中的世界人口统计数值估计1980年的人口,求最佳最小二乘法数值估计: 表 1-1: 年 人口 1960 3 039 585 530 1970 3 707 475 887 199 ...

  9. 最小二乘法曲线拟合y=c1+c2x+c3x^2——java版

    import java.util.Scanner; public class Nllsf {/*** 拟合目标P(x)=c1+c2x+c3x^2* c1+c2x+c3x^2=f(x)*/static ...

  10. 插值与拟合 (二) : 曲线拟合的线性最小二乘法

    目录 1  线性最小二乘法 最小二乘准则                           系数   的确定 1.2  函数  的选取 常用的拟合曲线:直线.多项式曲线.双曲线.指数曲线 2 最小二 ...

最新文章

  1. pandas读取多个excel文件并拼接(append)起来形成最终的dataframe、与标签文件连接(join)形成最终学习数据集
  2. Ubuntu14.04桥接网络设置与SSH登陆
  3. 第4.3节 Python中与迭代相关的函数
  4. 检测性异常VS非检测性异常
  5. 深度学习之 SSD(Single Shot MultiBox Detector)
  6. sql的 select
  7. python中的while循环语句的数组循环_while循环
  8. 给她帮忙她也没有说给我多少钱
  9. 面对 Google、Facebook、微软等科技巨头的围剿,夹缝中的初创企业该何去何从?...
  10. iOS开发之NSURLSession/NSURLConnection HTTP load failed 的解决办法
  11. ThinkPHP去除url中的index.php
  12. 广州天河租房随笔记录
  13. smartdns使用指南_SmartDNS 使用教程(PLUS+版)
  14. X79双cpu linux,Sandy Bridge-E处理器、X79芯片组详尽官方规格
  15. PS:更换证件照背景颜色
  16. 安装VTN协调器操作步骤
  17. 服务器台式机装win7系统,服务器主机装win7系统安装
  18. 人生的智慧——叔本华
  19. S32K144_FTM定时器中断
  20. 三大面试技巧,平常就能练起来!

热门文章

  1. Linux Mii management/mdio子系统分析之四 mdio总线及phy驱动模型及其开发流程
  2. 数据结构与算法之图的深度优先遍历(DFS)
  3. SQL SERVER 2005数据库镜像(上)
  4. C语言n番战--数组(三)
  5. 因果法制体系轮回框架的崛起
  6. 安装pdfFactory Pro
  7. 华为设备VRRP配置命令
  8. swiper5 点击图换下一张_软网推荐:骗倒社交好友 制作另类隐藏图
  9. 观看影片《硅谷传奇》
  10. slic codec