A.2.1 开始使用Mex文件

构建mex文件的基本命令是 mkoctfile --mexmex。第一个命令既可以在Octave内部使用,也可以在命令行中使用。为了避免与 MATLAB 自带的 mex 命令产生冲突,mex 命令的使用仅限于Octave内部。编译后的mex文件具有扩展名 .mex

 
mex [-选项] 文件 …
status = mex (…)

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

statusmkoctfile 函数的返回状态。

如果编译失败,且未请求输出参数,则会引发错误。但是,如果程序员要求返回 status,Octave 则只会发出警告,而程序员有责任验证命令是否成功执行。

这等价于 mkoctfile --mex [-选项] 文件

另请参阅: mkoctfilemexext

 
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文件。这对于允许使用Octave语言本身编写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文件的行为可以根据函数名称而改变。

尽管用户只应在代码中包含 mex.h,但Octave在头文件 mexproto.hmxarray.h 中声明了可供用户编写mex文件使用的额外函数、类型定义等。


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

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