MEX文件

简介

  • mex 表示“MATLAB 可执行文件”
  • 通过 MATLAB 命令行调用 C、C++ 或 Fortran 子例程(就当它们是内置函数一样)
  • MEX 文件只包含一个函数或子例程,并且其名称为 MEX 文件名。要调用 MEX 文件,请使用该文件的文件名,但不带文件扩展名。
术语 含义
源MEX文件 C C++ Fortran源代码文件
二进制 MEX 文件 MATLAB 解释器加载和执行的动态链接子例程
MEX 函数库 用于在 MATLAB 环境中执行操作的 MATLAB C 和 Fortran API 引用库。
mex 编译脚本 基于源文件创建二进制文件的 MATLAB 函数

创建MEX文件,需要

  • 源文件,其中一个里编写入口函数
  • mex命令编译二进制MEX文件

具体命令

编译器 the MATLAB Compilerr
包括mex编译器、mbuild编译器、mcc编译器
功能
局限性
根据外部编译器的类型、软件位置对M编译器设置
利用matlab提供的标准文件对用户设置加以验证

  • mex
    将C文件转换为MEX文件: mex ex1.c

C文件组成

  1. 入口子程序mexFunction( int nlhs, mxArray plhs[], int nrhs, const mxArrayprhs[] ) 参数含义为:
    nrhs:为输入参数的数目。
    prhs:为输入参数数组,是指针数组。
    nlhs:为输出参数的数目。
    plhs:为输出参数数组,是指针数组
  2. 计算功能子程序:包含所有的实际需要完成的功能源代码,可以是用户以前所编写的算法和程序,以函数的形式存在
  3. 必须包含mex.h库:#include”mex.h”
  • mbuild
    将C文件转换为独立执行程序(可脱离matlab空间运行)
  • mcc
    将M函数(脚本不行)转换为C文件,并可以调用mex、mbuild(自动调用mbuild)来生成MEX或独立执行文件

mcc_? help mcc

  1. mccmcc -x filename1 filename2
    由M函数文件得到MEX文件filename1.dll
  2. mcc -m filename
    由不包含绘图指令的M文件得到可执行的exe文件c
  3. mcc -p filename
    由不包含绘图指令的M文件得到可执行的exe文件(c++)
  4. mcc -B sgl filename
    由含绘图指令的M文件得到可执行的exe文件©
  5. mcc -B sglcpp filename
    由包含绘图指令的M文件得到可执行的exe文件(c++独立应用程序)
  • 注: Windows下MEX文件后缀为.dll,可执行文件后缀为.exe
  • 即:C语言文件经mex命令编译链接得到MEX文件;M函数文件经mcc命令编译链接得到MEX文件

简单例子

  1. mex -setup
    选择编译器
  2.  timestwo.c
     #include "mex.h“
     /*计算功能子程序timestwo,计算一个数的两倍*/
     void timestwo(double y[], double x[])
     {
     y[0] = 2.0*x[0];
     }
     /*入口子程序mexFunction*/
     void mexFunction( int nlhs, mxArray *plhs[],
               int nrhs, const mxArray *prhs[] )
     {
      double *x,*y;
     int     mrows,ncols;
     /* 检查输入输出参数 */
       if(nrhs!=1) {
       mexErrMsgTxt("One input required.");
       } 
       else if(nlhs>1) {
       mexErrMsgTxt("Too many output arguments");
       }
      /* 输入只能是一个双精度型的实数*/
      mrows = mxGetM(prhs[0]);
      ncols = mxGetN(prhs[0]);
      if( !mxIsDouble(prhs[0]) || mxIsComplex(prhs[0]) || !(mrows==1 && ncols==1) ) {
      mexErrMsgTxt("Input must be a noncomplex scalar double.");
       }
       /* 为输出参数创建矩阵,输出指针指向该矩阵 */
       plhs[0] = mxCreateDoubleMatrix(mrows,ncols, mxREAL);
       /* 输入指针输出指针赋值 */
       x = mxGetPr(prhs[0]);
       y = mxGetPr(plhs[0]);
      /* 调用功能子程序 */
     timestwo(y,x);
      }
    

mex timestwo.c
y=timestwo(3)

  • 预配置(不需要太注意)

      mex-setup
      mex my_yprime.c % \extern\example\mex
      my_yprime(1,1:4)
      which my_yprime
      clear my_yprime.dll
      mcc-x my_yprime
      my_yprime(1,1:4)
      which my_yprime
      clear my_yprime.dll
      
      mbuild-setup
      mbuild my_ex1.c % \extern\example\cmath
      在Windows的DOS窗口运行exe
      which my_yprime
      clear my_yprime.dll
      
      mcc -p my_hello.m % \extern\example\compiler
    

其他

猜你喜欢

转载自blog.csdn.net/Ta_Ex_/article/details/84147336
Mex