急求,没有赋值,值就自动变了
有两个问题:1是,程序执行到这里时,没有进入循环,
for (i=0;i<n;i++)
{
tw1=1.0/m_ModelSurV[i]+Z_Inc[i];
m_ModelSurV[i]=(float)tw1;
}
m_ModelSurV的值会自动改变,这是为什么?
然后,我故意加上赋值语句,tw1=1.02f;发现赋值前,m_ModelSurV的值就变了。
2是,delete []Z_Inc;执行这句,就报错。调试时,提示内容“User breakpoint called from code at 0x7c921230”。但是前面已经double *Z_Inc;//模型的增量
Z_Inc=new double [n];
申请了这段空间,为什么不行呢?
代码如下:
void CRSBonMView::OnModelV1()
{
// TODO: Add your command handler code here
//1.先读出初至时间文件中读出实际时间(即实际时间),放在m_FBP中
CFileDialog pFileOpenDlg(TRUE,NULL,NULL,NULL,"TXT file(*.txt)|*.txt|All Files(*.*)|*.*||");
CString strPathName;
FILE *fp;
int i_line=0;//文件行数,也即射线条数,也是距阵的行数,
//需注意的是,通常由于最后回车,读出的行数比实际需要的多了一行,应减去
struct FirstBreakTime myfbt;
char c;
if(pFileOpenDlg.DoModal()==IDOK)
{
strPathName=pFileOpenDlg.GetPathName();
if ((fp=fopen(strPathName, "r")) == NULL)
{
MessageBox("Can not open %s file.\n", strPathName);
return;
}
else
{
while (!feof(fp))
{
fscanf (fp,"%f%c%f%c%f",&myfbt.ShotID,&c,&myfbt.ReceiverID,&c,&myfbt.time);
m_FBT.Add (myfbt);
i_line++;
}
i_line=i_line-1;//通常由于最后回车,读出的行数比实际需要的多了一行,应减去
m_FBT.RemoveAt (m_FBT.GetSize ()-1);
}
}
else
{
MessageBox ("没有输入初至文件!");
return;
}
//2.根据初始模型,计算初至时间
int i;//用于循环
int m,n;//用于矩阵的行和列
m=m_FBT.GetSize ();
n=int(m_XIDMax-m_XIDMin);
double *t_time,*e_time;//t_time存放FindTraceTime返回的时间,也就是模型的初至时间
//e_time存放的旅行时的残差,
t_time=new double[m];
e_time=new double[m];
double **Jacobian;//雅可比矩阵,m*n
Jacobian=(double **)new double *[m];
for (i=0;i<m;i++)
{
Jacobian[i]=new double [n];
}
double **JacobianT;//临时的雅可比矩阵的转置,n*m
JacobianT=(double **)new double *[n];
for (i=0;i<n;i++)
{
JacobianT[i]=new double [m];
}
double *tJa;
tJa=new double [m*n];
double *Z_Inc;//模型的增量
Z_Inc=new double [n];
m_ModelSurV=new float[n];
for(i=0;i<n;i++)
{
m_ModelSurV[i]=400.0f;
}
float emax=100.0;
float e=0.02f;//e是循环终止标准
int CycNum=0;
BOOL tflag=TRUE;
Engine *ep;
if (!(ep=engOpen(NULL)))
{
MessageBox("不能打来Matlab引擎,返回!");
return;
}
mxArray *Ja=mxCreateDoubleMatrix(m,n,mxREAL);//传递的Jacobian矩阵
mxArray *etime=mxCreateDoubleMatrix(m,1,mxREAL);//传递的残差矩阵
float tshot,trece;
//while (TRUE==tflag)
while (1)
{
tflag=FALSE;
for (i=0;i<m;i++)
{
tshot=m_FBT[i].ShotID;
trece=m_FBT[i].ReceiverID;
t_time[i]=FindTraceTime(tshot,trece,m_ModelSurV,m_RefV,m_RefElve);
e_time[i]=(m_FBT[i].time-t_time[i])*0.001f;//
}
emax=FindEMax(e_time,m)*1000.0f;
if(emax<e)
{
break;
}
else
{
CycNum++;
for (i=0;i<m;i++)
{
FillV1Jac(m_FBT[i].ShotID,m_FBT[i].ReceiverID,m_ModelSurV,m_RefV,m_RefElve,Jacobian[i]);
}
/*******下面把Jacobian矩阵传递给matlab*******/
MatrixTrans(Jacobian,JacobianT,m,n);
for (int i=0;i<n;i++)
{
for (int j=0;j<m;j++)
{
tJa[i*m+j]=JacobianT[i][j];//秒和毫秒之间的单位转换
}
}
delete []JacobianT;
memcpy(mxGetPr(Ja),tJa,m*n*sizeof(double));
delete []tJa;
engPutVariable(ep,"Ja",Ja);
memcpy(mxGetPr(etime),e_time,m*sizeof(double));
engPutVariable(ep,"etime",etime);
engEvalString(ep,"JaNew=Ja'*Ja");
engEvalString(ep,"eNew=Ja'*etime");
engEvalString(ep,"a=inv(JaNew)");
engEvalString(ep,"x=a*eNew");
mxArray *x=engGetVariable(ep,"x");
memcpy(Z_Inc,mxGetPr(x),m*sizeof(double));
/*********矩阵传递,结束,模型的增量存在数组Z_Inc中*********************/
double tw1;
//程序执行到这里时,m_ModelSurV的值会自动改变,这是为什么?
tw1=1.02f;
for (i=0;i<n;i++)
{
tw1=1.0/m_ModelSurV[i]+Z_Inc[i];
m_ModelSurV[i]=(float)tw1;
}
}
}
//delete []Z_Inc;执行这句,就报错。调试时,提示内容“User breakpoint called from code at 0x7c921230”
// delete []Z_Inc;
delete []JacobianT;
delete []tJa;
FILE *wfp;
if ((wfp=fopen("RealV1.txt", "w")) == NULL)
{
MessageBox ("Can not open file RealV1.txt!");
return;
}
else
{
for (int i=0;i<n;i++)
{
fprintf(wfp, "%8.6f\n",m_ModelSurV[i]);
}
fclose (wfp);
MessageBox("写文件RealV1.txt结束!");
}
CString str;
str.Format ("CycNum=%d",CycNum);
MessageBox(str);
if (CycNum>0)
{
mxDestroyArray(Ja);
mxDestroyArray(etime);
}
engClose(ep);
}