您的位置:首页 > 理论基础 > 计算机网络

BP神经网络,C++调用matlab engine

2015-05-27 15:26 232 查看
首先吐槽一下CSDN这个能活活把人恶心死的文章编辑器。        前几天用BP神经网络做了一个手写体数字识别的小实验,因为界面是C++写的,训练BP网络是在MATLAB上做的。就像偷个懒看看C++能不能直接调用MATLAB的神经网络工具箱。        最早采用的方案是用MATLAB控制台把写好的.m文件编译成DLL。但是遇到一个比较大的问题:编译出来的DLL,需要传递的参数类型为mwArray,我不知道怎么将保存到本地的训练好的网络读取成mwArray。查了查资料也没有什么好的解决方案,所以这个方案暂时搁置。烦请各位路过的大神指点一二。        最后拿来凑合的方案是直接调用matlab engine,然后直接在C++中调用神经网络工具箱的sim()函数解决战斗。下面我详细讲一下过程。        首先是环境变量的配置,我使用的是MATLAB 2010b,安装在D盘。以我自己的电脑为例,在安装MATLAB的时候环境变量已经配置好了D:\Program Files\MATLAB\R2010b\bin这一项。不过需要注意的是,如果你的系统是64位的,并且使用的MATLAB版本较高(好像是高于7.0就会出问题),那么在最后运行C++程序时会提示丢失libmx.dll文件。这是由于libmx.dll文件在matlab的版本更迭中被移动过位置,现在他的位置其实在\bin\win64这个目录下,只在环境变量中添加\bin这一项是不能找到这个文件的。所以你需要在系统环境变量中另外加上一条D:\ProgramFiles\MATLAB\R2010b\bin\win64。这样就OK了。        然后是C++工程的配置,右击项目然后选择属性。配置属性->VC++目录选项卡,这里我们需要修改两个位置。在“包含目录”中添加“D:\ProgramFiles\MATLAB\R2010b\extern\include”。然后在库目录中添加D”:\Program Files\MATLAB\R2010b\extern\lib\win32\microsoft“,64位的系统别忘了另外添加“D:\Program Files\MATLAB\R2010b\extern\lib\win64\microsoft”。        到这里还没完,在配置属性->链接器->输入中,我们在附加依赖项中添加mclmcrrt.liblibmat.liblibmx.liblibmex.liblibeng.lib这样就OK了,配置工作就此完成。说一下MATLAB engine的简单应用:1)matlab engine的初始化
Engine *ep; //定义Matlab引擎指针。
if (!(ep=engOpen(NULL))) //测试是否启动Matlab引擎成功。
{
cout <<"Can't start Matlab engine!" <<endl;
exit(1);
}
2)给matlab engine添加一个输出缓冲区(这样就可以在C++中查看matlab控制台的输出)char engBuffer[256] = {'\0'};engOutputBuffer(ep, engBuffer, MAX_PATH);3)向matlab engine添加数据
engPutVariable(ep,"img",img);	//其中输入的img的数据的类型是mxArray
4)顺便说个将openCV中的Mat实例传输到matlab engine中的办法
mxArray *img;// = mxCreateDoubleMatrix(70, 50, mxCOMPLEX);UINT8 *input = NULL;mwSize dims[2] = {70, 50};img = mxCreateNumericArray(2, dims, mxUINT8_CLASS, mxREAL);input = (UINT8 *)mxGetData(img);for (int i = 0; i < 70; i++){for (int j = 0; j < 50; j++){input[j*70 + i] =  (* image.row(i).col(j).data);}}engPutVariable(ep,"img",img);
其中image为unsigned char类型的Mat。5)命令matlab engine执行命令
engEvalString(ep,"an=sim(net,test_data);");
6)从matlab engine中取得变量的数据,以double数组为例
mxArray *ans;double * pAns = (double *)malloc(sizeof(int)*num);ans = engGetVariable(ep,"index");memcpy((double *) pAns,(double *) mxGetPr(ans),sizeof(mxGetPr(ans))*num);
7)关闭engine
engClose(ep); //关闭Matlab引擎。
需要额外注意的是,如果给matlab engine关联了输出缓冲区,记得在关闭engine之前释放,不然会栈损坏。mxArray也需要手动释放内存,切记切记。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息