线性最小二乘法圆在C或C ++中的拟合 [英] Linear least squares circle fit in C or C++

查看:135
本文介绍了线性最小二乘法圆在C或C ++中的拟合的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

是否有人知道使用C.Coope描述的线性最小二乘法将圆形拟合到一组2d数据点的C/C ++代码?

罗恩·H.

解决方案

您可以自己动手做:

-使用3x3数组A和3x1向量B并使用纸上的公式累积法线最小二乘方程(这是一项容易的任务);

-使用此函数求解3x3系统(这是3x3对称正定义矩阵的Cholesky方法):

 布尔 Cholesky3x3(double * A,double * B)
{
#define A(i,j)A [i + j * 3]
  double 总和;
     double 对角线[ 3 ];
    Sum = A( 0  0 );
    如果(总和<  =  0 . f)返回 错误;
    Diagonal [ 0 ] = Sqrt(Sum);
    Sum = A( 0  1 );
    A( 1  0 )= Sum/Diagonal [ 0 ];
    Sum = A( 0  2 );
    A( 2  0 )= Sum/Diagonal [ 0 ];
    Sum = A( 1  1 )-A( 1 ) , 0 )* A( 1  0 );
    如果(总和<  =  0 . f)返回 错误;
    Diagonal [ 1 ] = Sqrt(Sum);
    Sum = A( 1  2 )-A( 2  0 )* A( 2  0 );
    A( 2  1 )= Sum/Diagonal [ 1 ];
    Sum = A( 2  2 )-A( 2 ) , 1 )* A( 2  1 )-A( 2  0 )* A( 0 );
    如果(总和<  =  0 . f)返回 错误;
    Diagonal [ 2 ] = Sqrt(Sum);
    Sum = B [ 0 ];
    B [ 0 ] = Sum/Diagonal [ 0 ];
    Sum = B [ 1 ]-A( 1  0 )* B [ 0 ];
    B [ 1 ] = Sum/Diagonal [ 1 ];
    Sum = B [ 2 ]-A( 2  1 )* B [ 1 ]-A( 2  0 ];
    B [ 2 ] = Sum/对角线[ 2 ];
    Sum = B [ 2 ];
    B [ 2 ] = Sum/对角线[ 2 ];
    Sum = B [ 1 ]-A( 2  1 )* B [ 2 ];
    B [ 1 ] = Sum/Diagonal [ 1 ];
    Sum = B [ 0 ]-A( 1  0 )* B [ 1 ]-A( 2  2 ];
    B [ 0 ] = Sum/Diagonal [ 0 ];
    返回 ;
} 



B中的解决方案.计算XcYcR,就完成了.不需要库.最小二乘圆拟合

没什么难翻译的.


毫不奇怪,Google具有 解决方案

You can do-it-yourself from this:

- use a 3x3 array A and a 3x1 vector B and accumulate the normal least-squares equations, using the formulas in the paper (this is an easy task);

- solve the 3x3 system using this function (this is the Cholesky method for a 3x3 symmetric positive defined matrix):

bool Cholesky3x3(double* A, double* B)
{
#define A(i,j) A[i + j * 3]
    double Sum;
    double Diagonal[3];
    Sum= A(0,0);
    if (Sum <= 0.f) return false;
    Diagonal[0]= Sqrt(Sum);
    Sum= A(0,1);
    A(1,0)= Sum / Diagonal[0];
    Sum= A(0,2);
    A(2,0)= Sum / Diagonal[0];
    Sum= A(1,1) - A(1,0) * A(1,0);
    if (Sum <= 0.f) return false;
    Diagonal[1]= Sqrt(Sum);
    Sum= A(1,2) - A(1,0) * A(2,0);
    A(2,1)= Sum / Diagonal[1];
    Sum= A(2,2) - A(2,1) * A(2,1) - A(2,0) * A(2,0);
    if (Sum <= 0.f) return false;
    Diagonal[2]= Sqrt(Sum);
    Sum= B[0];
    B[0]= Sum / Diagonal[0];
    Sum= B[1] - A(1,0) * B[0];
    B[1]= Sum / Diagonal[1];
    Sum= B[2] - A(2,1) * B[1] - A(2,0) * B[0];
    B[2]= Sum / Diagonal[2];
    Sum= B[2];
    B[2]= Sum / Diagonal[2];
    Sum= B[1] - A(2,1) * B[2];
    B[1]= Sum / Diagonal[1];
    Sum= B[0] - A(1,0) * B[1] - A(2,0) * B[2];
    B[0]= Sum / Diagonal[0];
    return true;
}



Solutions in B. Compute Xc, Yc, R, you are done. Requires no library.


Here''s a JavaScript implementation: Least-squares circle fitting

It shouldn''t be too hard to translate.


Unsurprisingly, Google has lots of suggestions[^].


这篇关于线性最小二乘法圆在C或C ++中的拟合的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆