C++ 最小二乘法 直线拟合、曲线拟合、平面拟合、高斯拟合

article/2025/11/8 2:13:21

本节介绍如何用Eigen求解线性最小二乘方程组。求解Ax=b的最小二乘问题,等价于求解方程

 使用Eigen的求解的代码如下:

    Eigen::MatrixXd MatX;//样本数据Eigen::MatrixXd MatY;//观测值Eigen::MatrixXd MatLS;//待定系数MatLS = (MatX.transpose() * MatX).inverse() * MatX.transpose() * MatY;

 直线拟合:

直线方程:y = k*x + b

//y = k*x + b
void least_square_line(double input[][2], int number, double&k, double&b){Eigen::MatrixXd MatX;Eigen::MatrixXd MatY;MatX.resize(number, 2);MatY.resize(number, 1);Eigen::MatrixXd MatLS;MatLS.resize(number, 1);for(int i = 0; i < number; ++i){MatX.row(i) = Eigen::Vector2d(input[i][0], 1);MatY(i, 0) = input[i][1];}MatLS = (MatX.transpose()*MatX).inverse()*MatX.transpose()*MatY;//MatLS = MatX.colPivHouseholderQr().solve(MatY); //也可以用k = MatLS(0,0);b = MatLS(1,0);
}

曲线拟合:

 多项式方程:Pn(x)=a(n)x^n+a(n-1)x^(n-1)+…+a(1)x+a(0)

//y = a0 + a1*x + a2*x*x + a3*x*x*x + a4*x*x*x*x + a5*x*x*x*x*x;
void least_square_curve(double input[][2], int number, int jie, std::vector<double>&weight){Eigen::MatrixXd MatX;Eigen::MatrixXd MatY;MatX.resize(number, jie);MatY.resize(number, 1);Eigen::MatrixXd MatLS;MatLS.resize(number, 1);for(int i = 0; i < number; ++i){std::vector<double> pows;for(int j = 0; j < jie; j++){double p =  pow(input[i][0], j);MatX(i, j) = p;}MatY.row(i)[0] = input[i][1];}MatLS = (MatX.transpose()*MatX).inverse()*MatX.transpose()*MatY;for(int i = 0; i < jie; i++)weight.push_back(MatLS(i, 0)) ;
}

3阶多项式

5阶多项式:

7阶多项式:

平面拟合: 

 平面方程:Ax+By+Cz+D=0


//z = A*x + B*y + C
void Least_squares_plane(double input[][3], int number, double& A, double& B, double& C)
{Eigen::MatrixXd MatX;Eigen::MatrixXd MatY;MatX.resize(number, 3);MatY.resize(number, 1);Eigen::MatrixXd MatLS;MatLS.resize(number, 1);for (int i = 0; i < number; ++i) {MatX.row(i) = Eigen::RowVector3d(input[i][0], input[i][1],1);MatY.row(i)[0] = input[i][2];}MatLS = (MatX.transpose() * MatX).inverse() * MatX.transpose() * MatY;A = MatLS(0, 0);B = MatLS(1, 0);C = MatLS(2, 0);}

以该3D模型的每个三角形面片的顶点为观测数据:

拟合的平面如下:

高斯拟合:

 高斯函数

 

//ln(z) = A + B*x + C*y + D*x*x + E*y*y
//z = exp(A + B*x + C*y + D*x*x + E*y*y)
void Least_squares_gaussian(double input[][3], int number, double& A, double& B, double& C, double& D, double& E)
{Eigen::MatrixXd MatX;Eigen::MatrixXd MatY;MatX.resize(number, 5);MatY.resize(number, 1);Eigen::MatrixXd MatLS;MatLS.resize(number, 1);for (int i = 0; i < number; ++i) {Eigen::Matrix<double, 5, 1> row;row << 1 , input[i][0] , input[i][1] , input[i][0] * input[i][0] , input[i][1] * input[i][1];MatX.row(i) = row;MatY.row(i)[0] = log(input[i][2]);}MatLS = (MatX.transpose() * MatX).inverse() * MatX.transpose() * MatY;A = MatLS(0, 0);B = MatLS(1, 0);C = MatLS(2, 0);D = MatLS(3, 0);E = MatLS(4, 0);
}

同样以该3D模型的顶点为观测数据

拟合高斯面如下:


http://chatgpt.dhexx.cn/article/vQwNNCNF.shtml

相关文章

C语言直线拟合函数

直线拟合算法 函数说明&#xff1a; 通过一些点拟合出一条直线。 参数&#xff1a; pt_input 指向传入的点的指针。 ptNumbers 传入的点数量。 k 指向拟合直线参数k的指针。 b 指向拟合直线参数b的指针。 返回值&#xff1a; 返回一个代数值判断拟合是否成功。如果成功…

用RANSAC算法实现干扰严重的直线拟合~

1.说到直线拟合&#xff0c;一般是用最小二乘啦&#xff0c;在opencv里面就是用cv.fitLine来完成&#xff0c;首先简单介绍一下该函数&#xff1a; cv.fitLine(points, distType, param, reps, aeps[, line]) -> line points&#xff1a;点集坐标 distType&#xff1a;距…

RANSAC直线拟合和最小二乘直线拟合的简单介绍

RANSAC是“RANdom SAmple Consensus&#xff08;随机抽样一致&#xff09;”的缩写。它可以从一组包含“局外点”的观测数据集中&#xff0c;通过迭代方式估计数学模型的参数。它是一种不确定的算法——它有一定的概率得出一个合理的结果&#xff1b;为了提高概率必须提高迭代次…

RANSAC三维直线拟合

RANSAC算法 &#xff08;1&#xff09;要得到一个直线模型&#xff0c;需要两个点唯一确定一个直线方程。所以第一步随机选择两个点&#xff1b; &#xff08;2&#xff09;通过这两个点&#xff0c;可以计算出这两个点所表示的模型方程&#xff1b; &#xff08;3&#xff09…

二维直线拟合--opencv实现

二维/三维直线拟合–opencv实现 ​ Hough变换可以提取图像中的直线&#xff0c;但是提取线的精度不高&#xff0c;然而我们的很多场合下需要精确估计直线的参数&#xff0c;这时就需要进行直线拟合。 ​ 直线拟合的方法有很多&#xff0c;比如&#xff1a;一元线性回归就是一…

直线拟合最小二乘法

数据 x(1,2,3,4,5) y (1,1.5,3,4.5,5) 算法结果 R语言运行结果 算法原理 x的均值&#xff1a; xpsum&#xff08;x1x2x3…xn&#xff09;/n y的均值 : ypsum&#xff08;y1y2y3…yn&#xff09;/n x的平方差之和&#xff1a; lxxsum( (xi-xp) ^ 2 ) 协方差之和 lxy…

直线生成以及pcl直线拟合

目录 写在前面codecompile&run result参考 写在前面 1、本文内容 pcl直线拟合&#xff0c;生成带噪声的直线并进行直线拟合的demo 2、平台 windows, pcl1.10.0 3、转载请注明出处&#xff1a; https://blog.csdn.net/qq_41102371/article/details/127147223 code line_…

opencv 直线拟合

一、话说直线拟合 霍夫直线检测容易受到线段形状与噪声的干扰而失真&#xff0c;这个时候我们需要另辟蹊径&#xff0c;通过对图像进行二值分析&#xff0c;提取骨架&#xff0c;对骨架像素点拟合生成直线&#xff0c;这种做法在一些场景下非常有效&#xff0c;而且效果还比较…

拟合算法之一 直线拟合

直线拟合 很早就想学习拟合了&#xff0c;经常听同事用到拟合&#xff0c;当时尚且一窍不通&#xff0c;必须快递加急紧追此处才是&#xff0c;也参考了网上大佬的一些宝贵经验&#xff0c;先将拟合方法总结如下&#xff1a; 最小二乘法 1.原理 2.举例实现 void fitline3(…

直线拟合问题(Python实现)

程序如下&#xff1a; import matplotlib.pyplot as plt import numpy as npx_list [466, 741, 950, 1422, 1634] y_list [7.04, 4.28, 3.40, 2.54, 2.13] # x_list [0, 1, 3, 5] # y_list [1, 2, 4, 8]l_mat11 len(x_list) l_mat12 l_mat21 sum(x for x in x_list) l_…

OpenCV直线拟合检测

点击上方“小白学视觉”&#xff0c;选择加"星标"或“置顶” 重磅干货&#xff0c;第一时间送达本文转自&#xff1a;opencv学堂 OpenCV直线拟合检测 霍夫直线检测容易受到线段形状与噪声的干扰而失真&#xff0c;这个时候我们需要另辟蹊径&#xff0c;通过对图像进行…

RANSAC 直线拟合

result&#xff1a; code&#xff1a; #include "stdafx.h". #include <opencv2\opencv.hpp> #include <iostream> #include <ctime>using namespace std; using namespace cv;//生成[0,1]之间符合均匀分布的数 double uniformRandom(void) {ret…

OpenCV——直线拟合

相比于直线检测&#xff0c;直线拟合的最大特点是将所有数据只拟合出一条直线 void fitLine( InputArray points, OutputArray line, int distType,double param, double reps, double aeps ); points&#xff1a;输入待拟合直线的2D或者3D点集。line&#xff1a;输出描述直线…

直线拟合

在进行直线拟合算法中&#xff0c;一直使用最小二乘法&#xff0c;使用时间长了&#xff0c;也比较熟练了&#xff0c;但是在最近一次使用中&#xff0c;最小二乘法在拟合垂直或者接近垂直的直线时&#xff0c;效果不好&#xff1b;斜率很大&#xff0c;使用稳定性不好。查阅《…

Android 冷启动 热启动 测试

一、应用的启动 启动方式 通常来说&#xff0c;在安卓中应用的启动方式分为两种&#xff1a;冷启动和热启动。 1、冷启动&#xff1a;当启动应用时&#xff0c;后台没有该应用的进程&#xff0c;这时系统会重新创建一个新的进程分配给该应用&#xff0c;这个启动方式就是冷启动…

Spring Boot 热启动

目的&#xff1a;修改类文件可以马上编译发布&#xff0c;提高了工作效率 步骤&#xff1a; 第一步&#xff1a; 修改pom.xml <!-- 热启动 --> <dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-devtools&l…

APP冷热启动专项测试

一、冷热启动的概念 冷启动&#xff1a;当启动应用时&#xff0c;后台没有该应用的进程&#xff0c;这时系统会重新创建一个新的进程分配给该应用&#xff0c;这个启动方式就是冷启动。 热启动&#xff1a;当启动应用时&#xff0c;后台已有该应用的进程&#xff08;例&#…

嵌入式linux热启动和冷启动,使用keil判断ARM的冷启动和热启动的方法

微处理器:LPC2114 编译环境:Keil MDK V4.10 思路: 常把单片机系统的复位分为冷启动和热启动。所谓冷启动&#xff0c;也就是一般所说的上电复位&#xff0c;冷启动后片内外RAM的内容是随机的&#xff0c;通常是0x00或0xFF&#xff1b;单片机的热启动是通过外部电路给运行中的单…

Android冷启动和热启动以及冷启动优化方案

1、什么是冷启动和热启动 冷启动&#xff1a; 当启动应用时&#xff0c;后台没有该应用的进程&#xff0c;这时系统会重新创建一个新的进程分配给该应用&#xff0c;这个启动方式就是冷启动&#xff0c;也就是先实例化Application。热启动&#xff1a; 当启动应用时&#xff0…

冷启动和热启动的区别android,app冷启动和热启动的区别(详解两者定义及区别)...

介绍一下 app 冷启动和热启动方式来实现 app 秒开的效果。那么,先来看看什么叫冷启动和热启动。 冷启动:指 app 被后台杀死后,在这个状态打开 app,这种启动方式叫做冷启动。 热启动:指 app 没有被后台杀死,仍然在后台运行,通常我们再次去打开这个 app,这种启动方式叫热…