mex是Matlab提供的一种混合编程方式。通过mex,用户可以在Matlab中调用C/C++或者Fortran编写的计算程序,加速Matlab内部的矩阵运算(尤其是加速Matlab代码中的for循环)。mex本质上是一个动态链接库文件,可以被Matlab动态加载并执行。
mex文件基本结构如下:
#include "mex.h"
void mexFunction(int nlhs, mxArray *plhs[],int nrhs,const mxArray *prhs[])
{
// chunk
}
#include "mex.h"
引入mex编程相关的函数即类型定义,该文件在<MATLABROOT>/extern/include
下。
mex文件在不同平台下有不同的扩展名,例如win32平台下的扩展名为.mexw32
,可以通过mexext
命令查看mex文件的扩展名。
mex文件本质上是一个动态链接库文件,其只有一个导出函数,就是mexFunction。mexFunction类似于Windows DLL文件中的DLLMain函数或者普通可执行程序中的main函数,其原型如下:
void mexFunction(int nlhs, mxArray *plhs[],int nrhs,const mxArray *prhs[])
由于mex中经常需要操作Matlab数组或者矩阵,所以经常会用到matrix.h中定义的一些mx_前缀的函数,例如mxGetPr等等。
mx_
mex_
mat_
eng_
在mex项目中,可以将Matlab提供的用于混合编程的函数库文件libmx.lib,libmex.lib,libmat.lib和ibeng.lib都添加到依赖项中,这样可以最大程度避免符号未定义的错误。
下面对mex编程中的一些要点进行总结,后续还会继续补充。
[a, b, c] = inmem()
mex程序首次调用后便常驻内存,除非使用clear显式清除或者退出Matlab程序。
若不手动清除mex函数,则对应的mexw32或者mexw64文件会被占用,此时普通用户无法删除该文件。
为了删除这些文件,必须先从内存中清除这些变量,释放对mex文件的占用。
为了验证mex首次调用后会常驻Matlab内存,可以编写一个带有静态变量的mex程序,并在每次调用时该值增1,并将该值打印出来,则在Matlab命令行下调用该mex程序时可以看到该值会逐次递增。
static int i = 0;
i = i + 1;
mexPrintf("i = %d\n", i);
Windows下mex编程默认只支持Microsoft VIsual Studio和Lcc,并没有提供对mingw工具链的支持。解决这一问题,主要有两种方法:
详情参见我的另一篇博客Windows下基于mingw的mex开发
主要有3种方法:
mex -L<library_path> -l<library>
将<MATLABROOT>/bin
及<MATLABROOT>/bin/win32
加入系统PATH路径,即可直接在命令行下调用一些matlab命令。例如:
所以,要创建mex文件,不一定要在Matlab命令行下输入mex,也可以直接下Windows的命令提示行下进行操作。这种技巧使得我们可以在Makefile中控制mex的生成过程,给开发带来便利。
mex -setup
mex -v -g -I %MEX_INCLUDE% -L %MEX_LIBRARY% xx.c -lmx -lmex -lmat -leng -lyy -lzz