使用 MEX 函数检查 MATLAB 代码中的问题
在生成 C/C++ 代码或加速 MEX 函数之前,请通过生成和运行 MEX 函数来检查 MATLAB® 代码中的合规性问题。此步骤是代码生成工作流的重要组成部分。
通过使用 MEX 函数检查问题,您可以:
检测并修复在生成的代码中较难诊断的运行时错误。对于独立代码生成,默认情况下为 MEX 生成启用的运行时错误检查处于禁用状态。
验证生成的代码是否提供与原始 MATLAB 函数相同的功能。如果您编写脚本来测试您的 MATLAB 代码(也称为测试平台),您可以使用相同的测试平台脚本来测试生成的 MEX 函数。
更快地完成错误识别和代码生成周期。MATLAB Coder™ 在检查问题时使用即时 (JIT) 编译,从而减少代码生成时间。在命令行检查问题时,您也可以启用 JIT 编译。
使用以下方法之一检查 MATLAB 代码中的问题:
在 MATLAB Coder 中,在代码生成工具条上,点击运行生成的 MEX 按钮。您必须提供测试平台文件来执行您的入口函数。
在命令行中,使用
codegen命令生成 MEX 函数。然后,使用与运行原始 MATLAB 代码时相同的输入,在 MATLAB 中运行生成的 MEX 函数。或者,如果您编写测试平台脚本,可以使用coder.runTest测试生成的 MEX。
在生成独立的 C/C++ 代码或加速 MEX 函数之前修复错误。解决在检查问题步骤中出现的错误通常需要修改您的 MATLAB 代码,但也可能需要重新指定输入类型。如果您更改 MATLAB 代码,请在 MATLAB 环境中执行修改后的代码,以确认它运行正常,然后再次检查问题。完成问题检查步骤并确保不再出现错误可能需要对生成和执行 MEX 函数进行多次迭代。
对 MEX 生成过程中的错误进行故障排除
如果您使用 MATLAB Coder,并且代码生成器在 MEX 生成期间检测到错误或警告,该 App 会生成错误报告。如果您在命令行生成代码,您可以通过调用带有 -report 或 -launchreport 选项的 codegen 命令来生成错误报告。错误报告描述识别的问题,并标识 MATLAB 代码中有错误的行。请参阅Code Generation Reports。
您通常可以通过修改 MATLAB 代码来修复在 MEX 生成过程中检测到的错误。在某些情况下,您可以通过更改代码配置设置或重新指定输入类型来修复错误。下表描述了在代码生成过程中可能遇到的一些常见错误,并提供一些建议的解决方案。
| 错误消息片段 | 问题 | 可能的解决方案 |
|---|---|---|
| MATLAB 代码通过在现有索引边界之外赋值来创建或扩展数组。 | 在 MATLAB 中,您可以通过给未定义的数组元素赋值来创建或增大数组。代码生成不支持这种数组创建和扩展方法。必须先定义矩阵,然后再为矩阵元素赋值。请参阅在对索引变量赋值之前定义矩阵。 |
Unable to make this assignment because dimension | MATLAB 代码将可变大小数组赋给定义为固定大小的变量。 | 使用以下方法之一解决此错误:
|
Undefined function or variable ' | MATLAB 代码使用对代码生成器来说未知的函数或变量。以下代码也可能在 MATLAB 执行中失败。 | 在尝试生成代码之前,请确保您的代码在 MATLAB 中运行。 |
| 代码生成不支持 MATLAB 代码中的函数之一。 | 如果您的代码包含不支持的函数,请考虑以下解决方法之一:
有关这些解决办法的更多详细信息,请参阅解决错误:代码生成不支持函数。 |
| 代码生成器无法确定 MATLAB 代码中一个或多个变量的类型。 | 在使用之前完全定义所有执行路径中的所有变量,包括元胞数组元素、结构体字段和类属性。请参阅解决问题:变量在使用前必须完全定义和解决问题:元胞数组元素在使用前必须完全定义。 |
Code generation does not support changing types through assignment(代码生成不支持通过赋值来更改类型) | MATLAB 代码通过为变量赋予具有不同类或大小的值来更改变量的属性。 | 对每个变量赋予一个固定的类。如果需要使用大小可变的变量,请参阅可变大小数组的代码生成。如果您需要在生成的代码中重用变量,请参阅通过不同属性重用同一变量。 |
| 代码生成器在以下任一情况下可能会生成数组大小不兼容性错误:
| 要解决此错误,请尝试以下方法之一:
请参阅解决错误:数组大小不兼容。 |
另请参阅针对代码生成的 MATLAB 代码设计注意事项和支持 C/C++ 代码生成的 MATLAB 语言功能。
如果您的 MATLAB 代码调用 MATLAB 路径中的函数,代码生成器会尝试为每个函数生成代码,除非该函数为外部函数。请参阅代码生成的函数调用解析。
对 MEX 执行期间的错误进行故障排除
当您在 MATLAB 中运行生成的 MEX 函数时,默认情况下会执行内存完整性检查。这些检查执行数组边界和维度检查,并在为 MATLAB 函数生成的代码中检测内存完整性违规情况。默认情况下,生成的 MEX 函数也会执行响应性检查,此操作允许您使用 Ctrl+C 键终止 MEX 执行。
运行 MEX 函数时出现错误的最常见原因包括:
不正确的输入值 - 您提供给 MEX 函数的输入与生成的代码预期的输入不兼容。在许多情况下,这些输入还会导致 MATLAB 函数在 MATLAB 中失败。请提供与运行 MATLAB 函数所用的生成的 MEX 函数相同的输入。
运行时类型或大小不匹配 - 您在运行时提供给 MEX 函数的输入与您在代码生成期间指定的输入类型不一致。要解决此问题,请使用代码生成报告将生成的代码中的变量定义与您在运行时传递的变量进行比较。修改您的 MATLAB 入口函数以适应您要在运行时传递的输入,并相应地重新指定输入类型。请参阅指定入口函数输入的类型。
可变大小数据 - 生成的代码中的一个或多个变量在 MEX 执行期间更改大小,并且代码生成器对这些变量的大小所做的某些假设被运行时输入证伪。要了解可用于解决此类错误的方法,请参阅可变大小数组的代码生成。
要了解有关调试 MEX 函数的最佳做法的更多信息,请参阅调试生成的 MEX 代码。