可变大小数组的代码生成
对于代码生成,数组维度为固定大小或可变大小。如果代码生成器可以确定维度的大小并且维度的大小不会更改,则维度为固定大小。当数组的所有维度都是固定大小时,该数组是固定大小数组。在以下示例中,Z
是固定大小数组。
function Z = myfcn() Z = zeros(1,4); end
第一个维度的大小为 1,第二个维度的大小为 4。
如果代码生成器不能确定维度的大小,或者代码生成器确定大小发生了更改,则维度为可变大小。如果数组至少有一个维度的大小是可变的,则数组是可变大小数组。
可变大小维度可以有界,也可以无界。有界维度具有固定的大小上限。无界维度没有固定的大小上限。
在以下示例中,Z
的第二个维度为有界可变大小。它的上界为 16。
function s = myfcn(n) if (n > 0) Z = zeros(1,4); else Z = zeros(1,16); end s = length(Z);
在以下示例中,如果 n
的值在编译时未知,则 Z
的第二个维度为无界。
function s = myfcn(n) Z = rand(1,n); s = sum(Z); end
您可以通过以下方式定义可变大小数组:
使用具有非常量维度的构造函数(例如
zeros
)在使用之前为同一变量分配多个常量大小
使用
coder.varsize
将变量的所有实例声明为可变大小
有关详细信息,请参阅为代码生成定义可变大小数据。
您可以控制是否允许使用可变大小数组进行代码生成。请参阅启用和禁用对可变大小数组的支持。
可变大小数组的内存分配
对于其大小小于阈值的固定大小数组和可变大小数组,代码生成器在堆栈上静态分配内存。对于无界可变大小数组和其大小大于或等于阈值的可变大小数组,代码生成器在堆上动态分配内存。
对于 MATLAB Function 模块,动态内存分配不适用于以下参数。参数必须为固定大小。
您可以控制是否允许动态内存分配,以及何时在代码生成中使用动态内存分配。请参阅控制 MATLAB Function 模块中可变大小数组的内存分配。
代码生成器将动态分配的数据表示为一种称为 emxArray
的结构体类型。代码生成器生成工具函数,这些函数用于创建 emxArray 并与之交互。如果您使用 Embedded Coder®,则可以自定义 emxArray
类型和工具函数的生成标识符。请参阅Identifier Format Control (Embedded Coder)。
启用和禁用对可变大小数组的支持
默认情况下,对于 MATLAB Function 模块,启用对可变大小数组的支持。要禁用此支持,请执行以下操作:
在 MATLAB Function 模块编辑器中,选择编辑数据。
清除支持可变大小数组复选框。
MATLAB Function 报告中的可变大小数组
通过查看 MATLAB Function 报告中变量选项卡的大小列,可以判断数组是固定大小还是可变大小。
冒号 (:) 表示维度为可变大小。问号 (?) 表示大小为无界。例如,大小为 1×:? 表示第一个维度的大小是固定大小 1,第二个维度的大小是无界可变大小。斜体表示您的代码指定数组为可变大小,但代码生成器确定它不更改大小。