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的数据的类型是mxArray4)顺便说个将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也需要手动释放内存,切记切记。
相关文章推荐
- c++调用matlab engine方法
- windows下C++如何调用matlab程序
- MATLAB调用C/C++编写的文件,例 .dll .mexw64等
- vc调用matlab生成的C++dll库总结。
- MATLAB调用C++程序
- 混合编程---c++调用matlab生成的dll----findCircles的应用
- Matlab与C/C++联合编程之Matlab以MEX方式调用C/C++代码(二)
- MacOSX下C++调用Matlab
- c++调用matlab程序
- WIN8.1下Qt调用MATLAB engine
- Visual Studio 2010中的C++程序调用matlab程序代码 混合编程
- Matlab与C/C++联合编程之Matlab以MEX方式调用C代码(五)完整过程加示
- windows系统下C++调用matlab程序的方法详解
- Matlab调用C++代码的具体mex实现详解
- Matlab与C/C++联合编程之Matlab以MEX方式调用C/C++代码(四)
- 介绍了webkit到webengine的和webengine中js和C++互相调用的方法
- C++和Matlab混合编程——MATLAB调用c++函数(以svmlight为例)
- matlab与c/c++混合编程——c/c++调用matlab
- Matlab调用OpenCV(C++)程序
- [置顶] 如何在c++ / opencv 中调用matlab 的图像数据