C++ Eigen 线性回归(最小二乘法、牛顿法)

代码:

#include "stdafx.h"
#include <iostream>
#include <Dense>
using namespace std;
using namespace Eigen;

MatrixXd newton(MatrixXd, MatrixXd, int, float, float);
MatrixXd least_squre(MatrixXd, MatrixXd);
int get_min_m(MatrixXd, MatrixXd, float, float, MatrixXd, MatrixXd, MatrixXd);
MatrixXd get_error(Matrix<double, -1, -1>, Matrix<double, -1, -1>, MatrixXd);
MatrixXd first_derivative(MatrixXd, MatrixXd, MatrixXd);
MatrixXd second_derivative(MatrixXd);
int main()
{
   
	MatrixXd feature(5,3);
	feature <<
		1, 1, 1,
		1, 2, 3,
		1, 4, 1,
		1, 5, 6,
		1, 3, 
  • 2
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
使用Eigen实现最小二乘法拟合圆的步骤如下: 1. 定义数据点数组和目标变量数组。 ```c++ #include <Eigen/Dense> using namespace Eigen; int main() { // 定义数据点和目标变量 MatrixXd data(2, n); // 2维数据点,共n个点 VectorXd b(n); // 目标变量 // 将数据点和目标变量赋值 // ... } ``` 2. 构造设计矩阵。 ```c++ // 构造设计矩阵 MatrixXd A(n, 3); for (int i = 0; i < n; i++) { double x = data(0, i); double y = data(1, i); A(i, 0) = x * x; A(i, 1) = y * y; A(i, 2) = x * y; } ``` 3. 使用最小二乘法求解系数。 ```c++ // 求解系数 VectorXd x = A.bdcSvd(ComputeThinU | ComputeThinV).solve(b); ``` 4. 根据系数计算圆的参数。 ```c++ // 计算圆的参数 double a = x(0); double b = x(1); double c = x(2); double xc = b / (2 * c); double yc = a / (2 * c); double r = sqrt((a * b - c * c) / c); ``` 完整代码如下: ```c++ #include <Eigen/Dense> #include <iostream> using namespace Eigen; int main() { // 定义数据点和目标变量 int n = 10; MatrixXd data(2, n); VectorXd b(n); data << 0.5, 1.2, 2.0, 3.6, 4.1, 4.9, 5.5, 6.3, 7.0, 8.4, 0.9, 2.2, 3.6, 5.2, 4.8, 6.2, 7.4, 8.1, 9.0, 10.0; b << 1.2, 2.1, 3.7, 4.7, 5.5, 6.3, 7.4, 8.1, 9.0, 10.1; // 构造设计矩阵 MatrixXd A(n, 3); for (int i = 0; i < n; i++) { double x = data(0, i); double y = data(1, i); A(i, 0) = x * x; A(i, 1) = y * y; A(i, 2) = x * y; } // 求解系数 VectorXd x = A.bdcSvd(ComputeThinU | ComputeThinV).solve(b); // 计算圆的参数 double a = x(0); double b = x(1); double c = x(2); double xc = b / (2 * c); double yc = a / (2 * c); double r = sqrt((a * b - c * c) / c); // 输出结果 std::cout << "Center: (" << xc << ", " << yc << ")\n"; std::cout << "Radius: " << r << std::endl; return 0; } ```

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值