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 + -
显示快捷键?