主要内容

coder.varsize

声明适应数据

描述

例子

coder.varsize (varName1,…,varNameN声明所命名的变量varName1,…,varNameN有一个可变的大小。该声明指示代码生成器允许变量在执行生成的代码期间更改大小。使用此语法,您不会指定变量维度的上限,也不会指定哪些维度可以更改大小。代码生成器计算上界。所有尺寸,除了单维度,则可更改大小。

使用coder.varsize根据这些限制和指南:

  • 使用coder.varsize在MATLAB®用于代码生成的函数。

  • coder.varsize第一次使用变量之前必须先声明。例如:

    …x=1;coder.varsize('x');disp(size(x))。。。

  • 使用coder.varsize声明输出参数具有可变大小或解决大小不匹配错误。否则,要定义可变大小数据,请使用中描述的方法为代码生成定义可变大小的数据

请注意

MATLAB函数块,以声明可变大小的输入或输出信号,使用端口和数据管理器。看见声明可变大小的输入和输出(金宝app模型)。如果您在coder.varsize声明时,上界必须与端口和数据管理器中的上界匹配。

有关更多限制和指导方针,请参见局限性提示

例子

coder.varsize (varName1,…,varNameN,ubounds还为变量的每个维度指定一个上限。所有变量必须具有相同的维数。所有维度,除了单维度,则可更改大小。

例子

coder.varsize (varName1,…,varNameN,ubounds,会变暗还指定变量的每个维度的上限,以及每个维度是固定大小还是可变大小。如果一个维度有一个固定的尺寸,那么相应的乌邦元素指定维度的固定大小。所有变量都具有相同的固定尺寸尺寸和相同的可变尺寸尺寸。

例子

全部崩溃

在变量被使用(读取)之后,改变变量的大小可能会导致大小不匹配错误。使用coder.varsize指定变量的大小可以更改。

以下函数的代码生成将产生大小不匹配错误,原因如下x=1:10更改的第二个维度的大小x排队后y =大小(x)使用x

函数[x,y]=usevarsize(n)% # codegenx=1;y=尺寸(x);如果N > 10 x = 1:10;结束

宣布x可以改变大小,使用coder.varsize

函数[x,y]=usevarsize(n)% # codegenx=1;coder.varsize(“x”);y =大小(x);如果N > 10 x = 1:10;结束

如果你去掉这条线y =大小(x),你不再需要coder.varsize声明,因为x在其大小更改之前不使用。

指定一个是一个行向量,其第2维的可变大小上限为20。

函数fcn ()...coder.varsize (“一个”20 [1]);...结束

当你不提供时会变暗,除了单维度外,所有维度的大小都是可变的。

指定一个是一个数组,其第一个维度的大小固定为3,第二个维度的大小可变,上限为20。

函数fcn ()...coder.varsize (“一个”,[3 20], [0 1]);...结束

在这个函数中,语句coder.varsize(“data.values”)声明字段每个元素的内部数据具有可变的大小。

函数y = varsize_field ()% # codegend=结构(“值”0 (1,0),“颜色”, 0); 数据=repmat(d[3]);变码器(“data.values”);i=1:numel(数据)数据(i)。颜色=rand-0.5;数据(i)。值=1:i;结束y = 0;i=1:numel(数据)如果数据(i).颜色>0y=y+sum(数据(i).值);结束结束

指定单元格数组C具有固定尺寸的第一维和可变尺寸的第二维,其上限为3。的coder.varsize声明必须在第一次使用之前C

...C = {1 [1 2]};coder.varsize (“C”, [1 3], [0 1]);y = C {1};...结束

没有coder.varsize声明,C是一个异构单元数组,其元素具有相同的类和不同的大小coder.varsize声明,C是其元素具有相同类和最大大小的齐次单元格数组。每个元素的第一维固定为1。每个元素的第2维都有一个上限为3的可变大小。

指定单元格数组的元素C是向量,第一维为固定尺寸,第二维为可变尺寸,上界为5。

...C = {1,2 3};coder.varsize (“C{:}”, [1 5], [0 1]); C={1,1:5,2:3};...

输入参数

全部崩溃

要声明为具有可变大小的变量名,指定为一个或多个字符向量或字符串标量。

例子:coder.varsize (x, y)

数组维数的上界,指定为整数常量向量。

当你没有指定ubounds,代码生成器计算每个变量的上限。如果ubounds元素对应于固定大小的维度,其值为该维度的固定大小。

例子:coder.varsize (“x”,'y',[1 2])

表示每个维度的大小是固定的还是可变的,指定为逻辑向量。对应于0或的维度错误的在里面会变暗有一个固定的尺寸。对应于1或的维度真正的有一个可变的大小。

当你没有指定会变暗,维度具有可变大小,但单个维度除外。

例子:coder.varsize('x','y',[12],[01])

局限性

  • coder.varsize声明指示代码生成器允许更改变量的大小。它不会更改变量的大小。考虑这个代码:

    ...x=7;编码器变量大小(“x”(1、5));disp(大小(x));...

    coder.varsize声明,x仍然是一个1乘1的数组。不能为超出当前大小的元素指定值x. 例如,此代码生成运行时错误,因为索引3超出了x

    ...x=7;编码器变量大小(“x”(1、5));x (3) = 1;...

  • coder.varsize函数输入参数不金宝app支持。而不是:

    • 如果函数是一个入口点函数,则使用编码员在命令行。方法指定入口点函数输入参数具有可变大小定义输入类型应用程序的步骤。

    • 如果函数不是入口点函数,请使用coder.varsize在调用函数中,变量是被调用函数的输入。

  • 对于稀疏矩阵,coder.varsize降低可变尺寸尺寸的上限。

  • 使用限制coder.varsize对于单元阵列:

    • 只有当单元格数组是同质的时,它才能具有可变大小coder.varsize对于异构单元数组,代码生成器尝试使单元数组同质化。代码生成器尝试查找应用于单元格数组所有元素的类和最大大小。例如,考虑单元格数组C = {1, [2 3]}这两个元素可以用一个双类型来表示,第一个维度的大小固定为1,第二个维度的上界为2,如果代码生成器找不到共同的类和最大的大小,则代码生成失败。C = {'a',[2 3]}. 代码生成器找不到可以表示这两个元素的类,因为第一个元素是烧焦第二个要素是双重的

    • 如果你使用单间牢房函数定义固定大小的单元格数组时,不能使用coder.varsize指定单元格数组具有可变大小。例如,这段代码会导致代码生成错误,因为x =细胞(1、3)使x一个固定大小,1 × 3单元阵列。

      ...x=单元(1,3);变码器(“x”[1 5])...

      你可以用coder.varsize使用花括号定义的单元格数组。例如:

      ...X = {1,2,3};coder.varsize (“x”[1 5])...

    • 方法创建大小可变的单元格数组单间牢房函数,使用以下代码模式:

      函数mycell (n)% # codegenx =细胞(1,n);I = 1:n x{I} = I;结束结束

      看到使用Cell定义可变大小的Cell Array

      要指定单元格数组的上界,请使用coder.varsize

      函数mycell (n)% # codegenx =细胞(1,n);i=1:nx{i}=i;变码器(“x”,[1,20]);结束结束

  • coder.varsize不支持:金宝app

    • 全局变量

    • MATLAB类或类属性

    • 字符串标量

更多关于

全部崩溃

单态维数

维度的大小(dim) = 1

提示

  • 在代码生成报告或MATLAB函数报告中,冒号(:)表示维度的大小是可变的。例如,大小1 x: 2指示第一个维度的固定大小为1,第二个维度的可变大小上限为2。

  • 如果你使用coder.varsize要指定维度的上界为1,默认情况下,维度的大小固定为1。要指定维度为0(空数组)或1,请设置会变暗参数真正的.例如,这段代码指定x固定尺寸为1,其他尺寸的可变尺寸为5。

    coder.varsize (“x”(1、5、5))

    相反,这段代码指定的第一个维度x上限为1,大小可变(可以是0或1)。

    coder.varsize (“x”(1、5、5),(1,1,1))

    请注意

    对于一个MATLAB函数块时,不能指定大小为1的输入或输出信号具有可变大小。

  • 如果使用输入变量或使用输入变量指定数组大小的计算结果,则在生成的代码中声明为variable-size。不重用coder.varsize在数组上,除非还希望为其大小指定上限。

  • 如果没有使用coder.varsize声明和代码生成器无法确定上限,生成的代码使用动态内存分配。动态内存分配可以降低生成代码的速度。要避免动态内存分配,请通过提供ubounds论点。

在R2011a中引入