构建mex文件的基本命令是mkoctfile --mex
或mex
。第一个命令可以在Octave中使用,也可以在命令行中使用。为了避免出现问题MATLAB自己的mex
命令,命令的使用mex
仅限于octave以内。编译的x文件具有扩展名.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文件。这对于允许在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文件的行为可以根据函数的名称进行更改。
尽管用户应该只包括mex.h在他们的代码中,Octavedeclare提供了额外的函数、typedef等,用户可以在头中写入mex文件mexproto.h和mxarray.h.
版权所有 © 2024-2025 Octave中文网
ICP备案/许可证号:黑ICP备2024030411号-2