构建mex文件的基本命令是 mkoctfile --mex 或 mex。第一个命令既可以在Octave内部使用,也可以在命令行中使用。为了避免与 MATLAB 自带的 mex 命令产生冲突,mex 命令的使用仅限于Octave内部。编译后的mex文件具有扩展名 .mex。
[-选项] 文件 … ¶status = mex (…) ¶将用C、C++或Fortran编写的源代码编译为MEX文件。
status 是 mkoctfile 函数的返回状态。
如果编译失败,且未请求输出参数,则会引发错误。但是,如果程序员要求返回 status,Octave 则只会发出警告,而程序员有责任验证命令是否成功执行。
这等价于 mkoctfile --mex [-选项] 文件。
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 定义。该函数接受四个参数:
请注意,函数名称的定义并未明确包含在 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.h 和 mxarray.h 中声明了可供用户编写mex文件使用的额外函数、类型定义等。
版权所有 © 2024-2026 Octave中文网
ICP备案/许可证号:黑ICP备2024030411号-4