主要内容

使用 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 生成过程中检测到的错误。在某些情况下,您可以通过更改代码配置设置或重新指定输入类型来修复错误。下表描述了在代码生成过程中可能遇到的一些常见错误,并提供一些建议的解决方案。

错误消息片段问题可能的解决方案

Array element element is out-of-bounds(数组元素 element 超出边界)

Code generation does not support creating arrays via indexing(代码生成不支持通过索引创建数组)

MATLAB 代码通过在现有索引边界之外赋值来创建或扩展数组。在 MATLAB 中,您可以通过给未定义的数组元素赋值来创建或增大数组。代码生成不支持这种数组创建和扩展方法。必须先定义矩阵,然后再为矩阵元素赋值。请参阅在对索引变量赋值之前定义矩阵
Unable to make this assignment because dimension dimension is fixed on the left side but variable size on the right(无法进行此赋值,因为维度 dimension 左侧是固定大小,而右侧是可变大小)MATLAB 代码将可变大小数组赋给定义为固定大小的变量。

使用以下方法之一解决此错误:

  • 通过使用显式索引强制变量具有相同大小。

  • 通过使用 coder.varsize 允许左侧的变量改变大小。

  • 如果不匹配是由可变大小数组的隐式扩展引起的,请禁用隐式扩展

请参阅解决错误:左侧是固定大小,而右侧是可变大小

Undefined function or variable 'name'(未定义的函数或变量 'name')MATLAB 代码使用对代码生成器来说未知的函数或变量。以下代码也可能在 MATLAB 执行中失败。在尝试生成代码之前,请确保您的代码在 MATLAB 中运行。

Function 'name' not supported for code generation(代码生成不支持函数 'name')

Method not supported for code generation(代码生成不支持的方法)

代码生成不支持 MATLAB 代码中的函数之一。

如果您的代码包含不支持的函数,请考虑以下解决方法之一:

  • 检查是否存在支持代码生成的替换函数和 System object。

  • 编写自定义 MATLAB 代码来替换不支持的函数。

  • 使用 coder.ceval 调用自定义 C 函数来替换不支持的函数。

  • 如果您不需要生成独立代码,请使用 coder.extrinsic 来调用不支持的函数。

有关这些解决办法的更多详细信息,请参阅解决错误:代码生成不支持函数

All variables must be fully defined before use(所有变量在使用前都必须完全定义)

All cell array elements must be fully defined before use(所有元胞数组元素在使用前必须完全定义)

代码生成器无法确定 MATLAB 代码中一个或多个变量的类型。在使用之前完全定义所有执行路径中的所有变量,包括元胞数组元素、结构体字段和类属性。请参阅解决问题:变量在使用前必须完全定义解决问题:元胞数组元素在使用前必须完全定义
Code generation does not support changing types through assignment(代码生成不支持通过赋值来更改类型)MATLAB 代码通过为变量赋予具有不同类或大小的值来更改变量的属性。对每个变量赋予一个固定的类。如果需要使用大小可变的变量,请参阅可变大小数组的代码生成。如果您需要在生成的代码中重用变量,请参阅通过不同属性重用同一变量

Arrays have incompatible sizes(数组大小不兼容)

Unable to perform this operation because the sizes of the arrays are incompatible(无法执行此运算,因为数组大小不兼容)

代码生成器在以下任一情况下可能会生成数组大小不兼容性错误:

  • MATLAB 代码更改了代码生成器先前定义为固定大小的变量的大小。

  • MATLAB 代码对大小不兼容的两个数组执行了运算。

要解决此错误,请尝试以下方法之一:

  • 通过使用 coder.varsize 指示代码生成器允许变量改变大小

  • 对兼容大小的数组执行二元运算。

请参阅解决错误:数组大小不兼容

另请参阅针对代码生成的 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 代码

另请参阅

|

主题