Main Content

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 模块变量。如果您在 coder.varsize 声明中提供上界,则上界必须与属性检查器中的上界相匹配。

有关其他限制和规范,请参阅限制提示

示例

coder.varsize(varName1,...,varNameN,ubounds) 还为变量的每个维度指定上界。所有变量必须具有相同的维数。除单一维度外,所有维度都允许更改大小。

示例

coder.varsize(varName1,...,varNameN,ubounds,dims) 还指定变量每个维度的上界,以及每个维度是固定大小还是可变大小。如果某个维度具有固定大小,则对应的 ubound 元素指定该维度的固定大小。所有变量都有相同的固定大小维度和可变大小维度。

代码生成器使用冒号前缀来表示可变大小维度。例如,如果数组 A 的大小表示为 3x:5x:Inf,则:

  • 第一个维度具有固定大小 3

  • 第二个维度为可变大小,上界为 5

  • 第三个维度为可变大小且无界

示例

全部折叠

使用(读取)变量后,更改该变量的大小会导致大小不匹配错误。使用 coder.varsize 指定变量的大小可以更改。

以下函数的代码生成会产生大小不匹配错误,因为在 y = size(x) 行使用 x 后,x = 1:10 会更改 x 的第二个维度的大小。

function [x,y] = usevarsize(n)
%#codegen
x = 1;
y = size(x);
if n > 10
    x = 1:10;
end

要声明 x 可以更改大小,请使用 coder.varsize

function [x,y] = usevarsize(n)
%#codegen
x = 1;
coder.varsize('x');
y = size(x);
if n > 10
    x = 1:10;
end

如果您删除 y = size(x) 行,则不再需要 coder.varsize 声明,因为 x 在其大小更改之前不会被使用。

指定 A 是大小为 1x:20 的行向量。这表示 A 的第二个维度的大小可变且上界为 20。

function fcn()
...
coder.varsize('A',[1 20]);
...
end

当您不提供 dims 时,除单一维度外,所有维度都具有可变大小。

指定 A 是大小为 3x:20 的数组。这表示其第一个维度具有固定大小 3,第二个维度具有可变大小且上界为 20。

function fcn()
...
coder.varsize('A',[3 20], [0 1] );
...
end

在此函数中,语句 coder.varsize('data.values') 声明 data 的每个元素内的字段 values 具有可变大小。

function y = varsize_field()
%#codegen

d = struct('values', zeros(1,0), 'color', 0);
data = repmat(d, [3 3]);
coder.varsize('data.values');

for i = 1:numel(data)
    data(i).color = rand-0.5;
    data(i).values = 1:i;
end

y = 0;
for i = 1:numel(data)
    if data(i).color > 0
        y = y + sum(data(i).values);
    end
end

指定元胞数组 C 的第一个维度具有固定大小,第二个维度具有可变大小且上界为 3。coder.varsize 声明必须先于 C 的首次使用。

...
C = {1 [1 2]};
coder.varsize('C', [1 3], [0 1]);
y = C{1};
...
end

在没有 coder.varsize 声明的情况下,C 是异构元胞数组,其元素具有相同的类,但大小不同。在有 coder.varsize 声明的情况下,C 是同构元胞数组,其元素具有相同的类和最大大小。

  • 元胞数组 C 的大小为 1x:3。冒号表示 C 的第二个维度为可变大小,上界为 3。

  • C 的每个元素均为一个 1x:2 数组。

指定元胞数组 C 的元素是 1x:5 向量。这表示每个元素的第一个维度具有固定大小,第二个维度具有可变大小且上界为 5。

...
C = {1 2 3};
coder.varsize('C{:}', [1 5], [0 1]);
C = {1, 1:5, 2:3};
...

您还可以将元胞数组的特定元素指定为可变大小。例如,在 1×3 元胞数组 x 中,将第一个元素 x{1} 声明为 1x:10 行向量。

...
x = {1,2,3};
coder.varsize('x{1}', [1 10]);
...

输入参数

全部折叠

要声明为具有可变大小的变量的名称,指定为一个或多个字符向量或字符串标量。

示例: coder.varsize('x','y')

数组维度的上界,指定为由整数常量组成的向量。

如果没有指定 ubounds,代码生成器会计算每个变量的上界。如果 ubounds 元素对应于固定大小维度,则值是该维度的固定大小。

示例: coder.varsize('x','y',[1 2])

指示每个维度具有固定大小还是可变大小,指定为逻辑向量。对应于 dims 中的 0 或 false 的维度具有固定大小。对应于 1 或 true 的维度具有可变大小。

当没有指定 dims 时,除单一维度之外,其他维度都具有可变大小。

示例: coder.varsize('x','y',[1 2], [0 1])

限制

  • 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 (MATLAB Coder) 指定输入参量具有可变大小。或者,通过使用 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

      请参阅使用 cell 定义可变大小元胞数组

      要指定元胞数组的上界,请使用 coder.varsize

      function mycell(n)
      %#codegen
      x = cell(1,n);   
      for i = 1:n
          x{i} = i;
      coder.varsize('x',[1,20]);
      end
      end

详细信息

全部折叠

单一维度

满足 size(A,dim) = 1 的维度。

提示

  • 在代码生成报告或 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 中推出