engbp3.c

来自「《MATLAB实用指南》系列丛书DE源代码」· C语言 代码 · 共 85 行

C
85
字号
/////////////  头文件
#include "engine.h"
#include "stdio.h"
#include "conio.h"
#include "string.h"
////////////////////// C程序
int main()
{

FILE *fp0,*fp1;
int i,j,s0,s1,s2,s3,n,n0,ts; 
char *DataFile,*Fss,*Fout;
double lr,mc;
mxArray *S,*p,*t,*a,*Lr,*Mc,*Ts;
Engine *ep;

DataFile="J6.txt"; ///////////////////////////////////输入文件名
if((fp0=fopen(DataFile,"r"))==NULL){printf(" Can't open OutPutfile\n");exit(0);}
Fout=strdup(DataFile);Fss="-r.txt";strcat(Fout,Fss);
if((fp1=fopen(Fout,"w"))==NULL){printf(" Can't open OutPutfile\n");exit(0);}

S=mxCreateDoubleMatrix(1,3,mxREAL);
Lr=mxCreateDoubleMatrix(1,1,mxREAL);
Mc=mxCreateDoubleMatrix(1,1,mxREAL);
Ts=mxCreateDoubleMatrix(1,1,mxREAL);
fscanf(fp0,"%d%d%d%d%d%d%lf%lf%d",&n,&n0,&s0,&s1,&s2,&s3,&lr,&mc,&ts);
//////////////////将网络控制参数赋给mxArray矩阵:S
*(mxGetPr(S)+0)=(double)s1; *(mxGetPr(S)+1)=(double)s2; 
*(mxGetPr(S)+2)=(double)s3; //*(mxGetPr(S)+3)=(double)s3; 
*(mxGetPr(Lr))=(double)lr;  *(mxGetPr(Mc))=(double)mc;  *(mxGetPr(Ts))=(double)ts; 
p=mxCreateDoubleMatrix(s0,n,mxREAL); 
t=mxCreateDoubleMatrix(s0,n,mxREAL);

///////////////////输入样本与目标向量并赋给mxArray矩阵:p&t
for(j=0;j<n;j++){
	for(i=0;i<s0;i++)fscanf(fp0,"%lf",(mxGetPr(p)+j*s0+i));
	for(i=0;i<s3;i++)fscanf(fp0,"%lf",(mxGetPr(t)+j*s0+i));
}   n=n0; 
//////////////////////////输入预测
fscanf(fp0,"%d",&n);a=mxCreateDoubleMatrix(s3,n,mxREAL); 
for(j=0;j<n;j++)for(i=0;i<s0;i++)fscanf(fp0,"%lf",(mxGetPr(a)+j*s3+i));

//////////////打开引擎
if((ep=engOpen(NULL))==NULL){printf("\nCan't Open Matlab engine\n");exit(0);}
///////////// 通过引擎库函数调用Matlab命令
engPutVariable(ep,"ep_p",p);  ////将学习样本置入引擎空间
engPutVariable(ep,"ep_t",t);  ////将目标样本置入引擎空
engPutVariable(ep,"ep_a",a);  ////将预测样本置入引擎空间
engPutVariable(ep,"ep_S",S);  ////将相关网络参数置入引擎空间
engPutVariable(ep,"ep_Lr",Lr); 
engPutVariable(ep,"ep_Mc",Mc); 
engPutVariable(ep,"ep_Ts",Ts); 

engEvalString(ep,"net=newff(minmax(ep_p),ep_S,{'logsig','logsig','purelin'},'traingdm');"); ///构造BP网络
engEvalString(ep,"net.trainParam.show=200;");    ///回显一次所经过的计算时步
engEvalString(ep,"net.trainParam.lr=ep_Lr;");    ///学习率
engEvalString(ep,"net.trainParam.mc=ep_Mc;");    ///动量项
engEvalString(ep,"net.trainParam.epochs=ep_Ts;");///预定时步
engEvalString(ep,"net.trainParam.goal=1e-5;");   ///训练要求精度
engEvalString(ep,"net.trainParam.time=inf;");    ///无训练时间限制 
engEvalString(ep,"[net,tr]=train(net,ep_p,ep_t);");  ///训练网络

engEvalString(ep,"ep_b=sim(net,ep_a);");   /////////////样本预测

printf("\nPress anykey to plot\n"); getch(); ////////////作预测曲线
engEvalString(ep,"ep_x=(10.0).^ep_a; ep_y=(10.0).^ep_b;");
engEvalString(ep,"plot(ep_x,ep_y);");       
engEvalString(ep,"xlabel('Date/d');");
engEvalString(ep,"ylabel('Displacement/mm');");

///////////////////////////////预测结果返回
printf("\nPress anykey to return and engClose \n"); getch();
for(i=0;i<n;i++)fprintf(fp1," %3d %12.4lf   %12.4lf  \n",
	i,*(mxGetPr(engGetVariable(ep,"ep_x"))+i),*(mxGetPr(engGetVariable(ep,"ep_y"))+i));

///////////  关闭引擎
if(engClose(ep)!=0){printf("\nCan't close Matlab engine normally\n");exit(-1);}
printf("\n Matlab engine is over\n");
////////// 将Matlab引擎计算结果输出
////////// 释放内存
mxDestroyArray(p);  mxDestroyArray(t);   mxDestroyArray(a);   mxDestroyArray(S); 
mxDestroyArray(Lr); mxDestroyArray(Mc);  mxDestroyArray(Ts);
fclose(fp0); fclose(fp1);    /// 关闭文件
return 0;}
/////////////////结束

⌨️ 快捷键说明

复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?