如何初始化和定义指向指针 2D 数组的指针
how to initialize and define pointer to pointer 2D array?
我对C程序很陌生。我有一个这样的函数:
void lfit( float x[], float y[], float sig[], int ndat, float a[], int ia[], int ma,float **covar, float *chisq, float (*funcs)(float, float [], int))
//Given a set of data points x[1..ndat], y[1..ndat] with individual standard deviations
//sig[1..ndat], use χ2 minimization to fit for some or all of the coefficients a[1..ma] of
//a function that depends linearly on a, y =i ai × afunci(x). The input array ia[1..ma]
//indicates by nonzero entries those components of a that should be fitted for, and by zero entries
//those components that should be held fixed at their input values. The program returns values
//for a[1..ma], χ2 = chisq, and the covariance matrix covar[1..ma][1..ma]. (Parameters
//held fixed will return zero covariances.)Th e user supplies a routine funcs(x,afunc,ma) that
//returns the ma basis functions evaluated at x = x in the array afunc[1..ma].
{
void gaussj(float **a, int n, float **b, int m);
int i,j,k,l,m,mfit=0;
float ym,wt,sum,sig2i,**beta, *afunc;
afunc=vector(1,ma);
beta=matrix(1,ma,1,1);
for (j=1;j<=ma;j++)
if (ia[j])
mfit++;
if (mfit == 0)
nrerror("lfit: no parameters to be fitted");
for (j=1;j<=mfit;j++) { //Initialize the (symmetric)matrix.
for (k=1;k<=mfit;k++)
covar[j][k]=0.0;
beta[j][1]=0.0;
}
for (i=0;i<ndat;i++) { //Loop over data to accumulate coefficients of the normal equations.
(*funcs)(x[i], afunc ,ma);
ym=y[i];
if (mfit < ma) { //Subtract off dependences on known pieces of the fitting function.
for (j=1;j<=ma;j++)
if (!ia[j])
ym -= a[j]*afunc[j];
}
sig2i=1.0/SQR(sig[i]);
for (j=0,k=0,l=1;l<=ma;l++) {
if (ia[l]) {
wt=afunc[l]*sig2i;
for (j++,k=0,m=1;m<=ma;m++)
if (ia[m])
covar[j][++k] += wt*afunc[m];
beta[j][1] += ym*wt;
}
}
for (j=2;j<=mfit;j++) //Fill in above the diagonal from symmetry.
for (k=1;k<j;k++)
covar[k][j]=covar[j][k];
gaussj(covar,mfit,beta,1); //Matrix solution.
for (j=0,l=1;l<=ma;l++)
if (ia[l])
a[l]=beta[++j][1]; //Partition solution to appropriate coefficients a Evaluate χ2 of the fit.
*chisq=0.0;
for (i=1;i<=ndat;i++) {
(*funcs)(x[i], afunc,ma);
for (sum=0.0,j=1;j<=ma;j++)
sum += a[j]*afunc[j];
*chisq += SQR((y[i]-sum)/sig[i]);
}
//covsrt(covar,ma,ia,mfit); //Sort covariance matrix to true order of fitting coefficients.
free_vector(afunc,1,ma);
free_matrix(beta,1,ma,1,1);
}
}
在我想调用这个函数int main()
部分,我遇到了一些问题。 我正在编写的主要部分是这样的,例如:
int main()
{
float x1[]={100.000000f,88.00000f,76.199997f,68.599998f,54.500000f,37.599998f,26.500000f,17.000000f,8.300000f,0.900000f,-7.200000f,-17.000000f,-24.900000f,-33.799999f,-42.500000f,-51.000000f,-60.500000f,-69.500000f,-75.300003f,-83.099998f,-94.099998f,-103.000000f,-110.099998f};
float y1[]={-2.876821f,-2.788704f,-2.596228f,-2.468143f,-1.898085f,-1.296223f,-0.664981f,-0.245603f,-0.280993f,-0.094657f,-0.184912f,-0.263328f,-0.181819f,-0.132037f,-0.029368f,0.134307f,0.257734f,0.305223f,0.091159f,0.063768f,-0.163334f,-0.136314f,-0.372106f};
float sig1[]={1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1};
float a1[]={1.8f,1.6f,1.7f,1.3f};
int ia1[]={2,3,4,2};
int ma=4, ndat=23 ;
float chisq1, **covar;
lfit(x1,y1,sig1,ndat,a1,ia1,ma,covar,&chisq1, &funcs);
return 0;
}
我总是得到的错误是这样的:Run-Time Check Failure #3 - The variable 'covar' is being used without being initialized.
我尝试了不同的方法来初始化它,但没有一种有效。
你的想法是什么?我该如何解决这个问题?
我真的很感激任何帮助!
第一件事:你的数组索引必须从零开始,所以 for 循环是for(i=0; i < max; i++)
获取 2D 阵列的简单方法是:
float covar[4][4]; // Or whatever size is correct for you
如果您需要 malloc,您可以这样做:
float ** Malloc2DFloat(int x, int y)
{
float **MainArray = (float**)malloc(sizeof(float*) * x);
int i;
for (i=0; i < x; i++)
MainArray[i] = (float*)malloc(sizeof(float) * y);
return MainArray;
}
float **covar = Malloc2DFloat(4,4);
你需要在main中执行此操作,或者将指向该函数的指针传递给您的函数并将其malloc到其中:
func(float ***covar)
{
*covar = Malloc2DFloat(mfit, mfit); // Allocate like this
(*covar)[0][0] = 3.41f; // Reference it like this
}
在填满内存之前,您必须为covar
分配内存。 您可以将内存分配给lfit
函数。要做:
您必须在函数lfit
中更新输入covar
void lfit( float x[], float y[], float sig[], int ndat, float a[], int ia[], int ma,float ***covar, float *chisq, float (*funcs)(float, float [], int))
然后当你初始化矩阵时,你必须以这种方式完成
*covar = calloc(mfit,sizeof(float *));
for (j=1;j<=mfit;j++) { //Initialize the (symmetric)matrix.
(*covar)[j] = calloc(mfit,sizeof(float)); //calloc will initialize the matrix to 0
beta[j][1]=0.0;
}
而不是旧的方式
for (j=1;j<=mfit;j++) { //Initialize the (symmetric)matrix.
for (k=1;k<=mfit;k++)
covar[j][k]=0.0;
beta[j][1]=0.0;
}
以及在lfit
函数中访问covar
数据:
float x=(*covar)[j][k];
(*covar)[j][k]=5.2;
所以例如这条线
covar[j][++k] += wt*afunc[m];
应更新为
(*covar)[j][++k] += wt*afunc[m];
以及当您调用函数时lfit
lfit(x1,y1,sig1,ndat,a1,ia1,ma,&covar,&chisq1, &funcs);
相关文章:
- 如何引用 2D 指针?
- 使用双指针传递 2D 常量数组
- 使用指针算法修改函数中的 2D 数组
- 为什么将指针重新分配给 1D 数组的 char 时显示错误,但 2D 数组工作正常?
- 无法分配函数指针的 2D 数组
- 在 Arduino 中为 2D 指针数组赋值
- 删除使用 new 创建的 2D 或 3D 指针
- 如何使用指针C++将元素从2D数组复制到1D数组
- 带有空指针的指针 c++ 的 2D 数组
- 不明白使用双指针 (**) 创建 2d 动态数组
- 将 2D 数组指针传递给 C++ 中的函数
- C++ & Python:传递并返回从 python 到 c++ 的 2D 双指针数组
- 尝试理解指向具有 2d 顶点的指针的指针
- 指向 2D 数组的指针的类型是什么?
- c ++ 2d 数组和指向指针的指针 - 我不明白这段代码
- 有没有办法使用初始化到第一行的指针访问 2d 数组的第二行?
- 如何使用3D char数组调整双指针2D char阵列的大小
- 如何初始化和定义指向指针 2D 数组的指针
- 在mex函数中返回双指针2D矩阵
- 指向作为输入参数的指针(2D数组)的指针