在编写Matlab程序的时候,我们经常需要调用C++语言编写的程序以提高算法运行速度等。本文将介绍怎样编写及编译mex文件。通俗的讲,Matlab与C++的混合编程就是,Matlab将输入变量传给C++,C++执行完后将结果返回给Matlab。因此,编写mex文件的关键就在于输入输出的处理,其他均与C++无异。
mex文件的编写
mex 函数的编写关键在于入口函数及返回值。所有参数均通过指针传递。cpp文件名即为Matlab调用的函数名。cpp文件需要
#include "mex.h"
入口函数的规范:
void mexFunction( int nlhs, mxArray *plhs[], int nrhs, const mxArray *prhs[] )
// nlhs:输出参数个数
// plhs:输出参数列表
// nrhs:输入参数个数
// prhs:输入参数列表
参数传入举例:
double *pint= (double*)mxGetData(prhs[0]);
int a = (int)pint[0];
这样即可将第一个变量以 int 型传入到num_vertices 变量。
同时可以加入参数个数判断,以防止错误:
if (nrhs != 3)
{
mexErrMsgTxt( "参数错误!请检查参数个数" );
}
参数传入后就可以按照C++的方法去实现算法,最终将算法运行后的结果传出到Matlab中。
参数传出:
- 首先用传出参数列表plhs申请空间,如
plhs[0] = mxCreateDoubleMatrix(u->num, 1, mxREAL);
plhs[1] = mxCreateDoubleMatrix(u->num, 1, mxREAL);
plhs[2] = mxCreateDoubleMatrix(u->num, 1, mxREAL);
- 随后取得以上参数的地址,如
double* a=(double *)mxGetPr(plhs[0]);
double* b=(double *)mxGetPr(plhs[1]);
double* c=(double *)mxGetPr(plhs[2]);
这样将将变量a,b,c的结果传出到mex的输出变量了。
编译:
在Matlab中 mex xxx.cpp 即可。
mex文件的调试
参见博客.
附录:
混合编程API一览,参见Mtahworks网站
mwIndex (C and Fortran) | Type for index values |
---|---|
mwPointer (Fortran) | Pointer type for platform |
mwSignedIndex (C and Fortran)</ |