就我目前了解的c++调用matlab有两种方法。
第一种是通过matlab引擎调用,也就是这里用到的方法。
第二种是用matlab将m文件编译为相应的h/lib/dll文件再加以调用。
使用engine所用到的h和lib文件基本在D:\Program Files\MATLAB\R2010b\extern里面,当然不同的机器安装的地方都不一样。
头文件只需engine.h即可。lib文件需要这三个:libmx.lib/libmat.lib/libeng.lib。至于如何配置我就不介绍了,方法很多。
引擎相应的部分函数如下:
engOpen:启动Matlab引擎
engClose:关闭Matlab引擎
engGetArray:从Matlab引擎中获得一个Matlab矩阵,用于数据交换
engPutArray:从应用程序向Matlab引擎发送一个Matlab矩阵,用于数据交换
engEvalString:执行一个Matlab命令
engOutputBuffer:创建一个用于存储Matlab文本输出的字符缓冲区
相应例程:
#include <iostream> #include <math.h> #include "engine.h" using namespace std; void main() { Engine *ep; //定义Matlab引擎指针。 if (!(ep=engOpen(NULL))) //测试是否启动Matlab引擎成功。 { cout <<"Can't start Matlab engine!" <<endl; exit(1); } //下面是将c++格式数据转换为matlab格式可用数据 double data[4]={1.0,2.0,3.0,4.0}; mxArray *Y=mxCreateDoubleMatrix(1,4,mxREAL); memcpy(mxGetPr(Y),data,sizeof(data)); engPutVariable(ep,"Y",Y); engEvalString(ep,"plot(Y,'o')"); //显示数据 mxDestroyArray(Y); engEvalString(ep,"figure"); //开一个新的显示窗口 // //下面是从matlab格式数据转换为c++格式可用数据 // mxArray *filename=NULL; // const char *name="D:/Program Files/MATLAB/R2010b/bin/win32/lena.jpg"; // filename=mxCreateString(name); // engPutVariable(ep,"filename",filename); engEvalString(ep,"X=imread('D:/Program Files/MATLAB/R2010b/bin/win32/lena.jpg');"); //在engine中读取一张图片 engEvalString(ep,"imshow(X)"); //显示图片 mxArray *X=engGetVariable(ep,"X"); //从engine获得真正的数组X int ndims=mxGetNumberOfDimensions(X); //获得这个数组的维数 cout<<ndims<<endl; int *dims=new int[ndims]; memcpy(dims,mxGetDimensions(X),ndims*sizeof(int)); //获得数组每一维的大小 for (int i=0;i<ndims;i++) { cout<<dims[i]<<" "; } cout<<endl; /* double *p=(double*)mxGetData(X); //指向数组X的指针以便能访问数组元素,图像数据量太大,这里就不显示了 for (int i=0;i<dims[0];i++) { for (int j=0;j<dims[1];j++) { cout<<p[i*dims[1]+j]<<" "; } cout<<endl; } */ delete[] dims; mxDestroyArray(X); cout <<"good job." <<endl; cin.get(); engClose(ep); //关闭Matlab引擎。 }
由于整个环境离不开matlab,所以程序还需相应的dll文件才能运行。
matlab的结构实在复杂,所以我也不太清楚究竟需要哪些dll,我就图简单了,直接把生成的文件移到了matlab可执行目录下了。
通常是这个目录:D:\Program Files\MATLAB\R2010b\bin\win32