线性最小二乘法圆在C或C ++中的拟合 [英] Linear least squares circle fit in C or C++
本文介绍了线性最小二乘法圆在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
中的解决方案.计算Xc
,Yc
,R
,就完成了.不需要库.最小二乘圆拟合
没什么难翻译的.
毫不奇怪,Google具有 ^ ].
Anyone aware of C/C++ code to fit a circle to a set of 2d datapoints using the linear least squares method as described by I.D.Coope?
Ron H.
解决方案
You can do-it-yourself from this:
- use a 3x3 arrayA
and a 3x1 vectorB
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 inB
. ComputeXc
,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屋!
查看全文