A.2.1开始使用Mex文件

构建mex文件的基本命令是mkoctfile --mexmex。第一个命令可以在Octave中使用,也可以在命令行中使用。为了避免出现问题MATLAB自己的mex命令,命令的使用mex仅限于octave以内。编译的x文件具有扩展名.mex.

 
: mex [-options] file …
: status = mex (…)

将用C、C++或Fortran编写的源代码编译到MEX文件中。

status的返回状态mkoctfile作用

如果编译失败,并且没有指定输出参数,则会引发错误。如果程序员要求status然而,Octave只会报警告,程序员有责任验证命令是否成功。

这相当于mkoctfile --mex [-options] file.

详见: mkoctfile, mexext.

广告
 
: ext = mexext ()

返回用于MEX文件的文件扩展名。

编程说明:Octave使用扩展mex对于所有MEX文件,无论操作系统(Linux、Windows、Apple)或硬件的位宽(32位或64位)如何。

详见: mex.

广告

考虑以下简短示例:

#include "mex.h"

void
mexFunction (int nlhs, mxArray *plhs[],
             int nrhs, const mxArray *prhs[])
{
  mexPrintf ("Hello, World!\n");

  mexPrintf ("I have %d inputs and %d outputs\n", nrhs, nlhs);

  /* Return empty matrices for any outputs */
  int i;
  for (i = 0; i < nlhs; i++)
    plhs[i] = mxCreateDoubleMatrix (0, 0, mxREAL);
}

第一行#include "mex.h"使mex文件所需的所有定义都可用。Octave和之间的一个重要区别MATLAB是头文件吗"matrix.h"通过包含隐含地包含"mex.h"。这是避免与Octave文件发生冲突所必需的"Matrix.h"适用于不区分大小写文件名的操作系统和编译器。

mex文件的入口点从定义mexFunction。该函数有四个参数:

  1. 返回参数的数量(左侧参数的数量)。
  2. 返回参数的指针数组。
  3. 输入参数的数量(右侧参数的数量)。
  4. 指向输入参数的指针数组。

请注意,函数名称定义未明确包含在mexFunction所以只能有一个mexFunction每个文件的入口点。相反,在Octave中看到的函数名称是从mex文件本身的名称减去扩展名来确定的。如果上述函数在文件中myhello.c,可以使用进行编译

mkoctfile --mex myhello.c

它创建一个文件myhello.mex。然后,函数可以从Octave运行为

myhello (1,2,3)
⇒ Hello, World!
⇒ I have 3 inputs and 0 outputs

需要注意的是,mex文件不包含帮助字符串。要文档mex文件,应该在与mex文件本身相同的目录中存在一个m文件。以上面的例子为例,需要一个文件myhello.m其中可能包含文本

%MYHELLO Simple test of the functionality of a mex-file.

在这种情况下,将在Octave中执行的函数将从mex文件提供,而帮助字符串将来自m文件。这对于允许在Octavelange中对mex文件进行示例实现以进行测试也很有用。

尽管在一个mex文件中不能有多个入口点,但可以使用mexFunctionName函数来确定调用mex文件的名称。这可以用于根据函数名更改mex文件的行为。例如,如果

#include "mex.h"

void
mexFunction (int nlhs, mxArray *plhs[],
             int nrhs, const mxArray *prhs[])
{
  const char *nm;

  nm = mexFunctionName ();
  mexPrintf ("You called function: %s\n", nm);
  if (strcmp (nm, "myfunc") == 0)
    mexPrintf ("This is the principal function\n", nm);

  return;
}

在文件中myfunc.c,与一起编译

mkoctfile --mex myfunc.c
ln -s myfunc.mex myfunc2.mex

那么可以看出

myfunc ()
⇒ You called function: myfunc
    This is the principal function
myfunc2 ()
⇒ You called function: myfunc2

mex文件的行为可以根据函数的名称进行更改。

尽管用户应该只包括墨西哥在他们的代码中,Octavedeclare提供了额外的函数、typedef等,用户可以在头中写入mex文件mexproto.hmxarray.h.


版权所有 © 2024-2025 Octave中文网

ICP备案/许可证号:黑ICP备2024030411号-2