文档

coder.varsize

包:编码器

声明可变大小的数组

语法

coder.varsize (“var1“var2,……)
coder.varsize (“var1“var2、……ubound
coder.varsize (“var1“var2、……ubound会变暗
coder.varsize (“var1“var2、……[],会变暗

描述

coder.varsize (“var1“var2,……)将一个或多个变量声明为可变大小的数据,允许后续赋值扩展其大小。每一个“varn用引号括起来的变量或结构字段的名称。如果structure字段属于一个结构数组,则使用冒号()作为索引表达式,使数组中所有元素的字段大小可变。例如,表达式coder.varsize(“数据(:)。”)声明字段一个的每个元素中数据是可变大小的。

coder.varsize (“var1“var2、……ubound将一个或多个变量声明为可变大小的数据,并在中指定显式上界ubound。这个论点ubound必须是一个常数,每一个维度的上界大小的整数值向量“varn。如果您指定了多个“varn,每个变量必须具有相同的维数。

coder.varsize (“var1“var2、……ubound会变暗将一个或多个变量声明为变量大小,并具有显式的上界以及中指定的固定和变化维度的混合会变暗。这个论点会变暗是一个逻辑向量,或只包含0和1的双向量。维度对应于0或会变暗有固定的尺寸;维度对应于1或真正的大小不同。如果指定多个变量,则每个固定维度必须在所有维度中具有相同的值“varn

coder.varsize (“var1“var2、……[],会变暗将一个或多个变量声明为固定维度和可变维度的混合可变大小。空向量[]意味着你不需要指定一个显式的上界。

当你这样做的时候指定ubound,计算每个的上界“varn生成的代码。

当你这样做的时候指定会变暗,维度被假定为可变的,除了单例维度。单例维度是这样一种维度大小(暗)= 1。

您必须添加coder.varsize每次前的声明“varn被使用(读)。您可以在每个函数的第一个赋值之前添加声明“varn。但是,对于单元格数组元素,coder.varsize声明必须跟在元素的第一个赋值之后。例如:

…X = cell(3,3);X {1} = [12];coder.varsize (x) {1});...

你不能用coder.varsize在MATLAB之外®用于代码生成的代码。例如,下面的代码没有声明变量,var,作为可变大小的数据:

coder.varsize(“var”,10);codegen -config:lib MyFile -args var

相反,要包括coder.varsize声明内MyFile要申报的var可变大小的数据。或者,您可以使用coder.typeof要申报的var作为可变大小的外部MyFile。然后可以传递给MyFile在代码生成过程中使用arg游戏选择。有关更多信息,请参见coder.typeof

例子

全部折叠

写主函数test_stack发出命令,在堆栈上压入数据和从堆栈中弹出数据。

函数test_stack% # codegen指令%#codegen表示该函数%用于代码生成堆栈(“init”、32);I = 1: 20 stack()“推”,我);结束I = 1: 10 value = stack()“流行”);%显示弹出值价值结束结束

写本地函数堆栈执行push和pop命令。

函数Y = stack(command, varargin)持续的数据;如果Isempty (data) data = ones(1,0);结束Y = 0;开关(命令)情况下{“init”} coder.varsize (“数据”, [1, varargin{1}], [0 1]);Data = ones(1,0);情况下{“流行”} y = data(1);Data = Data (2:size(Data, 2));情况下{“推”} data = [varargin{1}, data];否则断言(假,“命令错误!”,命令);结束结束

的变量数据是堆栈。该声明coder.varsize (“数据”,[1, varargin{1}], [0 1])声明:

  • 数据是一个行向量

  • 它的第一个维度有一个固定的大小

  • 它的第二次元可以增长到32的上限

为的生成一个MEX函数test_stack

codegen配置:墨西哥人test_stack

codegen在当前文件夹中生成一个MEX函数。

运行test_stack_mex为了得到这些结果:

Value = 20 Value = 19 Value = 18 Value = 16 Value = 15 Value = 14 Value = 13 Value = 12 Value = 11

在运行时,堆栈中的项数从0增加到20,然后减少到10。

写一个函数struct_example声明了一个数组数据,其中每个元素都是一个包含可变大小字段的结构体:

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

该声明coder.varsize(“数据(:). values”)将字段标记为可变大小在矩阵的每个元素中数据

为的生成一个MEX函数struct_example

codegen配置:墨西哥人struct_example

运行struct_example

每次你奔跑struct_example你会得到一个不同的答案,因为这个函数用随机数加载数组。

编写函数make_varsz_cell它定义了一个局部单元格数组变量c其元素具有相同的类,但大小不同。使用coder.varsize为了表明c已经适应。

函数Y = make_varsz_cell() c = {1 [2 3]};coder.varsize (“c”, [1 3], [0 1]);Y = c;结束

生成一个C静态库。

codegen配置:自由make_varsz_cell报告

在报告中,查看MATLAB变量。

c是一个1x:3的均匀单元数组,其元素为1x:2 double。

编写函数mycell它定义了一个局部单元格数组变量c。使用coder.varsize构成…的元素c适应。

函数Y = mycell() c = {1 2 3};coder.varsize (“c{:}”, [15], [0 1]);Y = c;结束

生成一个C静态库。

codegen配置:自由mycell报告

在报告中,查看MATLAB变量。

的元素c是1 ×:5的双精度数组。

限制

  • 如果使用单元格函数创建细胞数组,不能使用coder.varsize用那个单元格数组。

  • 如果你使用coder.varsize的单元格数组元素coder.varsize声明必须跟在元素的第一个赋值之后。例如:

    …X = cell(3,3);X {1} = [12];coder.varsize (x) {1});...

  • 你不能用coder.varsize单元格阵列输入是异构的。

  • 你不能用coder.varsize使用全局变量。

  • 你不能用coder.varsize用MATLAB类的属性。

  • 你不能用coder.varsize用字符串标量。

提示

  • coder.varsize固定单个维度的大小,除非会变暗参数显式指定单例维度具有可变大小。

    例如,下面的代码指定了v尺寸为1 × 10。第一个维度(单例维度)具有固定的大小。第二个维度的大小是可变的。

    coder.varsize (“v”, [10])
    相反,下面的代码指定了这一点v尺寸:1 × 10。这两个维度的大小都是可变的。
    coder.varsize (“v”[1, 10], [1])

    请注意

    对于一个MATLAB函数输入或输出信号的块、单维不能有可变的大小。

  • 如果使用输入变量(或使用输入变量的计算结果)来指定数组的大小,则在生成的代码中将其声明为可变大小。不要使用coder.varsize除非您还想为其大小指定上界,否则再次对数组进行操作。

  • 使用coder.varsize在没有显式上界的数组上,会导致数组的动态内存分配。这种动态内存分配可以降低生成代码的速度。要避免动态内存分配,请使用语法coder.varsize (“var1“var2、……ubound指定数组大小的上限(如果您事先知道的话)。

  • 单元格数组只有在均匀的情况下才能可变大小。当你使用coder.varsize对于单元格数组,代码生成器将尝试使单元格数组同构。它试图找到适用于单元格数组的所有元素的类和大小。例如,如果第一个元素是double,第二个元素是1x2 double,那么所有元素都可以表示为1x:2 double。如果代码生成器找不到通用的类和大小,则代码生成失败。例如,假设单元格数组的第一个元素是char,第二个元素是double。代码生成器找不到可以表示这两个元素的类。

在R2011a中引入

这个话题有帮助吗?