为可变大小数组使用动态内存分配MATLAB函数块
示例中如何为可变大小的数组使用动态内存分配MATLAB函数块。动态内存分配在运行时根据需要在堆上分配内存,而不是在堆栈上静态分配内存。动态内存分配在以下情况下是有益的:
你不知道数组的上界。
您不希望在堆栈上为大型数组分配内存。
对象的本地数组只能使用动态内存分配MATLAB函数块。
不能在以下情况下使用动态内存分配:
输入和输出信号。可变大小的输入和输出信号必须有一个上限。
参数或全局变量。参数和全局变量必须是固定大小的。
总线数组的字段。总线数组不能具有可变大小的字段。
对象关联的系统对象的离散状态属性MATLAB系统块。
创建模型
创建这个Simulink金宝app模型MATLAB函数块使用无界可变大小数组。
创建一个Simul金宝appink®模型
mymodel
.添加一个MATLAB函数块到模型。
在MATLAB函数块,添加以下代码:
函数s = myfcn(n) Z = rand(1,n);s = sum(Z);结束
添加一个常数块的左边MATLAB函数块。
添加一个外港块的右边MATLAB函数块。
连接积木。
配置动态内存分配模型
中的可变大小数组,确保您将模型配置为使用动态内存分配MATLAB函数块。在“配置参数”对话框中,单击仿真目标>高级参数类别,确保:
的MATLAB函数中的动态内存分配复选框。
的动态内存分配阈值的MATLAB函数默认值65536。
使用动态内存分配模拟模型
模拟模型。
在MATLAB函数编辑器中,打开MATLAB®功能报告,点击功能报告.
变量选项卡显示了这一点
Z
是1 ×:?数组中。冒号(:)表示第二个维度是可变大小的。问号(?)表示第二个维度是无界的。
模拟必须使用动态内存分配进行Z
因为二次元Z
没有上限。
为有界数组使用动态内存分配
当数组是无界的时,代码生成器必须使用动态内存分配。如果数组是有界的,则只有当数组大小(以字节为单位)大于或等于动态内存分配阈值时,代码生成器才使用动态内存分配。该阈值的默认值是65536。
动态内存有运行时性能代价。通过控制它的使用,可以提高执行速度。
如果你Z
一个大小大于阈值的有界可变大小数组,代码生成器使用动态内存分配Z
.例如:
在
mymodel
、修改myfcn
这Z
上限为500。函数S = myfcn(n) assert(n < 500);Z = rand(1,n);s = sum(Z);结束
模拟模型。
在MATLAB函数报告中,你们可以看到
Z
是1 ×:500数组。它是可变大小的,上限为500。将动态内存分配降低到一个小于或等于的值
4000
的大小,以字节为单位Z
.在“配置参数”对话框中,单击仿真目标>高级参数类别,设置动态内存分配阈值的MATLAB函数参数为4000。模拟模型。
代码生成器使用动态内存分配,因为的大小
Z
等于动态内存分配阈值4000。
生成使用动态内存分配的C代码
如果你有金宝app仿真软件编码器™,您可以为该模型生成C代码。然后,您可以看到代码生成器如何表示动态分配的数组。
配置模型以使用固定步骤求解器。在“配置参数”对话框中,单击解算器窗格中,在解算器的选择:
为类型中,选择
固定步
.为解算器中,选择
离散(无连续状态)
.
配置模型以创建和使用代码生成报告。在“配置参数”对话框中,单击代码生成>报告窗格中,选择创建代码生成报告而且自动打开报告.
编辑中的代码MATLAB函数块,使其看起来像这样的代码:
函数s = myfcn(n) Z = rand(1,n);s = sum(Z);结束
Z
是一个无界可变大小数组。确保模型配置为动态内存分配:
的MATLAB函数中的动态内存分配复选框。
的动态内存分配阈值的MATLAB函数默认值65536。
构建模型。
在代码生成报告中,打开
mymodel.c
.可以看出,代码生成器使用了动态内存分配Z
因为你可以看到emxArray
类型emxArray_real_T_mymodel_T
而且emxArray
实用函数,例如mymodel_emxInit_real_T
.代码生成器使用emxArray
为其内存被动态分配的变量键入。生成的代码使用emxArray
的实用程序函数来管理emxArray
年代。
如果你有嵌入式编码器®的标识符emxArray
类型和实用函数。看到标识符格式控制(嵌入式编码).