分享给有需要的人,代码质量勿喷。

一、y = k * x + b

bool xjLeastSquares::xjFitLineByLeastSquares(
std::vector<double> &xjParameters, const std::vector<xjPoint> &xjData,const bool &kxb)
{try{xjParameters.clear();if (xjData.size() < 2)return false;double k = 0, b = 0;int xjPcount = xjData.size();double sumX = 0.0, sumY = 0.0;double sumXX = 0.0, sumXY = 0.0;for (int i = 0; i < xjPcount; i++){sumX += xjData[i].x;sumY += xjData[i].y;sumXX += xjData[i].x * xjData[i].x;sumXY += xjData[i].x * xjData[i].y;}double deltaX = sumXX * xjPcount - sumX * sumX;if (std::abs(deltaX) > 1e-15)/* 防止竖直线 */{k = (sumXY*xjPcount - sumX * sumY) / deltaX;b = (sumXX*sumY - sumX * sumXY) / deltaX;}xjParameters.push_back(k);xjParameters.push_back(b);return true;}catch (const std::exception&){return false;}
}

二、AX + BY + C = 0

参考自 Ziv Yaniv

/* 最小二乘法拟合直线:AX+BY+C=0 */
bool xjLeastSquares::xjFitLineByLeastSquares(
std::vector<double> &xjParameters, const std::vector<xjPoint> &xjData)
{try{xjParameters.clear();if (xjData.size() < 2)return false;double A = 0.0, B = 0.0, C = 0.0;int xjPcount = xjData.size();double meanX = 0.0, meanY = 0.0;double sumXX = 0.0, sumXY = 0.0, sumYY = 0.0;for (int i = 0; i < xjPcount; i++){meanX += xjData[i].x;meanY += xjData[i].y;sumXX += xjData[i].x * xjData[i].x;sumXY += xjData[i].x * xjData[i].y;sumYY += xjData[i].y * xjData[i].y;}meanX /= xjPcount;meanY /= xjPcount;sumXX -= xjPcount * meanX*meanX;sumXY -= xjPcount * meanX*meanY;sumYY -= xjPcount * meanY*meanY;if (abs(sumXX) < 1e-15){A = 1.0;B = 0.0;}else{double ev = (sumXX + sumYY + sqrt((sumXX - sumYY)*(sumXX - sumYY) + 4 * sumXY*sumXY)) / 2.0;A = -sumXY;B = ev - sumYY;double norm = sqrt(A*A + B * B);A /= norm;B /= norm;}xjParameters.push_back(A);xjParameters.push_back(B);C = -(A * meanX + B * meanY);xjParameters.push_back(C);return true;}catch (const std::exception&){return false;}
}

三、结果

两个公式的结果可能会略有差异。

C++:最小二乘法 拟合直线相关推荐

  1. C++:最小二乘法拟合直线

     原理: 代码: #include <opencv2/opencv.hpp> #include <opencv2/highgui/highgui.hpp>using names ...

  2. Python实现最小二乘法拟合直线(求斜率截距)

    利用最小二乘法拟合直线,实现了对一系列点拟合出其最接近的直线,并给出公式,包括斜率和截距.并且绘制出最终拟合线. 完整代码如下: # 核心代码,求斜率w,截距b def fit(data_x, dat ...

  3. 最小二乘法拟合直线 C++/OpenCV

    问题: 我们在拥有一系列散列的点(x1,y1),(x2,y2)... (xm,ym),这些点在一条直线附近,通过点拟合直线. 我在工程中是要拟合一系列线段,其实一条线段就对应着两个要拟合的点,算法上稍 ...

  4. 最小二乘法拟合直线簇交点及Ransac拟合

    最小二乘法拟合直线簇交点及Ransac拟合 最小二乘法的实现 Ransac优化 语言环境:Python 直线簇方程: y=p→+v→∗ty=\overrightarrow p+\overrightar ...

  5. opencv学习——最小二乘法拟合直线

    最小二乘法拟合直线 概念:最小二乘法多项式直线拟合,根据给定的点,求出它的函数y=f(x),当然求得准确的函数是不太可能的,但是我们能求出它的近似曲线y=φ(x) 原理 假设有点  , I = 1,2 ...

  6. C++opencv实现最小二乘法拟合直线和平面

    使用opencv中的Mat实现用矩阵的方式根据最小二乘法拟合直线和平面方程,但是好像不能实现拟合斜率无穷大的直线和平面方程,后续再改进吧. 有关于原理部分,有时间再详细写一下. #include &q ...

  7. matlab直线拟合的程序,MATLAB最小二乘法拟合直线的程序

    最小二乘法拟合直线 程序: function linear_fit %最小二乘法拟合直线clear; clc; prompt={'Name of data file'}; title='Linear_ ...

  8. 最小二乘法拟合直线——MATLAB和Qt-C++实现

    本节Jungle用C++实现最小二乘法拟合平面直线. 1.理论知识 平面直线的通用方程可以表示为 A+Bx-y=0 其中,A是直线的截距,B是直线的斜率.对于测量的二维坐标(x,y),x是精确分布的, ...

  9. python最小二乘法拟合直线

    最小二乘法的推导可参考下面这个博客,推导非常详细. https://my.oschina.net/keyven/blog/526010 首先画一个加入了噪声的散点图,函数是y=0.2x,加入噪声后如下 ...

最新文章

  1. String类常用方法(看一眼就懂)
  2. spring:《spring实战》读后感一
  3. 解析Objective-C中多态、动态类型和动态绑定
  4. Ubuntu 循环显示登录界面
  5. 服务器2003添加共享文档权限,Windows2003使用命令行设置共享权限与安全权限心得...
  6. 互联网1分钟 | 1011
  7. P3368-Frequent values【线段树】
  8. springboot-29-security(二)用户角色权限控制
  9. 【图论】Dijkstra算法解决有向图最短路问题
  10. Druid创始人Eric Tschetter详解开源实时大数据分析系统Druid
  11. 移动端一倍图,二倍图尺寸
  12. 独家深挖!F1赛车协会“刹车表现”是如何进行数据分析的?
  13. Windows 10环境下TensorFlow(gpu版本)配置教程——[图解] [详细版][零基础]
  14. 小学五年级如何引导学计算机,怎么教五年级小孩数学
  15. 关于H5闪退问题--资源优化
  16. UE4 UDP是如何进行可靠传输的
  17. oracle 导出数据 utl,oracle 使用 UTL_FILE 导出表数据到txt文件
  18. 【毕业设计】2-基于单片机控制的直流电机调速系统设计(原理图+仿真+答辩论文+答辩PPT)
  19. 【最新免费】CCNA中文注释题库精选模拟题
  20. es6转换es5 babel配置

热门文章

  1. java中关于拼音的处理。
  2. Revit二次开发——读取cad中的文字信息
  3. 工程力学笔记(1)干货!!!
  4. win7---虚拟wifi无法启动承载网络
  5. uniapp 离线打包 添加文件读写权限
  6. flask出现flash ascii中文编码的问题
  7. 一步一步在阿里云上架一个应用系统(云服务器ECS和轻量应用服务器选型)1
  8. 加一度强烈推荐:信息流广告精准投放大杀器
  9. 适用于4节锂电池串联的电动工具应用LDO-CSM5250BSD
  10. 计算机管理主分区改成逻辑分区,如何在Win7系统中将主分区更改为逻辑分区?...