编写可从 MATLAB(MEX 文件)调用的 C 函数
mxArray
访问 MATLAB 变量并创建返回 MATLAB 的数组您可以像调用内置函数一样,从 MATLAB 命令行调用您自己的 C 程序。这些程序称为 MEX 函数,并且函数名称为 MEX 文件名。MEX 函数并不适用于所有应用程序。MATLAB 是一种高生产率环境,尤其适用于消除编译语言中需要花费大量时间的低级编程。一般情况下,请在 MATLAB 中进行编程。除非您的应用程序需要,否则请不要使用 MEX 函数。
要创建 MEX 函数,请使用 MATLAB API 编写程序。这些库中的函数有助于在 MEX 函数和工作区之间传输数据。要选择 MATLAB API,请考虑以下几点:
使用现代 C++ 功能创建 MEX 函数,如 MATLAB Data API for C++ 中定义。有关详细信息,请参阅编写可从 MATLAB(MEX 文件)调用的 C++ 函数。
如果您的 MEX 函数必须在 MATLAB R2017b 或更早版本中运行,或如果您更喜欢使用 C 语言,请使用 C Matrix API 和 C MEX API 中的函数。这些 API 使用 MATLAB
mxArray
数据结构。此页上列出的函数和主题基于mxArray
。
注意
选择来自 C Matrix API 或 MATLAB Data API 的函数;您不能混合使用来自这些 API 的函数。
使用 mex
函数将您的源文件编译到可执行程序中。您也可以与其他 MATLAB 用户共享 MEX 文件。
有关编写 S-Function 的信息,请参阅您的 Simulink® 文档。
要调用其他人创建的 MEX 函数,请参阅调用 MEX 函数。
如果您有 C/C++ 程序并且要从该程序中调用 MATLAB 函数,请使用其中一个引擎 API。有关详细信息,请参阅:
如果您要从 C 程序中读写 MATLAB 数据,请参阅编写 C 程序以读取 MAT 文件数据。
C MEX API
mexFunction | Entry point to C/C++ MEX function built with C Matrix API |
mexFunctionName | 当前 MEX 函数的名称 |
mexAtExit | Register function to call when MEX function clears or MATLAB terminates |
mexCallMATLAB | Call MATLAB function, user-defined function, or MEX function |
mexCallMATLABWithTrap | Call MATLAB function, user-defined function, or MEX file and capture error information |
mexEvalString | Execute MATLAB command in caller workspace |
mexEvalStringWithTrap | Execute MATLAB command in caller workspace and capture error information |
mexGetVariable | Copy of variable from specified workspace |
mexGetVariablePtr | Read-only pointer to variable from another workspace |
mexPutVariable | Array from MEX function into specified workspace |
mexGet | Value of specified graphics property |
mexSet | Set value of specified graphics property |
mexPrintf | ANSI C PRINTF-style output routine |
mexErrMsgIdAndTxt | Display error message with identifier and return to MATLAB prompt |
mexWarnMsgIdAndTxt | Warning message with identifier |
mexIsLocked | Determine if MEX file is locked |
mexLock | Prevent clearing MEX file from memory |
mexUnlock | Allow clearing MEX file from memory |
mexMakeArrayPersistent | Make array persist after MEX file completes |
mexMakeMemoryPersistent | Make memory allocated by MATLAB persist after MEX function completes |
主题
编写 C MEX 函数
- 创建 C 源 MEX 文件 arrayProduct.c
此示例说明如何创建使用 C 矩阵 API 编译的
arrayProduct
C MEX 函数。 - MEX 函数源代码示例表
链接到 MEX 函数示例的源代码。
- MATLAB 数据
在 MEX 文件中使用
mxArray
。 - Memory Management Issues
Rules for managing
mxArray
memory. - 使用 C 矩阵 API 创建 C++ MEX 函数
在创建使用 C 矩阵 API 编译的 MEX 函数时要考虑的 C++ 语言事项。 - Error Handling in C MEX Files
Print error information using themexErrMsgIdAndTxt
function. - Handling Large File I/O in MEX Files
How to use 64-bit file I/O in your MEX file. - Testing for Most-Derived Class
How to exclude subclasses of built-in types from MEX file input arguments.
测试您的编译环境
- 编译 C MEX 函数
此示例显示如何编译示例 C MEX 函数
arrayProduct
。使用此示例验证系统的 C 编译配置。有关编译 C++ MEX 函数的信息,请参阅编译 C++ MEX 程序。
C Matrix API 版本
- Upgrade MEX Files to Use Interleaved Complex API
MATLAB Version 9.4 (R2018a) supports an interleaved representation of complex numbers.
- 升级 MEX 文件以使用 64 位 API
MATLAB 版本 9.2(版本 2017a)默认使用 64 位 API 编译 MEX 文件。
- Upgrade MEX Files to Use Graphics Objects
MATLAB Version 8.4 (R2014b) changes the data type of handles to graphics objects fromdouble
to object.
共享 MEX 文件
- Document Build Information in the MEX File
This example shows how to document thextimesy
MEX file built on a Windows® platform using a Microsoft® Visual C++® compiler.
疑难解答
编译错误
- Getting Help When MEX Fails
To help diagnose compiler set up and build errors, call themex
function with verbose option -v. - Compiling MEX File Fails
What to do when compiling a MEX file fails. - Troubleshooting MEX API Incompatibilities
More information for warnings and error messages. - 使用 MinGW -w64 编译 C/C++ MEX 文件的限制和疑难解答
使用 MinGW-w64 编译器编译的 MEX 文件的疑难解答。 - Symbol mexFunction Unresolved or Not Defined
Every MEX file needs amexFunction
.
运行时错误
- 无效的 MEX 文件错误
在遇到无效的 MEX 文件错误时如何操作。 - MEX 版本兼容性
为了获得最佳效果,请运行使用您的 MATLAB 版本编译的 MEX 文件。 - MEX Platform Compatibility
If you get a binary MEX file from another source, be sure that the file was compiled for the same platform on which you want to run it. - MEX API Is Not Thread Safe
Do not call a single session of MATLAB on separate threads from a MEX file. - MEX File Segmentation Fault
What to do when a MEX file causes a segmentation violation or assertion. - MEX File Generates Incorrect Results
What to do when your MEX generates wrong answers.
调试
- 在 Microsoft Windows 平台上调试
关于使用 Microsoft Visual Studio® 进行调试的建议。 - Debug on macOS Platforms
This example shows how to debug a MEX file on Mac Platforms. - Debug on Linux Platforms
This example shows how to debug a MEX file on Linux® Platforms.