double criterion(double *para)
{
int k,i,j,col,t,s;
double shock[2],noise[5],*par,**DATA_SIM,C;
par = (double *) malloc (200*(sizeof(double)));
//Standard deviation Factors
par[0]=exp(para[0]);par[1]=exp(para[1]);
// Firt Measurement
par[3]=para[2];par[4]=1;par[5]=exp(para[3]);
// Second Measurement
par[6]=para[4];par[7]=para[5];par[8]=exp(para[6]);
//Choice Equation
par[11]=para[7];par[12]=para[8];par[13]=para[9];par[14]=para[10];
//Wage Parameters
//profile for HS
par[15]=para[11];par[16]=para[12];par[17]=para[13];
//profile for College
par[18]=para[14];par[19]=para[15];par[20]=para[16];
//First Factor
par[21]=para[17];par[22]=para[18];
//Second Factor
par[23]=1;par[24]=para[19];
//Standard deviation ME
par[25]=exp(para[20]);par[26]=exp(para[21]);
DATA_SIM = (double **) malloc(size_i*size_time*size_sim * sizeof(double *)); for (i = 0; i < size_i*size_time*size_sim; ++i) DATA_SIM[i] = (double *) malloc (size_n*(sizeof(double)));
*seed=-29;
for(s=0;s<size_sim;s++)
{
for(k=0;k<size_i;k++)
{
//Generate all Random Variables
for(i=0;i<2;i++)shock[i]=par[i]*normrdn(seed);
for(i=0;i<5;i++)noise[i]=normrdn(seed);
//id
for(t=0;t<size_time;t++)DATA_SIM[size_i*size_time*s+k*size_time+t][0]=k;
//time
for(t=0;t<size_time;t++)DATA_SIM[size_i*size_time*s+k*size_time+t][1]=t;
//Measure 1
for(t=0;t<size_time;t++)DATA_SIM[size_i*size_time*s+k*size_time+t][2]=par[3]+par[4]*shock[0] +par[5]*noise[0];
//Measure 2
for(t=0;t<size_time;t++)DATA_SIM[size_i*size_time*s+k*size_time+t][3]=par[6]+par[7]*shock[0] +par[8]*noise[1];
//Instrument
for(t=0;t<size_time;t++)DATA_SIM[size_i*size_time*s+k*size_time+t][4]=DATA[k*size_time+t][4];
//Choice
if(par[11]+par[12]*shock[0]+par[13]*shock[1]+par[14]*DATA_SIM[size_i*size_time*s+k*size_time][4]+noise[3]>0) col=1;
else col=0;
for(t=0;t<size_time;t++)DATA_SIM[size_i*size_time*s+k*size_time+t][5]=col;
// wage
if(col==0)for(t=0;t<size_time;t++)DATA_SIM[size_i*size_time*s+k*size_time+t][6]=par[15]+par[16]*(t+0.0)+par[17]*(t+0.0)*(t+0.0)+par[21]*shock[0]+par[23]*shock[1]+par[25]*normrdn(seed);
if(col==1)for(t=0;t<size_time;t++)DATA_SIM[size_i*size_time*s+k*size_time+t][6]=par[18]+par[19]*(t+0.0)+par[20]*(t+0.0)*(t+0.0)+par[22]*shock[0]+par[24]*shock[1]+par[26]*normrdn(seed);
}
}
double *Y,**X,*beta,*epsilon,var;
epsilon = (double *) malloc (size_i*size_time*size_sim*(sizeof(double)));
Y = (double *) malloc (size_i*size_time*size_sim*(sizeof(double)));
beta = (double *) malloc (100*(sizeof(double)));
X = (double **) malloc(size_i*size_time*size_sim * sizeof(double *)); for (i = 0; i < size_i*size_time*size_sim; ++i) X[i] = (double *) malloc (20*(sizeof(double)));
for(i=0;i<size_i*size_time*size_sim;i++)
{
Y[i]=DATA_SIM[i][6];
X[i][0]=1;
//college
X[i][1]=DATA_SIM[i][5];
//experience
X[i][2]=DATA_SIM[i][1];
//experience squared
X[i][3]=DATA_SIM[i][1]*DATA_SIM[i][1];
//experience college
X[i][4]=DATA_SIM[i][1]*DATA_SIM[i][5];
//experience squared college
X[i][5]=DATA_SIM[i][1]*DATA_SIM[i][1]*DATA_SIM[i][5];
//measurement
X[i][6]=DATA_SIM[i][2];
}
regression(Y,X,size_time*size_i*size_sim,7,beta);
for(i=0;i<size_i*size_time*size_sim;i++) epsilon[i]=Y[i]-beta[0]-beta[1]*X[i][1]-beta[2]*X[i][2]-beta[3]*X[i][3]-beta[4]*X[i][4]-beta[5]*X[i][15]-beta[6]*X[i][6];
var=0;for(i=0;i<size_i*size_time*size_sim;i++)var+=epsilon[i]*epsilon[i];var=var/(size_i*size_time*size_sim);
C=0;for(i=0;i<7;i++){C+=sqr(beta[i]-BETA[i]);}C+=sqr(var-BETA[7]);
return C;
for(i=0;i<size_i*size_time*size_sim;++i){free(DATA_SIM[i]);free(X[i]);}free(DATA_SIM);free(X);
free(par); free(beta);free(Y);free(epsilon);
}
我只是多次迭代这个函数,我目睹了占用的内存正在快速增长。必须有一些我没有释放的指针或变量。有人可以帮我解决这个问题。该程序只是输入参数并模拟DATA_SIM,并对该数据集进行一次回归。 size_sim = 10,size_i = 10000,size_time = 10。
在打电话给return C;
之前是否有拼写错误,或者是free
?我不确定编译器如何在不产生至少警告的情况下允许这样做。如上所述,在return语句之后释放对象的代码将永远不会运行。
这个:
C=0;for(i=0;i<7;i++){C+=sqr(beta[i]-BETA[i]);}C+=sqr(var-BETA[7]);
return C;
for(i=0;i<size_i*size_time*size_sim;++i){free(DATA_SIM[i]);free(X[i]);}free(DATA_SIM);free(X);
free(par); free(beta);free(Y);free(epsilon);