对于代码生成,在操作中使用变量或将它们作为输出返回之前,必须为它们分配特定的类、大小和复杂性。通常,在初始赋值之后,不能重新赋值变量属性。因此,在为变量或结构字段赋值固定大小后,试图增大变量或结构字段可能会导致编译错误。在这些情况下,必须使用这些方法之一显式地将数据定义为可变大小。
方法 | 看到 |
---|---|
从可变大小的矩阵构造函数中赋值数据,例如: |
使用具有非常数维的矩阵构造函数 |
在使用(读取)该变量之前,为该变量指定多个常量大小。 | 给同一个变量分配多个大小 |
将变量的所有实例定义为变量大小。 | 使用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
.还可以指定哪些维度随它们的上界而变化。例如:
定义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.varsize
在MATLAB函数块中,它们必须匹配端口和数据管理器中的上界。
函数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];结束
通过使用矩阵构造函数表达式或矩阵函数,用单维初始化可变大小的数据。
例如,在这个函数中,X
和Y
表现得像向量,只有第二个维度是可变大小的。
函数(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
在矩阵的每个元素中一个
在矩阵的每个元素中数据
适应。