为可变大小的数组提供最大大小
要限制可变大小数组的数组大小,请执行以下操作之一:
-
如果指定数组大小的变量不是编译时常量,请使用
断言
语句,使用关系运算符约束变量。这样做可以帮助代码生成器确定数组的最大大小。下面的示例使用
断言
声明:-
定义一个函数
array_init
初始化数组y
输入变量N
:函数y = array_init (N) assert(N <= 25);% N > 25 .产生异常y = 0 (1,N);
的
断言
语句约束输入N
最大大小为25。在没有的时候断言
声明中,y
在生成的代码中分配一个指向数组的指针,从而允许动态内存分配。 -
定义一个函数,
array_init_from_prod
,它有两个输入变量,米
而且N
,并使用他们的乘积来指定数组的最大大小,y
.函数y = array_init_from_prod (M,N) size=M*N;断言(大小<= 25);%如果大小为> 25,则产生异常y = 0(1、大小);
的
断言
语句约束的乘积米
而且N
最多25个。或者,如果你限制
米
而且N
单独来说,它会导致动态内存分配:函数y = array_init_from_prod (M,N) assert(M <= 5);assert(N <= 5);大小= M * N;y = 0(1、大小);
这段代码导致动态内存分配,因为
米
而且N
都可以是无界的负值。因此,它们的乘积可以是无界的,而且是正的,即使它们各自的正值是有界的。提示
在变量用于指定数组大小之前,将assert语句放在变量上。
提示
你可以使用
断言
语句在大多数情况下限制数组大小。在展开循环中的数组时,如果循环运行的次数仅在运行时已知,则此策略将不起作用。 -
-
可以通过连接将数组扩展到超出初始大小的范围。在循环中连接其他元素时,有两个展开数组的语法规则。
-
如果初始化时数组的大小不是编译时常量,你可以通过连接其他元素来扩展它:
函数= ExpandArray(中)将数组扩展五个元素Out = 0 (1,in);为I =1:5 out = [out 0];结束
-
在连接元素之前,必须使用声明数组为可变大小
coder.varsize
:函数= ExpandArray ()将数组扩展五个元素Out = 0 (1,5);coder.varsize (“出”);为I =1:5 out = [out 0];结束
这两种情况都会导致动态内存分配。为了防止在这种情况下进行动态内存分配,请使用
coder.varsize
有明确的上界。这个例子展示了如何使用coder.varsize
具有显式上界:例1。使用编码器限制连接。用上界改变大小定义一个函数,
RunningAverage
的运行平均值N
-数组的元素子集:函数avg = RunningAverage (N)数组的元素被求平均NumArray=[1 6 8 2 5 3];初始化平均值:这也是函数输出的前两个元素avg = [0 0];在参数上设置一个边界coder.varsize (“平均”8 [1]);循环计算运行平均值为我= 1:N s = 0;s = s +总和(NumArray(1:我));avg = (avg s / i);根据连接的需要增加avg的大小结束
输出,
avg
,是一个可以根据需要展开以容纳运行平均值的数组。在计算新的运行平均值时,将其添加到数组中avg
通过连接,从而扩展数组。因为运行平均值的最大数目等于其中的元素数目
NumArray
的显式上界avg
在coder.varsize
声明。在这个例子中,上限是8(初始的两个元素加上的六个元素)NumArray
).为
RunningAverage
类型的输入参数双
:codegen配置:自由报告RunningAveragearg游戏2
在生成的代码中,
avg
分配一个大小为8的数组(静态内存分配)。的函数定义RunningAverage
如下所示(使用内置C类型):void RunningAverage (double N, double avg_data[8], int avg_size[2])
相比之下,如果删除显式的上限,则生成的代码将动态分配
avg
.替换语句
coder.varsize (“平均”8 [1]);
:
coder.varsize (avg);
为
RunningAverage
类型的输入参数双
:codegen配置:自由报告RunningAveragearg游戏2
在生成的代码中,
avg
分配一个指向数组的指针,从而允许动态分配内存。的函数定义RunningAverage
如下所示(使用内置C类型):void Test(double N, emxArray_real_T *avg)
请注意
动态内存分配也会发生
coder.varsize (avg)
使用下面的assert语句:assert(N < 6);
断言
语句不限制循环中的连接数。
-
-
该声明
Out =重塑(in,m,n,…)
取一个数组,在
,作为参数并返回数组,出
具有相同的元素在
,但被重塑为一个米
——- - - - - -n
——- - - - - -...
矩阵。如果其中一个大小变量m, n,…
.不是编译时的常量,那么动态分配内存呢出
发生。要避免动态内存分配,请使用
断言
在重塑
语句来限制大小变量m, n,…
来元素个数(中)
.这个例子展示了如何使用断言
语句之前重塑
声明:例2。将矩阵重新排列为给定的行数定义一个函数,
ReshapeMatrix
,它接受一个输入变量,N
,并对一个矩阵进行重塑,垫
,有N
行:函数[out1,out2] = ReshapeMatrix(N) mat = [1 2 3 4 5;4 5 6 7 8]因为mat有10个元素,N必须是10的因数%通过作为参数来重塑out1 =重塑(mat,N,[]);% N不受限制assert(N < number (mat));% N限制为mat中的元素数量out2 =重塑(mat,N,[]);
为
ReshapeArray
使用codegen
命令(input参数不必是10的因数):codegen -config:lib -report重塑数组-args
而
着干活
是动态分配的,out2
在生成的代码中分配一个大小为100 (=10 X 10)的数组。提示
如果您的系统内存有限,请不要使用
断言
这样说。对于一个n
-element矩阵,即断言
语句创建n
——- - - - - -n
矩阵,它可能很大。
相关的例子
更多关于
MATLAB命令
你点击了一个对应于这个MATLAB命令的链接:
在MATLAB命令窗口中输入该命令来运行该命令。Web浏览器不支持MATLAB命令。金宝app
您也可以从以下列表中选择一个网站:
如何获得最佳的网站性能
选择中国站点(中文或英文)以获得最佳站点性能。其他MathWorks国家站点没有针对您所在位置的访问进行优化。