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