【发布时间】:2011-03-02 15:54:09
【问题描述】:
我正在尝试将收集的数据拟合到多项式方程中,并从 Numerical Recipes 中找到了 lfit 函数。我只能访问第二版,所以我正在使用它。
我已经阅读了lfit 函数及其参数,其中一个是函数指针,在文档中以
void (*funcs)(float, float [], int))
在帮助下
用户提供一个例程 funcs(x,afunc,ma),它返回数组 afunc[1..ma] 中在 x = x 处计算的 ma 基函数。
我很难理解这个lfit 函数是如何工作的。我找到的一个示例函数如下:
void fpoly(float x, float p[], int np)
/*Fitting routine for a polynomial of degree np-1, with coefficients in the array p[1..np].*/
{
int j;
p[1]=1.0;
for (j=2;j<=np;j++)
p[j]=p[j-1]*x;
}
当我在 gdb 中运行 lfit 函数的源代码时,我看不到对 funcs 指针的引用。当我尝试使用该函数拟合一个简单的数据集时,我收到以下错误消息。
Numerical Recipes run-time error... gaussj: Singular Matrix ...now exiting to system...
很明显,一个矩阵被定义为全零。
我将在一个大循环中涉及这个函数,所以使用另一种语言并不是一个真正的选择。因此,为什么我打算使用 C/C++。
供参考,这里给出测试程序:
int main()
{
float x[5] = {0., 0., 1., 2., 3.};
float y[5] = {0., 0., 1.2, 3.9, 7.5};
float sig[5] = {1., 1., 1., 1., 1.};
int ndat = 4;
int ma = 4; /* parameters in equation */
float a[5] = {1, 1, 1, 0.1, 1.5};
int ia[5] = {1, 1, 1, 1, 1};
float **covar = matrix(1, ma, 1, ma);
float chisq = 0;
lfit(x,y,sig,ndat,a,ia,ma,covar,&chisq,fpoly);
printf("%f\n", chisq);
free_matrix(covar, 1, ma, 1, ma);
return 0;
}
同样令人困惑的问题是,所有数值配方函数都是 1 个数组索引的,所以如果有人对我的数组声明有更正,请告诉我!
干杯
编辑:好的,刚刚发现了这个问题。
在复制数字配方代码时,我不小心注释掉了一些真实的代码,以为它只是一个注释。我不再得到奇异值错误
【问题讨论】:
标签: c++ function-pointers