首页 > 其他分享 >最小二乘法拟合圆心

最小二乘法拟合圆心

时间:2024-09-03 19:27:09浏览次数:9  
标签:std vector sumY sumX double 圆心 pCount 拟合 乘法

#include <map>
#include <vector>
#include <iostream>
#include <string>


void FitCenterByLeastSquares(std::map<int, std::vector<double>> mapPoint,
    std::vector<double> &centerP, double &radius)
{
    double sumX = 0, sumY = 0;
    double sumXX = 0, sumYY = 0, sumXY = 0;
    double sumXXX = 0, sumXXY = 0, sumXYY = 0, sumYYY = 0;

    for (std::map<int, std::vector<double>>::iterator it = mapPoint.begin(); it != mapPoint.end(); ++it)
    {
        std::vector<double> p = it->second;

        sumX += p[0];
        sumY += p[1];
        sumXX += p[0] * p[0];
        sumYY += p[1] * p[1];
        sumXY += p[0] * p[1];
        sumXXX += p[0] * p[0] * p[0];
        sumXXY += p[0] * p[0] * p[1];
        sumXYY += p[0] * p[1] * p[1];
        sumYYY += p[1] * p[1] * p[1];
    }

    int pCount = mapPoint.size();
    double M1 = pCount * sumXY - sumX * sumY;
    double M2 = pCount * sumXX - sumX * sumX;
    double M3 = pCount * (sumXXX + sumXYY) - sumX * (sumXX + sumYY);
    double M4 = pCount * sumYY - sumY * sumY;
    double M5 = pCount * (sumYYY + sumXXY) - sumY * (sumXX + sumYY);

    double a = (M1 * M5 - M3 * M4) / (M2*M4 - M1 * M1);
    double b = (M1 * M3 - M2 * M5) / (M2*M4 - M1 * M1);
    double c = -(a * sumX + b * sumY + sumXX + sumYY) / pCount;

    //圆心XY 半径
    double xCenter = -0.5*a;
    double yCenter = -0.5*b;
    radius = 0.5 * sqrt(a * a + b * b - 4 * c);
    centerP[0] = xCenter;
    centerP[1] = yCenter;
}

int main()
{
    std::vector<double> p1{ 0, 10 };
    std::vector<double> p2{ 10, 0 };
    std::vector<double> p3{ 0, -10 };
    std::vector<double> p4{ -10, 0 };
    std::map<int, std::vector<double>> mapPoints
    {
        {0, p1},
        {1, p2},
        {2, p3},
        {3, p4},
    };
    std::vector<double> centerP{ 0,0 };
    double r = 0;
    FitCenterByLeastSquares(mapPoints, centerP, r);

    return 0;
}




测试代码来自:
https://blog.csdn.net/xinjiang666/article/details/103767319

标签:std,vector,sumY,sumX,double,圆心,pCount,拟合,乘法
From: https://www.cnblogs.com/huvjie/p/18394870

相关文章

  • 超强总结,AI大模型八种解决过拟合的技巧!!
    前言当模型在训练数据上表现良好,但对未见数据的泛化效果不佳时,就会出现过拟合的现象。过拟合是机器学习中一个非常常见的问题,已有大量文献致力于研究防止过拟合的方法。下面,我将介绍八种缓解过拟合的简单方法,每种方法只需对数据、模型或学习算法进行一次修改即可。数据与其将所有数......
  • matlab中的插值与拟合(代码)
    目录1.对均匀数据的插值与拟合2.对散点数据的拟合(如ANSYSfluent导出的节点数据)1.对均匀数据的插值与拟合interp1:一维插值。这是最常用的插值函数之一,用于对一维数据进行插值。它可以执行线性插值、最近邻插值、样条插值等多种类型的插值。%已知数据点x=1:5;y......
  • Magic Gems 矩阵乘法
    //MagicGems.cpp:此文件包含"main"函数。程序执行将在此处开始并结束。///*http://oj.daimayuan.top/course/22/problem/1046题目描述Reziba拥有无限多个魔法宝石,每个魔法宝石的大小为1单元。每个魔法宝石可以被分解为m个普通宝石,每个普通宝石的大小也是1......
  • 拟合的置信区间
    目标图:图片来源:Fig.4efromArwani,RuthTheresia,etal."Stretchableionic–electronicbilayerhydrogelelectronicsenableinsitudetectionofsolid-stateepidermalbiomarkers." NatureMaterials (2024):1-8.1.数据输入假设原始数据如下:在MATLAB中,新建2个变量,......
  • GAMES102 Lecture 02 数据拟合
    Lecture02数据拟合假定:仅函数形式,一般曲线(非函数形式)后续再讲\(f:R^1\rightarrowR^1\\y=f(x)\)函数拟合问题输入:一些观察(采样)的数据点的数据点\(\{x_i,y_i\}_{i=0}^n\)输出:拟合数据点的函数\(y=f(x)\),并用于观测拟合函数的“好坏”分段线性插值函数\(y=f_1(x)\)......
  • CUDA教程之 10 掌握 CUDA 矩阵乘法:共享内存、Tile 内存合并和 Bank 冲突简介(教程含源
    介绍在使用CUDA进行GPU编程的世界中,优化性能是关键。实现此目标的最强大技术之一是使用共享内存。本博客将引导您完成使用共享内存执行矩阵乘法的CUDA程序,特别关注理解分块内存合并和存储体冲突。在本文结束时,您将牢固掌握共享内存如何显著加快您的计算速度以及如何......
  • 乘法|python矩阵基本运算(学习笔记二)
    在前述文章中,我们已经知道,python通过使用numpy模块,创建矩阵形数组至少可以采用两种方法。也即,通过array和matrix子模块分别创建,详情请参考以下链接。https://blog.csdn.net/weixin_44855046/article/details/141564179?spm=1001.2014.3001.5502进一步,上述链接指向文章也通过测......
  • 乘法逆元 + 扩展欧几里得定理/算法
    数学之乘法逆元Part1:逆元是什么一个东西的逆元,就是指在一种运算/操作下能够抵消这个东西所带来影响的东东举个例子4的加法逆元就是-4​ 2在普通乘法中的逆元就是\(2^{-1}\)而乘法逆元指的是在模意义下的乘法逆元设原式为​\(1*a\equiva\modp\)那么......
  • 粒子群算法求解多元函数拟合问题
    在一元线性回归中,我们使用最小二乘法估计出k与b,这其实就是一个求拟合函数的过程。当一元扩展到多元,我们也可以用最小二乘的思想估计出参数目录一、最小二乘法二、将最小二乘法视为最值问题1.利用有约束的fmincon函数(1)定义目标函数(2)进行求解2.利用无约束最小值函数(1)利用fminsearch......
  • 打印99乘法表
    我们的核心思想是以小化大1.先写出1的所有乘法2.设置一个变量,使得不止有1乘n3.将1的乘法放入变量中,使得1再次被循环包起来4.解决重复乘法图片中出现了两次1*4,说明刚才的表达式会有重复相乘出现重复的原因:a有1~9的数字而i也会有1~9,a*i就必然会有重复,我们需要让一个......