主要内容

coder.varsize

声明可变大小的数据

描述

例子

coder.varsize (varName1,…,varNameN声明所命名的变量varName1,…,varNameN大小可变。声明指示代码生成器在执行生成的代码期间允许变量改变大小。使用此语法,您不需要指定变量维度的上限,也不需要指定哪些维度可以更改大小。代码生成器计算上界。所有尺寸,除了单维度,允许更改大小。

使用coder.varsize根据这些限制和指导方针:

  • 使用coder.varsize在MATLAB中®用于代码生成的函数。

  • coder.varsize声明必须在第一次使用变量之前。例如:

    ...X = 1;coder.varsize(“x”);disp(大小(x));...

  • 使用coder.varsize声明输出参数具有可变大小或处理大小不匹配错误。否则,要定义可变大小的数据,请使用为代码生成定义可变大小的数据

请注意

MATLAB函数块声明变量大小的输出变量时,使用符号窗格和属性检查器。看到声明可变大小的MATLAB函数块变量(模型).中提供上界coder.varsize声明时,上界必须与属性检查器中的上界匹配。

有关更多限制和指南,请参见限制而且提示

例子

coder.varsize (varName1,…,varNameNubounds还指定变量的每个维度的上限。所有变量的维数必须相同。所有尺寸,除了单维度,允许更改大小。

例子

coder.varsize (varName1,…,varNameNubounds会变暗还指定变量的每个维度的上限,以及每个维度的大小是固定的还是可变的。如果一个维度有固定的大小,那么对应的ubound元素指定维度的固定大小。所有变量都具有相同的固定大小维度和相同的可变大小维度。

例子

全部折叠

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

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

函数[x,y] = usevarsize(n)% # codegenX = 1;Y =大小(x);如果N > 10 x = 1:10;结束

声明x可以改变大小,使用吗coder.varsize

函数[x,y] = usevarsize(n)% # codegenX = 1;coder.varsize (“x”);Y =大小(x);如果N > 10 x = 1:10;结束

如果你去掉这条线Y =大小(x),你不再需要coder.varsize声明,因为x在其大小更改之前不使用。

指定一个是一个行向量,其第二个维度的大小可变,上限为20。

函数fcn ()...coder.varsize (“一个”20 [1]);...结束

当你不提供的时候会变暗,除了单维度外,所有维度的大小都是可变的。

指定一个是一个数组,其第一个维度的大小固定为3,第二个维度的大小可变,上限为20。

函数fcn ()...coder.varsize (“一个”,[3 20], [0 1]);...结束

在这个函数中,语句coder.varsize(“data.values”)声明字段的每个元素内部数据大小可变。

函数Y = varsize_field()% # codegenD = struct(“值”0 (1,0),“颜色”, 0);数据= repmat(d, [3 3]);coder.varsize (“data.values”);I = 1: number (data) data(I)Color = rand-0.5;数据(我)。值= 1:i;结束Y = 0;I = 1:数字(数据)如果数据(我)。Color > 0 y = y + sum(data(i).values);结束结束

指定单元格数组C具有固定大小的第一个维度和可变大小的第二个维度,其上限为3。的coder.varsize的声明必须在首次使用之前C

...C = {1 [1 2]};coder.varsize (“C”, [1 3], [0 1]);y = C{1};...结束

没有coder.varsize声明,C是异构单元格数组,其元素具有相同的类和不同的大小。与coder.varsize声明,C是一个同构单元格数组,其元素具有相同的类和最大大小。每个元素的第一个维度固定为1。每个元素的第二个维度的大小都是可变的,其上限为3。

指定单元格数组的元素C是具有固定大小的第一维和可变大小的第二维的向量,其上限为5。

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

输入参数

全部折叠

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

例子:coder.varsize (x, y)

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

当你不指定时ubounds,代码生成器计算每个变量的上界。如果ubounds元素对应于固定大小的维度,值为固定大小的维度。

例子:coder.varsize (“x”,'y',[1 2])

指示每个维度是具有固定大小还是作为逻辑向量指定的可变大小。对应于0或会变暗有固定的尺寸。对应于1或真正的大小可变。

当你不指定时会变暗,维度的大小是可变的,除了单维度。

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

限制

  • coder.varsize声明指示代码生成器允许更改变量的大小。它不会改变变量的大小。考虑下面的代码:

    ...X = 7;coder.varsize (“x”(1、5));disp(大小(x));...

    coder.varsize声明,x仍然是1乘1数组。的当前大小之外的元素不能赋值x.例如,这段代码产生一个运行时错误,因为索引3超过了的维度x

    ...X = 7;coder.varsize (“x”(1、5));X (3) = 1;...

  • coder.varsize函数输入参数不支持。而不是:

    • 如果函数是入口点函数,则通过使用指定输入参数具有可变大小coder.typeof在命令行。方法指定入口点函数输入参数具有可变大小定义输入类型应用程序的步骤。

    • 如果函数不是入口点函数,请使用coder.varsize在调用函数中,变量是被调用函数的输入。

  • 对于稀疏矩阵,coder.varsize删除可变大小维度的上界。

  • 使用限制coder.varsize使用单元格数组:

    • 单元格数组只有在同构的情况下才可以有可变大小。当你使用coder.varsize对于异构单元格数组,代码生成器试图使单元格数组同构。代码生成器试图找到适用于单元格数组的所有元素的类和最大大小。例如,考虑单元格数组C = {1, [2 3]}.这两个元素都可以用双类型表示,其第一个维度的大小固定为1,第二个维度的大小可变,上限为2。如果代码生成器无法找到公共类和最大大小,则代码生成失败。例如,考虑单元格数组C = {'a',[2 3]}.代码生成器无法找到可以表示这两个元素的类,因为第一个元素是字符第二个元素是

    • 如果你使用细胞函数定义固定大小的单元格数组,不能使用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])...

    • 控件创建可变大小的单元格数组细胞函数,使用以下代码模式:

      函数mycell (n)% # codegenX = cell(1,n);I = 1:n x{I} = I;结束结束

      看到用Cell定义可变大小的Cell数组

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

      函数mycell (n)% # codegenX = cell(1,n);I = 1:n x{I} = I;coder.varsize (“x”, 1, 20);结束结束

  • coder.varsize不支持:

    • 全局变量

    • MATLAB类或类属性

    • 字符串标量

更多关于

全部折叠

单维度

其中的维度size(A,dim) = 1

提示

  • 在代码生成报告或MATLAB函数报告中,冒号(:)表示维度大小可变。例如,大小为1 x: 2指示第一个维度的大小固定为1,第二个维度的大小可变,上限为2。

  • 如果你使用coder.varsize要指定维度的上限为1,默认情况下,维度的大小固定为1。属性的对应元素,可以指定维数为0(空数组)或1会变暗参数真正的.例如,此代码指定的第一个维度x固定大小为1,其他维度的大小为5。

    coder.varsize (“x”(1、5、5))

    的第一个维度x上限为1,大小可变(可以是0或1)。

    coder.varsize (“x”(1、5、5),(1,1,1))

    请注意

    对于一个MATLAB函数块,您不能指定大小为1的输出信号具有可变大小。

  • 如果使用输入变量或使用输入变量的计算结果来指定数组的大小,则在生成的代码中将其声明为variable-size。请勿重复使用coder.varsize除非您还想指定数组大小的上限。

  • 如果未指定上界coder.varsize声明和代码生成器无法确定上界时,生成的代码使用动态内存分配。动态内存分配可以降低生成代码的速度。为避免动态内存分配,可以通过提供ubounds论点。

版本历史

在R2011a中引入

Baidu
map