应用接口是MATLAB与其他语言相互调用各自函数的方法,MEX文件使MATLAB程序中可以调用或链接其他语言编写的函数,而MATLAB引擎使其他语言程序中可以调用MATLAB函数。

01、MEX文件


MEX是MATLAB Executable的缩写,是MATLAB中用于调用其他语言编写的程序的接口。用其他语言编写的MEX程序经过编译,生成MEX文件,可以作为MATLAB的扩展函数。MEX文件能够在MATLAB环境中调用,在用法上和MATLAB函数类似,但MEX文件优先于MATLAB函数执行。下面以C++为例,介绍MEX库函数、MEX源程序的构成、编译MEX源程序以及调用MEX文件的方法。

1. MEX函数


MEX库函数用于MEX程序与MATLAB环境交换数据和从MATLAB工作空间获取相应信息。所有MEX函数均在MATLAB的子文件夹extern\include中的头文件mex.h得到声明。表1列出了C/C++语言常用MEX函数及功能。


■ 表1 C/C++语言常用MEX函数及功能

MATLAB实战 | MEX文件-LMLPHP

2. MEX文件源程序的建立


MEX文件源程序由如下两个部分组成。
(1) 入口子程序。入口子程序的默认名字mexFunction,其作用是在MATLAB系统与被调用的外部子程序之间建立联系,定义被MATLAB调用的外部子程序的入口地址、MATLAB系统和子程序传递的参数等。入口子程序的定义格式如下: 

void mexFunction(int nlhs,mxArray *plhs[],int nrhs,const mxArray *prhs[])
{
}

 入口子程序有4个参数。nlhs定义输出结果的个数,plhs指向用于返回输出结果的变量,nrhs定义输入参数的个数,prhs指向存储输入参数的变量。prhs和plhs都是指向mxArray对象的指针,C++程序与MATLAB工作空间交换数据必须使用mxArray对象,对象各成员的值默认为double类型。
(2) 计算子程序。计算子程序包含所有完成计算功能的程序,由入口子程序调用。计算子程序的定义格式和其他C/C++子程序的定义格式相同。
头文件mex.h中包含了所有的MEX函数声明,因此在文件首部需要加入宏命令:

#include "mex.h"

 下面用一个实例说明MEX文件的基本结构。
【例1】用C++编写求两个数的最小公倍数的MEX文件源程序,并编译生成MEX文件。调用该MEX文件,求两个整数的最小公倍数。
程序如下:

# include "mex.h"
//求最小公倍数子程序
double com_multi(double *x,double *y){
int a, b, c, d; a = int(*x); b= int(*y); c=a>=b?a:b; d=c;
while (c%a!=0 || c%b!=0)
c=c+d; return c;
//入口子程序
void mexFunction( int nlhs, mxArray *plhs[ ], int nrhs, const mxArray *prhs[]){
double *result; int m,n, i;
//检查参数数目是否正确 if(nrhs!= 2) {
mexErrMsgTxt("输入参数应有两个!");return;
}
if(nlhs!= 1) {
mexErrMsgTxt("应有一个输出参数!");return;
//检查输入参数的类型 for(i= 0;i<2;i++){
m= int(mxGetM(prhs[i])); n = int(mxGetN(prhs[i]));
if( mxIsClass(prhs[i],"int") || !(m ==1 &&n==1)){
mexErrMsgTxt("输入参数必须是一个数.");
}
}
//准备输出空间
plhs[0] = mxCreateDoubleMatrix(1,1,mxREAL); result= mxGetPr(plhs[0]);//计算
*result= com_multi(mxGetPr(prhs[0]),mxGetPr(prhs[1]));

 将以上程序保存到当前文件夹,文件名为TryMex.cpp。


3. MEX文件源程序的编译


MEX文件源程序的编译需要具备两个条件:一是要求已经安装MATLAB应用程序接口组件及其相应的工具,另一个是要求有合适的C/C++语言编译器。
编译MEX文件源程序有两种方法:一是利用MATLAB提供的编译器,二是利用其他编译工具,如Microsoft Visual Studio。若使用MATLAB提供的编译器,则编译MEX源程序使用mex命令。例如,编译例1的MEX源程序,在MATLAB命令行窗口输入如下命令:

>> mex TryMex.cpp

系统使用默认编译器编译源程序,编译成功,将在当前文件夹下生成与源程序同名的MEX文件TryMex.mexw64。扩展名.mexw64表示生成的是一个可以在64位Windows系统下运行的MEX文件。
调用MEX文件的方法和调用M函数的方法相同。例如,在MATLAB命令行窗口输入以下命令测试上述MEX文件:

>> z = TryMex(8,34)
z = 136
11-25 14:01