主要内容

为可变大小数组使用动态内存分配MATLAB函数

示例中如何为可变大小的数组使用动态内存分配MATLAB函数块。动态内存分配在运行时根据需要在堆上分配内存,而不是在堆栈上静态分配内存。动态内存分配在以下情况下是有益的:

  • 你不知道数组的上界。

  • 您不希望在堆栈上为大型数组分配内存。

对象的本地数组只能使用动态内存分配MATLAB函数块。

不能在以下情况下使用动态内存分配:

  • 输入和输出信号。可变大小的输入和输出信号必须有一个上限。

  • 参数或全局变量。参数和全局变量必须是固定大小的。

  • 总线数组的字段。总线数组不能具有可变大小的字段。

  • 对象关联的系统对象的离散状态属性MATLAB系统块。

创建模型

创建这个Simulink金宝app模型MATLAB函数块使用无界可变大小数组。

此图像显示了您创建的模型。MATLAB函数块使用常量块作为输入,使用输出端口作为输出。

  1. 创建一个Simul金宝appink®模型mymodel

  2. 添加一个MATLAB函数块到模型。

  3. MATLAB函数块,添加以下代码:

    函数s = myfcn(n) Z = rand(1,n);s = sum(Z);结束
  4. 添加一个常数块的左边MATLAB函数块。

  5. 添加一个外港块的右边MATLAB函数块。

  6. 连接积木。

配置动态内存分配模型

中的可变大小数组,确保您将模型配置为使用动态内存分配MATLAB函数块。在“配置参数”对话框中,单击仿真目标>高级参数类别,确保:

  • MATLAB函数中的动态内存分配复选框。

  • 动态内存分配阈值的MATLAB函数默认值65536。

使用动态内存分配模拟模型

  1. 模拟模型。

  2. 在MATLAB函数编辑器中,打开MATLAB®功能报告,点击功能报告

    变量选项卡显示了这一点Z是1 ×:?数组中。冒号(:)表示第二个维度是可变大小的。问号(?)表示第二个维度是无界的。

模拟必须使用动态内存分配进行Z因为二次元Z没有上限。

为有界数组使用动态内存分配

当数组是无界的时,代码生成器必须使用动态内存分配。如果数组是有界的,则只有当数组大小(以字节为单位)大于或等于动态内存分配阈值时,代码生成器才使用动态内存分配。该阈值的默认值是65536。

动态内存有运行时性能代价。通过控制它的使用,可以提高执行速度。

如果你Z一个大小大于阈值的有界可变大小数组,代码生成器使用动态内存分配Z.例如:

  1. mymodel、修改myfcnZ上限为500。

    函数S = myfcn(n) assert(n < 500);Z = rand(1,n);s = sum(Z);结束

  2. 模拟模型。

    在MATLAB函数报告中,你们可以看到Z是1 ×:500数组。它是可变大小的,上限为500。

  3. 将动态内存分配降低到一个小于或等于的值4000的大小,以字节为单位Z.在“配置参数”对话框中,单击仿真目标>高级参数类别,设置动态内存分配阈值的MATLAB函数参数为4000。

  4. 模拟模型。

    代码生成器使用动态内存分配,因为的大小Z等于动态内存分配阈值4000。

生成使用动态内存分配的C代码

如果你有金宝app仿真软件编码器™,您可以为该模型生成C代码。然后,您可以看到代码生成器如何表示动态分配的数组。

  1. 配置模型以使用固定步骤求解器。在“配置参数”对话框中,单击解算器窗格中,在解算器的选择

    • 类型中,选择固定步

    • 解算器中,选择离散(无连续状态)

  2. 配置模型以创建和使用代码生成报告。在“配置参数”对话框中,单击代码生成>报告窗格中,选择创建代码生成报告而且自动打开报告

  3. 编辑中的代码MATLAB函数块,使其看起来像这样的代码:

    函数s = myfcn(n) Z = rand(1,n);s = sum(Z);结束

    Z是一个无界可变大小数组。

  4. 确保模型配置为动态内存分配:

    • MATLAB函数中的动态内存分配复选框。

    • 动态内存分配阈值的MATLAB函数默认值65536。

  5. 构建模型。

  6. 在代码生成报告中,打开mymodel.c.可以看出,代码生成器使用了动态内存分配Z因为你可以看到emxArray类型emxArray_real_T_mymodel_T而且emxArray实用函数,例如mymodel_emxInit_real_T.代码生成器使用emxArray为其内存被动态分配的变量键入。生成的代码使用emxArray的实用程序函数来管理emxArray年代。

如果你有嵌入式编码器®的标识符emxArray类型和实用函数。看到标识符格式控制(嵌入式编码)

相关的话题