用最小二乘法拟合圆

时间:2016-05-18 11:47:56

标签: c++ least-squares

嗨我想找到一个最小二乘法的圆圈,我写了很多代码,但是它没有工作,也没有错误信息 (我的代码有一个函数,FittingCircle我认为我的函数(FittingCircle)是错的但是我找不到我的错误)

谢谢您的好评

  #include <iostream>
#include <iostream> 
#include <stdlib.h> 
#include <math.h> 

#define A(i,j) A[i + j * 3] 
using namespace std; 
bool FittingCircle(double* A, double* B) 
{ 

    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; 
} 
int main(int argc, char** argv) { 
    double matris[3]={25,30,50}; 
    double matris2[3]={40,25,50}; 

    FittingCircle(matris,matris2); 
    return 0; 
}  

1 个答案:

答案 0 :(得分:0)

奇怪您的代码不会崩溃。

FittingCircle()的第一个参数是double指针,但用作矩阵(通过#define A(i,j) A[i + j * 3]

因此,阅读A(2,2),您在A[2 + 2 * 3]中读到,即A[8]

但是传递给FittingCircle()的第一个参数是

double matris[3]={25,30,50};

当您在A[8]中阅读时,请阅读matris[8]

非常非常危险且未定义的行为。

p.s:抱歉我的英语不好。