当前位置: 首页 > 工具软件 > Mex > 使用案例 >

mex编程小结

赫连淳
2023-12-01

1. mex概述

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[])
  • nlhs代表的是输出参数的个数。
  • plhs是一个指针数组,里面的指针指向mxArray类型,每一个指针指向一个输出。
  • nrhs代表的是输入参数的个数。
  • prhs是一个指针数组,里面的指针指向mxArray类型,每一个指针指向一个输入。

由于mex中经常需要操作Matlab数组或者矩阵,所以经常会用到matrix.h中定义的一些mx_前缀的函数,例如mxGetPr等等。

mx_
mex_
mat_
eng_

在mex项目中,可以将Matlab提供的用于混合编程的函数库文件libmx.lib,libmex.lib,libmat.lib和ibeng.lib都添加到依赖项中,这样可以最大程度避免符号未定义的错误。

2. mex要点小结

下面对mex编程中的一些要点进行总结,后续还会继续补充。

1. 如何查看内存中的mex对象

[a, b, c] = inmem()
  • a为内存中的普通变量
  • b为mex对象
  • c为Java对象

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);

2. 利用mingw构建mex

Windows下mex编程默认只支持Microsoft VIsual Studio和Lcc,并没有提供对mingw工具链的支持。解决这一问题,主要有两种方法:

  1. 使用gnumex
  2. 使用mingw连接Matlab提供的库

详情参见我的另一篇博客Windows下基于mingw的mex开发

3. mex中连接第三方库

主要有3种方法:

  1. mex命令提供对连接外部库的支持,可以直接利用-L选项指定第三方库的路径,-l连接第三方库文件。
    mex -L<library_path> -l<library>
    这样就可以连接第三方的库文件了。
  2. 修改mexopts.bat,在其中添加相关的连接参数。使用-L选项指定第三方库的路径,-l连接第三方库文件。不推荐使用这种方式,因为mexopts.bat是全局配置文件,对所有项目都有效,而在mex选项中使用-L和-l选项进行构建只对当前构建有效。
  3. 使用mingw开发时使用-L和-l选项连接第三方库。

4. 其他技巧

<MATLABROOT>/bin<MATLABROOT>/bin/win32加入系统PATH路径,即可直接在命令行下调用一些matlab命令。例如:

  • matlab
  • mex
  • mbuild
  • mcc
  • mlint
  • deploytool

所以,要创建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
 类似资料: