使用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*/
}
}
|