Main Content

可变大小数组的代码生成

对于代码生成,数组维度为固定大小可变大小。如果代码生成器可以确定维度的大小并且维度的大小不会更改,则维度为固定大小。当数组的所有维度都是固定大小时,该数组是固定大小数组。在以下示例中,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 将变量的所有实例声明为可变大小

有关详细信息,请参阅为代码生成定义可变大小数据

您可以控制是否允许使用可变大小数组进行代码生成。请参阅启用和禁用对可变大小数组的支持

可变大小数组的内存分配

对于其大小小于阈值的固定大小数组和可变大小数组,代码生成器在堆栈上静态分配内存。对于无界可变大小数组和其大小大于或等于阈值的可变大小数组,代码生成器在堆上动态分配内存。

您可以控制是否允许动态内存分配,以及何时在代码生成中使用动态内存分配。请参阅Control Memory Allocation for Variable-Size Arrays

代码生成器将动态分配的数据表示为一种称为 emxArray 的结构体类型。代码生成器生成工具函数,这些函数用于创建 emxArray 并与之交互。如果您使用 Embedded Coder®,则可以自定义 emxArray 类型和工具函数的生成标识符。请参阅Identifier Format Control (Embedded Coder)

启用和禁用对可变大小数组的支持

默认情况下,对可变大小数组的支持处于启用状态。要修改此支持,请执行下列操作:

  • 在代码配置对象中,将 EnableVariableSizing 参数设置为 truefalse

代码生成报告中的可变大小数组

通过查看代码生成报告中变量选项卡的大小列,可以判断数组是固定大小还是可变大小。

This image shows a code generation report with several kinds of sizes for the second dimension of four arrays. The second dimension of y is fixed-size, A is variable-size, n is fixed-size, and X is unbounded and variable-size.

冒号 (:) 表示维度为可变大小。问号 (?) 表示大小为无界。例如,大小为 1×:? 表示第一个维度的大小是固定大小 1,第二个维度的大小是无界可变大小。斜体表示代码生成器生成的是可变大小数组,但数组的大小在执行期间不会更改。

This image shows a code generation report with several kinds of sizes for the second dimension of three arrays. y is variable-size, n is fixed-size, and Z is variable-size but did not change size during execution.

相关主题