coder.varsize
声明可变大小数据
语法
说明
coder.varsize(
声明名为 varName1,...,varNameN
)varName1,...,varNameN
的变量具有可变大小。声明指示代码生成器允许变量在生成的代码执行期间更改大小。使用此语法,您不必指定变量维度的上界或哪些维度可以更改大小。代码生成器会计算上界。除单一维度外,所有维度都允许更改大小。
根据以下限制和规范使用 coder.varsize
:
在用于代码生成的 MATLAB® 函数中使用
coder.varsize
。coder.varsize
声明必须先于变量的首次使用。例如:... x = 1; coder.varsize('x'); disp(size(x)); ...
使用
coder.varsize
声明输出参量具有可变大小或解决大小不匹配错误。否则,要定义可变大小数据,请使用为代码生成定义可变大小数据中所述的方法。
注意
对于 MATLAB Function 模块,要声明可变大小的输出变量,请使用符号窗格和属性检查器。请参阅声明可变大小的 MATLAB Function 模块变量 (Simulink)。如果您在 coder.varsize
声明中提供上界,则上界必须与属性检查器中的上界相匹配。
coder.varsize(
还为变量的每个维度指定上界。所有变量必须具有相同的维数。除单一维度外,所有维度都允许更改大小。varName1,...,varNameN
,ubounds
)
coder.varsize(
还指定变量每个维度的上界,以及每个维度是固定大小还是可变大小。如果某个维度具有固定大小,则对应的 varName1,...,varNameN
,ubounds
,dims
)ubound
元素指定该维度的固定大小。所有变量都有相同的固定大小维度和可变大小维度。
代码生成器使用冒号前缀来表示可变大小维度。例如,如果数组 A
的大小表示为 3x:5x:Inf
,则:
第一个维度具有固定大小
3
第二个维度为可变大小,上界为
5
第三个维度为可变大小且无界
示例
输入参数
限制
coder.varsize
声明指示代码生成器允许变量的大小发生变化。它不会更改变量的大小。以如下代码为例:... x = 7; coder.varsize('x', [1,5]); disp(size(x)); ...
在
coder.varsize
声明后,x
仍然是 1×1 数组。您不能为超出x
的当前大小的元素赋值。例如,以下代码会产生运行时错误,因为索引 3 超出了x
的维数。... x = 7; coder.varsize('x', [1,5]); x(3) = 1; ...
函数输入参量不支持
coder.varsize
。在这种情况下:如果函数是入口函数,请在命令行中使用
coder.typeof
指定输入参量具有可变大小。或者,通过使用 App 的定义输入类型步骤,指定入口函数输入参量具有可变大小。如果函数不是入口函数,请在主调函数中使用
coder.varsize
,变量是被调函数的输入。
对于稀疏矩阵,
coder.varsize
会删除可变大小维度的上限。对元胞数组使用
coder.varsize
的限制:只有同构元胞数组才能具有可变大小。将
coder.varsize
用于异构元胞数组时,代码生成器会尝试使元胞数组的结构相同。代码生成器会尝试查找适用于元胞数组所有元素的类和最大大小。以元胞数组c = {1, [2 3]}
为例。两个元素都可以用双精度类型表示,其第一个维度具有固定大小 1,第二个维度具有可变大小且上界为 2。如果代码生成器找不到通用的类和最大大小,代码生成将失败。以元胞数组c = {'a',[2 3]}
为例。代码生成器找不到能够同时表示这两个元素的类,因为第一个元素是char
,第二个元素是double
。如果使用
cell
函数定义固定大小元胞数组,则无法使用coder.varsize
指定元胞数组具有可变大小。例如,以下代码会导致代码生成错误,因为x = cell(1,3)
使x
成为固定大小的 1×3 元胞数组。... x = cell(1,3); coder.varsize('x',[1 5]) ...
您可以将
coder.varsize
与使用花括号定义的元胞数组结合使用。例如:... x = {1 2 3}; coder.varsize('x',[1 5]) ...
要使用
cell
函数创建可变大小的元胞数组,请使用以下代码模式:function mycell(n) %#codegen x = cell(1,n); for i = 1:n x{i} = i; end end
请参阅为所有元胞数组元素赋值。
要指定元胞数组的上界,请使用
coder.varsize
。function mycell(n) %#codegen x = cell(1,n); for i = 1:n x{i} = i; coder.varsize('x',[1,20]); end end
coder.varsize
不支持:全局变量
MATLAB 类或类属性
字符串标量
详细信息
提示
在代码生成报告或 MATLAB 函数报告中,冒号 (:) 指示维度具有可变大小。例如,
1x:2
的大小表示第一个维度具有固定大小 1,第二个维度具有可变大小且上界为 2。如果使用
coder.varsize
指定一个维度的上界为 1,则默认情况下,该维度具有固定大小 1。要指定维度可以是 0(空数组)或 1,请将dims
参量的对应元素设置为true
。例如,以下代码指定x
的第一个维度具有固定大小 1,其他维度具有上界为 5 的可变大小。coder.varsize('x',[1,5,5])
而以下代码指定
x
的第一个维度的上界为 1 且大小可变(可以是 0 或 1)。coder.varsize('x',[1,5,5],[1,1,1])
如果使用输入变量(或使用输入变量进行计算的结果)指定数组的大小,则在生成的代码中会将其声明为可变大小。不要对该数组重用
coder.varsize
,除非您还要为其大小指定上界。如果没有用
coder.varsize
声明指定上界,并且代码生成器无法确定上界,则生成的代码使用动态内存分配。动态内存分配可能会降低生成的代码的速度。要避免动态内存分配,请通过提供ubounds
参量来指定上界。
版本历史记录
在 R2011a 中推出