Mex文件及其编译

来源:互联网 发布:js正则表达式判断密码 编辑:程序博客网 时间:2024/04/27 18:03

TLD在tldtracking中调用了lk。这个lk实际是lk.mexw64,Source文件是lk.cpp。

Matlab中的mex函数通过C编译器(如VS2013)对C source进行编译、链接,形成一个mex文件(64位机就是mexw64),这个mex文件可以被Matlab引擎调用。

1. 编译过程:

  •      mex -setup选择编译器 
  •      mex filenames:比如mex yprime.c(这个是Matlab的Help中的例子,直接搜“mex”)。最终会形成一个yprime.mexw64,并可以在matlab中调用成功(调用时的传递参数只是两个input argument,后面会讲):


2. c source file格式

yprime.c的格式如下:


可以看出,这个c文件中有一个mexFunction,它就是Matlab调用C文件的参数传递接口函数,四个参数释义如下:


p指pointer,n指number,rhs指right hand side(输入参数),l指left hand side(输出参数)。

我们在调用yprime.mexw64时,传递的是两个输入参数,就是nrhs(T=1)和prhs(Y=1:4),而plhs是在yprime.c中定义的,直接作为调用的返回值。mexFunction的具体函数如下,可以看到,到最后才调用了yrime的函数,前面都是对输入参数处理:

void mexFunction( int nlhs, mxArray *plhs[],  int nrhs, const mxArray*prhs[] )     {     double *yp;     double *t,*y;     size_t m,n;         /* Check for proper number of arguments */        if (nrhs != 2) {    mexErrMsgIdAndTxt( "MATLAB:yprime:invalidNumInputs",                "Two input arguments required.");     } else if (nlhs > 1) {   mexErrMsgIdAndTxt( "MATLAB:yprime:maxlhs",                "Too many output arguments.");     }         /* Check the dimensions of Y.  Y can be 4 X 1 or 1 X 4. */         m = mxGetM(Y_IN);     n = mxGetN(Y_IN);    if (!mxIsDouble(Y_IN) || mxIsComplex(Y_IN) || (MAX(m,n) != 4) || (MIN(m,n) != 1)) {    mexErrMsgIdAndTxt( "MATLAB:yprime:invalidY",                "YPRIME requires that Y be a 4 x 1 vector.");     }         /* Create a matrix for the return argument */     YP_OUT = mxCreateDoubleMatrix( (mwSize)m, (mwSize)n, mxREAL);         /* Assign pointers to the various parameters */     yp = mxGetPr(YP_OUT);        t = mxGetPr(T_IN);     y = mxGetPr(Y_IN);            /* Do the actual computations in a subroutine */    yprime(yp,t,y);     return;    }







0 0
原创粉丝点击