代码生成的单元格数组限制
当你在MATLAB中使用单元格数组时®用于代码生成的代码,必须遵守以下限制:
单元格数组元素赋值
在使用单元格数组元素之前,必须在所有执行路径上分配它。例如:
函数Z = foo(n)% # codegenC = cell(1,3);如果N < 1 c{2} = 1;其他的C {2} = n;结束Z = c{2};结束
代码生成器考虑将单元格数组传递给函数或从函数返回它作为使用单元格数组的所有元素。因此,在将单元格数组传递给函数或从函数返回它之前,必须为单元格数组的所有元素赋值。例如,以下代码是不允许的,因为它没有将值赋给c {2}
而且c
是函数输出。
函数C = foo()% # codegenC = cell(1,3);C {1} = 1;C {3} = 3;结束
元素的赋值必须在所有执行路径上保持一致。以下代码是不允许的,因为y {2}
在一个执行路径上为double,在另一个执行路径上为char。
函数Y = foo(n) Y = cell(1,3)如果N > 1;Y {1} = 1 Y {2} = 2;Y {3} = 3;其他的Y {1} = 10;y {2} =“一个”;Y {3} = 30;结束
可变大小的单元格数组
coder.varsize
异构单元格数组金宝app不支持。如果你使用
细胞
函数定义固定大小的单元格数组,不能使用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;结束结束
若要指定单元格数组的上界,请使用
coder.varsize
.函数mycell (n)% # codegenX = cell(1,n);为I = 1:n x{I} = I;coder.varsize (“x”, 1, 20);结束结束
使用定义可变大小单元格数组细胞
对于代码生成,在使用单元格数组元素之前,必须为其赋值。当你使用细胞
例如,要创建一个可变大小的单元格数组,细胞(1,n)
, MATLAB为每个元素赋一个空矩阵。但是,对于代码生成,元素是未赋值的。用于代码生成,在您使用细胞
若要创建可变大小的单元格数组,必须在使用单元格数组之前为单元格数组的所有元素赋值。例如:
函数Z = mycell(n, j)% # codegenAssert (n < 100);X = cell(1,n);为I = 1:n x{I} = I;结束Z = x{j};结束
代码生成器分析代码,以确定是否在第一次使用单元格数组之前分配了所有元素。如果代码生成器检测到某些元素没有被赋值,代码生成将失败,并显示错误消息。例如,修改为
循环,j
.
函数Z = mycell(n, j)% # codegenAssert (n < 100);X = cell(1,n);为I = 1:j%<-此处修改X {i} = i;结束Z = x{j};结束
通过这个修改和输入j
不到n
,该函数不会为所有单元格数组元素赋值。代码生成产生错误:
无法确定'x{:}'的每个元素都在该行之前赋值。
有时,即使您的代码分配了单元格数组的所有元素,代码生成器也会报告此消息,因为分析并没有检测到所有元素都已分配。看到无法确定单元格数组的每个元素都已分配.
为了避免这种错误,请遵循以下指南:
当你使用
细胞
要定义一个可变大小的单元格数组,请按照以下模式编写代码:函数Z = mycell(n, j)% # codegenAssert (n < 100);X = cell(1,n);为I = 1:n x{I} = I;结束Z = x{j};结束
下面是多维单元格数组的模式:
函数Z = mycell(m,n,p)% # codegen断言(m < 100);Assert (n < 100);断言(p < 100);X = cell(m,n,p);为I = 1:m为j = 1: n为K = 1:p x{i,j, K} = i+j+ K;结束结束结束Z = x{m,n,p};结束
递增或递减循环计数器
1
.在一个循环或一组嵌套循环中定义单元格数组。例如,以下代码是不允许的:
函数Z = mycell(n, j) assert(n < 50);Assert (j < 50);X = cell(1,n);为I = 1:5 x{I} = 5;结束为I = 6:n x{I} = 5;结束Z = x{j};结束
对单元格尺寸和循环初始值和结束值使用相同的变量。例如,以下代码的代码生成失败,因为单元格创建使用
n
循环结束值使用米
:函数Z = mycell(n, j) assert(n < 50);Assert (j < 50);X = cell(1,n);M = n;为I = 1:m x{I} = 2;结束Z = x{j};结束
重写要使用的代码
n
对于创建单元格和循环结束值:函数Z = mycell(n, j) assert(n < 50);Assert (j < 50);X = cell(1,n);为I = 1:n x{I} = 2;结束Z = x{j};结束
用下面的模式创建单元格数组:
X = cell(1,n)
通过使用所需的单元格初始化临时变量,将单元格数组分配给结构的字段或对象的属性。例如:
T = cell(1,n)为I = 1:n t{I} = I +1;结束myObj。Prop = t;
myObj。Prop = cell(1,n);为i = 1:n myObj。{i} = i+1;结束
请勿使用
细胞
函数在单元格数组构造函数中{}
.例如,以下代码是不允许的:X = {cell(1,n)};
单元格数组的创建和为单元格数组元素赋值的循环必须一起在唯一的执行路径中。例如,以下代码是不允许的。
函数Z = mycell(n) assert(n < 100);如果N > 3c = cell(1, N);其他的C = cell(n,1);结束为I = 1:n c{I} = I;结束Z = c{n};结束
若要修复此代码,请将赋值循环移动到创建单元格数组的代码块内部。
函数Z = cellerr(n) assert(n < 100);如果N > 3c = cell(1, N);为I = 1:n c{I} = I;结束其他的C = cell(n,1);为I = 1:n c{I} = I;结束结束Z = c{n};结束
单元格数组索引
使用圆括号不能索引单元格数组
()
.考虑使用花括号索引单元格数组{}
以访问单元格的内容。必须通过使用常量索引或使用
为
-具有常量边界的循环。例如,以下代码是不允许的。
X = {1,“mytext”};disp (x {randi});
中异构单元格数组的索引
为
-循环具有常量边界,因为代码生成器展开循环。展开为每个循环迭代创建一个单独的循环体副本,这使得每个循环迭代中的索引为常数。然而,如果为
-loop的代码体较大或迭代次数较多,展开会增加编译时间并生成低效代码。如果
一个
而且B
常量,下面的代码显示索引到异构单元格数组在为
-循环常量边界。X = {1,“mytext”};为i = A:B disp(x{i});结束
使用{end + 1}扩展单元格数组
培养细胞阵列X
,你可以使用X{end + 1}
.例如:
...X = {1 2};X{end + 1} =“一个”;...
当你使用{end + 1}
要生长单元格数组,请遵循以下限制:
在一个MATLAB函数阻挡,不使用
{end + 1}
在一个为
循环。只使用
{end + 1}
.不要使用{end + 2}
,{end + 3}
等等。使用
{end + 1}
只用向量。例如,以下代码是不允许的,因为X
是矩阵,而不是向量:...X = {1 2;3 4};X{end + 1} = 5;...
使用
{end + 1}
只有一个变量。在下面的代码中,{end + 1}
不会引起{1 2 3}
生长。在本例中,代码生成器处理{end + 1}
作为进入的越界索引X {2}
....X = {“一个”{1 2 3}};X{2}{end + 1} = 4;...
当
{end + 1}
在循环中增长单元格数组,单元格数组必须是可变大小的。因此,单元格数组必须是均匀.允许此代码是因为
X
是均匀的。...X = {1 2};为i=1:n X{end + 1} = 3;结束...
这个代码是不允许的,因为
X
是异构的。...X = {1“一个”2“b”};为i=1:n X{end + 1} = 3;结束...
单元格数组内容
单元格数组不能包含mxarrays
.在单元格数组中,不能存储外部函数返回的值。
传递单元格数组到外部C/ c++函数
不能将单元格数组传递给coder.ceval
.的输入参数coder.ceval
,将变量定义为数组或结构,而不是单元格数组。
用在MATLAB函数块
不能在Simulink中使用单元格数组金宝app®信号、参数或数据存储内存。