mexFunction

简介
    MEX从字面上是MATLAB和Excutable 两个单词的缩写。
    MEX文件是由C或Fortran语言编写的源代码,经matlab编译器处理而生成的二进制文件。它是可以被matlab解释器自动装载并执行的动态链接程序,类似windows下的dll文件。
    MEX文件实现了一种其它语言与MATLAB的接口,通过MEX文件可以在MATLAB中像调用内嵌函数一样调用使用C语言和Fortran等语言编写的函数,实现了代码重用,同时也能提高MATLAB环境中数据处理的效率。
    mex的编译结果实际上就是一个带输出函数mexFunction 的dll文件,所以写MEX程序其实就是写一个DLL程序。
    void mexFunction ( int nlhs, mxArray *plhs[], int nrhs, const mxArray *prhs[] )
   {
  }四个参数分别用来输出和输入数据: nlhs 输出参数个数,plhs 输出参数指针,nrhs,输入参数个数,prhs输入参数指针(输出和输入参数的操作都通过指针的方式进行)。


输入数据

  通过mxGetPr得到数据的指针地址,mxGetM和mxGetN分别得到矩阵数据的行和列 (返回整数)。如:   
    double *M;
  int m,n; 
    M = mxGetPr(prhs[0]);
    m = mxGetM(prhs[0]);   
    n = mxGetN(prhs[0]);
  MATLAB矩阵数据的存储顺序是"从上到下,从左到右"的(按列存储),和Fortran一样。也就是说对于MATLAB的m x n的矩阵A。 A(1,1) 就是 *M,A(2,1) 就是 *(M+1) ,以此类推,A(i,j) 就是 *(M + m*(j-1) + (i-1))。


输出数据

  首先用mex函数分配内存空间,如:
    plhs[0] = mxCreateDoubleMatrix(m,n, mxREAL); //生成m x n 的实矩阵。
    同输入数据一样,要对输出数据操作,我们也需要一个指向数据的指针变量,如
    double *A;
  A = mxGetPr(plhs[0]);

示例:
   以下:segment_fh_mex是mex文件,im为一个图像矩阵,sigma,c,max_size是一些值
  output = segment_fh_mex(double(im), double(sigma), double(c), double(max_size));
    加入几句调试语句:
    std::cout<<"nrhs: "<<nrhs<<std::endl;
    std::cout<<"nlhs: "<<nlhs<<std::endl;
    输出为:
    nrhs: 4
    nlhs: 1
   输入参数有4个,输出参数只有1个。

 获得输入参数值:
  double *im = (double *)mxGetPr(prhs[0]);//第1个输入参数
  double *sigma = (double *)mxGetPr(prhs[1]);//第2个输入参数
  double *c = (double *)mxGetPr(prhs[2]);//第3个输入参数
  double *min_size = (double *)mxGetPr(prhs[3]);//第4个输入参数

获得输出参数值:
  mxArray *mx_output = mxCreateNumericMatrix(dims[0], dims[1], mxDOUBLE_CLASS, mxREAL);//创建输出数组
......对mx_output进行相应的求值
plhs[0] = mx_output//进行赋值为传回的参数值
    
posted @ 2014-09-28 23:45  DeepVL  阅读(592)  评论(0编辑  收藏  举报