您的位置:首页 > 其它

Mex文件及其编译

2015-11-22 11:13 330 查看
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;

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: