用最小二乘法拟合圆

Fit a Circle by Least Square Method

您好,我想通过最小二乘法找到一个圆,其中有很多点我写了这段代码,但它不起作用,也没有错误消息 (我的代码有一个函数是 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; 
}  

很奇怪你的代码没有崩溃。

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.: 对不起我的英语不好