使用mex和C可以加快算法的运行速度,mex文件包含一个入口函数如下:
void mexFunction( int nlhs, mxArray *plhs[],int nrhs, const mxArray *prhs[] )
入口函数有四个参数:prhs为mxArray结构体类型的指针数组,该数组的元素按顺序指向所有的输入参数;
nrhs为整数类型,它标明了输入参数的个数。
plhs:为mxArray结构体类型的指针数组,该数组的元素按顺序指向所有的输出参数;
nlhs:输出参数的个数
在入口程序完成两件事情:
第一:从输入的mxArray结构体中获得计算完毕的数据,然后在用户的子程序中加以使用
第二:用户可以将计算完毕的结果返回给一个用于输出的mxArray结构体。
mex源文件的两个组成部分可以分为两个文件也可以放在一个文件中,必须包含mex.h头文件,该头文件包含matrix.h和一些以mex开头的子函数。
下面举几个例子:
#include "mex.h" /* 输入参数 */ #define MInput prhs[0] /* 输出参数 */ #define OUTM plhs[0] void mexFunction( int nlhs, mxArray *plhs[], int nrhs, const mxArray *prhs[] ) { int i,j,N,L; double *Input,*output; if (nrhs < 1) { mexErrMsgTxt("至少需要一个参数!"); } Input= mxGetPr(MInput); /*获取矩阵*/ N = mxGetM( MInput ); /*获取矩阵的行*/ L = mxGetN( MInput); /*获取矩阵的列*/ for( i=0;i<N;i++) /*一行一样输出*/ { for ( j=0;j<L;j++) printf("%f ", Input[i+j*N]);/*若索引从1开始则变成i-1+(j-1)*N MATLAB 是按列存数据 */ printf("\n"); /*输出完一行,换行*/ } OUTM= mxCreateDoubleMatrix(N,L, mxREAL); /* 建立输出矩阵*/ output=mxGetPr(OUTM); for( i=0;i<N;i++) /*一行行的赋值*/ { for ( j=0;j<L;j++) output[i+j*N]=Input[i+j*N];/*若索引从1开始则变成i-1+(j-1)*N*/ } } |