使用 C 矩阵 API 创建 C++ MEX 函数
注意
MATLAB® 提供使用现代 C++ 语义和设计模式的 API,即 MATLAB Data API for C++。MathWorks 建议您使用此 API 创建 MEX 函数。有关详细信息,请参阅编写可从 MATLAB(MEX 文件)调用的 C++ 函数。
如果您的 MEX 函数必须在 MATLAB R2017b 或更早版本中运行,则您必须在 C++ 应用程序中使用 C Matrix 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