目录
使用 C 矩阵 API 创建 C++ MEX 函数
注意:MATLAB® 提供使用现代 C++ 语义和设计模式的 API,即 MATLAB 数据 API。MathWorks 建议使用此 API 创建 MEX 函数。具体可以参考C++ MEX 应用程序。
如果MEX 函数必须在 MATLAB R2017b 或更早版本中运行,则必须在 C++ 应用程序中使用 C 矩阵 API 函数。用C矩阵API编译的MEX函数支持所有C++语言标准。本主题讨论创建和使用 MEX 文件时要考虑的特定 C++ 语言事项。可以在 C++ 应用程序中使用 MATLAB C 代码示例。可以参考 C++ 类示例中的 mexcpp.cpp,其中包含 C 和 C++ 语句。
创建 C++ 源文件
MATLAB C++ 源代码示例使用 .cpp 文件扩展名。扩展名 .cpp 是 C++ 编译器可识别的明确扩展名。其他可能的扩展名包括 .C、.cc 和 .cxx。
编译和链接
要编译 C++ MEX 文件,请键入:
mex filename.cpp
其中,filename 为MATLAB 路径上源代码文件的名称。运行 C++ MEX 文件的系统上的 MATLAB 版本必须与编译该文件所用的 MATLAB 版本相同。
类析构函数的内存注意事项
不要在 MEX 函数中所用类的 C++ 析构函数中使用 mxFree 或 mxDestroyArray 函数。如果 MEX 函数引发错误,则 MATLAB 将清理 MEX 文件变量(如Automatic Cleanup of Temporary Arrays in MEX Files中所述)。
如果发生的错误导致对象超出范围,MATLAB 将调用 C++ 析构函数。直接在析构函数中释放内存意味着 MATLAB 和析构函数均释放相同的内存,而这可能损坏内存。
使用 mexPrintf 打印到 MATLAB 命令行窗口
在 C++ MEX 文件中,使用 cout 或 C 语言 printf 函数无法按预期工作。改用 mexPrintf 函数。
C++ 类示例
MEX 文件 mexcpp.cpp 说明如何通过 C 语言 MEX 文件来使用 C++ 代码。该示例使用 C 矩阵 API 中的函数。它使用成员函数、构造函数、析构函数和 iostream include 文件。
该函数定义一个具有成员函数 display 和 set_data 以及变量 v1 和 v2 的类 myData。它构造 myData 类的一个对象 d,并显示 v1 和 v2 的初始化值。然后,它将 v1 和 v2 设置为输入并显示新值。最后,使用 delete 操作符清理该对象。
要编译此示例,请将文件复制到 MATLAB 路径,并在命令提示符下键入:
mex mexcpp.cpp
调用语法是 mexcpp(num1, num2)。
C++ 文件处理示例
mexatexit.cpp 示例说明了 C++ 文件处理功能。将其与使用 mexAtExit 函数的 C 代码示例 mexatexit.c 进行比较。
C++ 示例
C++ 示例使用 fileresource 类来处理文件打开和关闭函数。MEX 函数调用此类的析构函数,它关闭数据文件。在此示例中,在对数据文件执行操作时还会在屏幕上显示一条消息。但是,在本例中,执行的唯一 C 文件操作是写入操作,即 fprintf。
要编译 mexatexit.cpp MEX 文件,请将文件复制到 MATLAB 路径并键入:
mex mexatexit.cpp
键入:
z = 'for the C++ MEX-file';
mexatexit(x)
mexatexit(z)
clear mexatexit
Writing data to file.
Writing data to file.
显示 matlab.data 的内容。
type matlab.data
my input string
for the C++ MEX-file
C 示例
此 C 代码示例注册 mexAtExit 函数,用于在清除 MEX 文件时执行清理任务(关闭数据文件)。此示例在执行文件操作 fopen、fprintf 和 fclose 时使用 mexPrintf 在屏幕上显示一条消息。
要编译 mexatexit.c MEX 文件,请将文件复制到 MATLAB 路径并键入:
mex mexatexit.c
运行示例。
x = 'my input string';
mexatexit(x)
Opening file matlab.data.
Writing data to file.
清除 MEX 文件。
clear mexatexit
Closing file matlab.data.
显示 matlab.data 的内容。
type matlab.data
my input string