Mex的编译方法
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
Mex的编写方法
1、Mex的介绍
MEX文件的调用极为方便,其调用方式与MATALAB的内建函数完全相同,只需要在命令窗口内输入对应的文件名称即可。
写MEX程序其实就是写一个DLL程序,所以你可以使用C,C++,Fortran等多种编程语言来写。
编写MEX 程序的编辑器可以使用MATLAB的代码编辑器,也可使用自己的C++编辑器,如VS2008等(本文将会分别介绍这两种编写方法)。
用MATLAB的编辑器的好处是,MEX函数会加粗高亮显示,这给程序编写带来便利,可惜无法动态调试。
如用VC即可编译也可调试,比较方便。
mex的编译结果实际上就是一个带输出函数mexFunction 的dll文件,所以会用VC编写和调试dll,就会用VC编写和调试MEX程序。
1.1、MEX文件格式
#include "mex.h"
voidmexFunction( intnlhs, mxArray *plhs[],intnrhs, constmxArray *prhs[] )
{
}
四个参数分别用来输出和输入数据: nrhs、nlhs是输入、输出参数个数,prhs、plhs是输入、输出参数指针。
注意: 我们对输出和输入参数的操作都是通过指针的方式进行的。
(这点很容易理解,因为我们的计算结果是需要传递给MATLAB的,实际上我们传递的不是数据,而是指针。
MATLAB可以通过这些指针,访问内存中的数据。
)
1.2、操作输入数据
对输入数据进行操作,需要通过MEX函数mxGetPr 得到数据的指针地址。
mxGetM 和mxGetN 得到矩阵数据的行和列(返回整数)。
对于实矩阵,我们可以定义double *M; 来对实矩阵数据操作。
如:
double *M;
intm,n;
// 指针指向第一个参数的数据地址
M = mxGetPr(prhs[0]);
m = mxGetM(prhs[0]);
n = mxGetN(prhs[0]);
需要注意的是,MATLAB矩阵数据的存储顺序是"从上到下,从左到右"的,这点和Fortran是一样的。
也就是说对于MATLAB的m x n的矩阵A。
A(1,1) 就是*M,A(2,1) 就是*(M+1) ,以此类推,A(i,j) 就是*(M + m*(j-1) + (i-1)).
注意: MATLAB的指标从1开始,C的指标从0开始。
1.3、操作输出数据
对于输出数据,我们需要首先分配内存空间,有专门的mex函数可以使用,如:
plhs[0] = mxCreateDoubleMatrix(m,n, mxREAL); //生成m x n 的实矩阵。
同输入数据一样,要对输出数据操作,我们也需要一个指向数据的指针变量,如
double *A;
A = mxGetPr(plhs[0]);
下面将具体介绍一下如何使用Matlab和VS2008编写MEX并编译调试。
2、Matlab编写Mex的具体步骤
2.1、mex–setup命令设置好编译器
2.2、编写C++代码并保存为.cpp(可以先先建一个txt文件,然后改为.cpp)
以如下程序为例:
#include "mex.h"
voidmexFunction(intnlhs, mxArray *plhs[], intnrhs, constmxArray *prhs[])
{
inti;
i=mxGetScalar(prhs[0]);
if(i==1)
mexPrintf("hello,world!\n");
else
mexPrintf("大家好!\n");
}
保存成helloworld.cpp。
2.3、在Matlab命令窗口输入如下命令:
mex helloworld.cpp
编译成功后,Matlab当前工作目录下会出现,helloword.mexw32的文件夹,这个.mexw32便是dll文件(只因为它是Matlab生成的而已,它相当于dll),然后就可以在Matlab命令窗口调用这个dll文件了,如下图所示
3、VC编写Mex的具体步骤
打开VS2008, 新建项目, 选择MFC DLL.
3.1、配置VC
首先,将Matlab的头文件和库函数路径包含在VC中,即在Tools中打开options,然后按如下所示设置
其次右击工程名点开Property page,然后按如下方式设置:连接器-> 输入-> 附加依赖项输入libmx.lib libeng.lib libmat.lib libmex.lib 这四个lib文件。
3.2、编辑输出函数
在项目源文件的. def 中EXPORTS段加入mexFunction,如:
具体代码如下
EXPORTS
; Explicit exports can go here
部分改为
EXPORTS
; Explicit exports can go here
mexFunction
3.3、编写MEX文件
项目文件中新建一个C++文件如 mexproc.cpp,写入与前面相同代码即可。
具体代码:见第二部分
3.4、VC编译MEX
像编译其他程序那样直接编译即可,成功会生成dll文件。
如果编译链接时出错,根据错误提示,检查一下lib和h的路径是否正确,有无缺少lib文件,代码是否有语法错误等。
3.5、Matlab调用生成的dll
将编译好的dll文件拷入Matlab的当前工作目录下,然后像调用Matlab函数一样直接调用生成dll函数即可,如下所示:
参考链接:
1、/jkhere/article/details/8906274
2、/s/blog_8c84cf510100xqi2.html
3、/s/blog_646e75120100ge8i.html
4、/yihaizhiyan/article/details/6637085。