文档

为代码生成定义可变大小的数据

对于代码生成,在操作中使用变量或将它们作为输出返回之前,必须为它们分配特定的类、大小和复杂性。通常,在初始赋值之后,不能重新赋值变量属性。因此,在为变量或结构字段赋值固定大小后,试图增大变量或结构字段可能会导致编译错误。在这些情况下,必须使用这些方法之一显式地将数据定义为可变大小。

方法 看到

从可变大小的矩阵构造函数中赋值数据,例如:

使用具有非常数维的矩阵构造函数
在使用(读取)该变量之前,为该变量指定多个常量大小。 给同一个变量分配多个大小
将变量的所有实例定义为变量大小。 使用coder.varsize显式定义可变大小的数据

使用具有非常数维的矩阵构造函数

您可以使用具有非常量维数的构造函数来定义可变大小的矩阵。例如:

函数s = var_by_assign (u)% # codegeny = 1 (u);s =元素个数(y);

如果不使用动态内存分配,还必须添加断言语句以提供维度的上界。例如:

函数s = var_by_assign (u)% # codegen断言(u < 20);y = 1 (u);s =元素个数(y);

给同一个变量分配多个大小

在你的代码中使用(读取)一个变量之前,你可以通过给它分配多个常量大小来使它变成可变大小。当代码生成器在堆栈上使用静态分配时,它会根据为每个维度指定的最大大小推断出上限。当您在所有赋值中为给定维度分配相同的大小时,代码生成器假定维度固定为该大小。作业可以指定不同的形状和大小。

当代码生成器使用动态内存分配时,它不检查上界。它假定可变大小的数据是无界的。

从不同形状的多个定义推断上界

函数s = var_by_multiassign (u)% # codegen如果(u > 0) y = ones(3,4,5);其他的y = 0 (3,1);结束s =元素个数(y);

当代码生成器使用静态分配时,它推断y是一个三维矩阵:

  • 第一个尺寸固定为3

  • 第二个维度是可变尺寸,上限为4

  • 第三个维度是可变尺寸,上界为5

当代码生成器使用动态分配时,它会分析y不同:

  • 第一个尺寸固定为3。

  • 第二和第三维度是无界的。

使用coder.varsize显式定义可变大小的数据

要显式定义可变大小的数据,请使用该函数coder.varsize.还可以指定哪些维度随它们的上界而变化。例如:

  • 定义B作为一个可变大小的二维数组,其中每个维度的上限为64。

    coder.varsize ('B', [64 64]);

  • 定义B作为一个可变大小的数组:

    coder.varsize (B);

    当你只提供第一个参数时,coder.varsize假设所有的维度B它的上界是多少大小(B)

如果一个MATLAB函数块输入或输出信号是可变大小的,在端口和数据管理器中,您必须指定信号是可变大小的。您还必须提供上界。你不必使用coder.varsize的内部对应的输入或输出变量MATLAB函数块。但是,如果您指定的上界为coder.varsize,它们必须匹配端口和数据管理器中的上界。

指定哪些维度变化

你可以使用这个函数coder.varsize来指定哪些维度不同。例如,下面的语句定义B数组的第一个维度固定为2,但第二个维度可以增长为16:

coder.varsize ('B',[2, 16],[0 1])

第三个参数指定哪些维度是可变的。这个参数必须是一个逻辑向量或只包含0和1的双向量。对应于零或的维度有固定大小。对应于1或的维度真正的大小不同。coder.varsize通常将尺寸1的尺寸视为固定的。看到定义具有单维的可变大小矩阵

对于输入或输出信号,如果指定coder.varsizeMATLAB函数块中,它们必须匹配端口和数据管理器中的上界。

允许变量在定义固定维度后增长

函数var_by_if定义了矩阵Y与固定的2 × 2尺寸前的第一次使用(其中声明Y = Y + u读取从Y).然而,coder.varsize定义了Y作为一个可变大小的矩阵,允许它根据决策逻辑改变大小其他的条款:

函数Y = var_by_if (u)% # codegen如果(u > 0) Y = 0 (2,2);coder.varsize (“Y”);如果(u < 10) Y = Y + u;结束其他的Y = 0 (5,5);结束

没有coder.varsize,代码生成器进行推断Y是一个固定大小的2 × 2矩阵。它产生一个大小不匹配错误。

定义具有单维的可变大小矩阵

单元素维度是指大小(暗)= 1。单例尺寸在以下情况下是固定的:

  • 指定一个上限为1 in的维度coder.varsize表达式。

    例如,在这个函数中,Y行为像一个具有可变尺寸维度的向量:

    函数Y = dim_singleton (u)% # codegenY = [1 2];coder.varsize (“Y”10 [1]);如果(u > 0) Y = [Y 3];其他的Y = [Y u];结束

  • 通过使用矩阵构造函数表达式或矩阵函数,用单维初始化可变大小的数据。

    例如,在这个函数中,XY表现得像向量,只有第二个维度是可变大小的。

    函数(X, Y) = dim_singleton_vects (u)% # codegenY = 1(1、3);X = [1 4];coder.varsize (“Y”“X”);如果(u > 0) Y = [Y u];其他的X = [X u];结束

您可以使用coder.varsize显式地指定单个维度的变化。例如:

函数Y = dim_singleton_vary (u)% # codegenY = [1 2];coder.varsize (“Y”, [1 10], [1 1]);如果(u > 0) Y = [Y Y+u];其他的Y = [Y Y*u];结束

在这个例子中,的第三个参数coder.varsize是一个1的向量,表示每个维度Y不同的大小。

定义可变大小的结构字段

要将结构字段定义为可变大小的数组,请使用冒号()作为索引表达式。冒号()表示数组的所有元素都是可变大小的。例如:

函数y = struct_example ()% # codegend =结构(“值”0 (1,0),“颜色”, 0);数据= repmat(d, [3 3]);coder.varsize (“数据(:). values”);I = 1:numel(data) data(I)。颜色=兰德- 0.5;数据(我)。值= 1:i;结束y = 0;i = 1:元素个数(数据)如果数据(我)。颜色> 0 y = y + sum(data(i).values);结束结束

表达式coder.varsize(“数据(:). values”)定义了字段在矩阵的每个元素中数据适应。

以下是其他例子:

  • coder.varsize(从(:)。b)

    在这个例子中,数据是包含矩阵的标量变量吗一个.矩阵的每个元素一个包含可变大小的字段B

  • coder.varsize(“数据(:)。(:)。b”)

    这个表达式定义字段B在矩阵的每个元素中一个在矩阵的每个元素中数据适应。

另请参阅

相关的话题