简介
- mex 表示“MATLAB 可执行文件”
- 通过 MATLAB 命令行调用 C、C++ 或 Fortran 子例程(就当它们是内置函数一样)
- MEX 文件只包含一个函数或子例程,并且其名称为 MEX 文件名。要调用 MEX 文件,请使用该文件的文件名,但不带文件扩展名。
术语 含义 源MEX文件 C C++ Fortran源代码文件 二进制 MEX 文件 MATLAB 解释器加载和执行的动态链接子例程 MEX 函数库 用于在 MATLAB 环境中执行操作的 MATLAB C 和 Fortran API 引用库。 mex 编译脚本 基于源文件创建二进制文件的 MATLAB 函数
创建MEX文件,需要
- 源文件,其中一个里编写入口函数
- mex命令编译二进制MEX文件
具体命令
编译器 the MATLAB Compilerr
包括mex编译器、mbuild编译器、mcc编译器
根据外部编译器的类型、软件位置对M编译器设置
利用matlab提供的标准文件对用户设置加以验证
- mex
将C文件转换为MEX文件: mex ex1.c
C文件组成
- 入口子程序mexFunction( int nlhs, mxArray plhs[], int nrhs, const mxArrayprhs[] ) 参数含义为:
nrhs:为输入参数的数目。
prhs:为输入参数数组,是指针数组。
nlhs:为输出参数的数目。
plhs:为输出参数数组,是指针数组- 计算功能子程序:包含所有的实际需要完成的功能源代码,可以是用户以前所编写的算法和程序,以函数的形式存在
- 必须包含mex.h库:#include”mex.h”
- mbuild
将C文件转换为独立执行程序(可脱离matlab空间运行) - mcc
将M函数(脚本不行)转换为C文件,并可以调用mex、mbuild(自动调用mbuild)来生成MEX或独立执行文件
mcc_? help mcc
- mccmcc -x filename1 filename2
由M函数文件得到MEX文件filename1.dll- mcc -m filename
由不包含绘图指令的M文件得到可执行的exe文件c- mcc -p filename
由不包含绘图指令的M文件得到可执行的exe文件(c++)- mcc -B sgl filename
由含绘图指令的M文件得到可执行的exe文件©- mcc -B sglcpp filename
由包含绘图指令的M文件得到可执行的exe文件(c++独立应用程序)
- 注: Windows下MEX文件后缀为.dll,可执行文件后缀为.exe
- 即:C语言文件经mex命令编译链接得到MEX文件;M函数文件经mcc命令编译链接得到MEX文件
简单例子
- mex -setup
选择编译器 -
timestwo.c #include "mex.h“ /*计算功能子程序timestwo,计算一个数的两倍*/ void timestwo(double y[], double x[]) { y[0] = 2.0*x[0]; } /*入口子程序mexFunction*/ void mexFunction( int nlhs, mxArray *plhs[], int nrhs, const mxArray *prhs[] ) { double *x,*y; int mrows,ncols; /* 检查输入输出参数 */ if(nrhs!=1) { mexErrMsgTxt("One input required."); } else if(nlhs>1) { mexErrMsgTxt("Too many output arguments"); } /* 输入只能是一个双精度型的实数*/ mrows = mxGetM(prhs[0]); ncols = mxGetN(prhs[0]); if( !mxIsDouble(prhs[0]) || mxIsComplex(prhs[0]) || !(mrows==1 && ncols==1) ) { mexErrMsgTxt("Input must be a noncomplex scalar double."); } /* 为输出参数创建矩阵,输出指针指向该矩阵 */ plhs[0] = mxCreateDoubleMatrix(mrows,ncols, mxREAL); /* 输入指针输出指针赋值 */ x = mxGetPr(prhs[0]); y = mxGetPr(plhs[0]); /* 调用功能子程序 */ timestwo(y,x); }
mex timestwo.c
y=timestwo(3)
-
预配置(不需要太注意)
mex-setup mex my_yprime.c % \extern\example\mex my_yprime(1,1:4) which my_yprime clear my_yprime.dll mcc-x my_yprime my_yprime(1,1:4) which my_yprime clear my_yprime.dll mbuild-setup mbuild my_ex1.c % \extern\example\cmath 在Windows的DOS窗口运行exe which my_yprime clear my_yprime.dll mcc -p my_hello.m % \extern\example\compiler