指定入口点函数输入的属性

为什么必须指定输入属性

由于C和C ++是静态类型语言,MATLAB®编码器™必须在编译时确定在MATLAB文件中所有变量的性质。要在MATLAB文件推断变量属性,MATLAB编码器必须能够识别输入的属性功能,也被称为顶层入口点功能。因此,如果你的主要功能有输入,您必须指定这些输入的性能,MATLAB编码器。如果您的主函数没有输入参数,MATLAB编码器可以编译您的MATLAB文件,而无需修改。你并不需要指定的输入由主函数调用的本地函数或外部函数的性质。

如果您使用的符号(〜)字符来指定未使用功能的输入:

  • MATLAB编码器的项目,如果你想有一个不同的类型出现在生成的代码,指定类型。否则,输入默认为真,标双打。

  • 当生成代码与codegen,你必须指定使用这些输入类型-args选择。

属性来指定

如果您的主要功能有输入,你必须为每个输入以下属性。

对于 指定的属性
尺寸 复杂 numerictype fimath
定点输入

在结构输入的每个字段

根据其类为每个字段指定属性

其他投入

默认属性值

MATLAB编码器受让人的下列缺省值的主要功能的输入特性。

财产 默认的
尺寸 标量
复杂性 真正的
numerictype 无缺省值
fimath MATLAB默认fimath宾语

指定默认值的结构字段。在大多数情况下,当您没有显式地为属性指定值时,MATLAB编码器使用缺省值除了结构域。命名中的结构的字段的唯一方法是设置其属性中的至少一个。因此,您可能需要为结构域的属性指定默认值。举例来说,看到指定标量结构的类和大小指定结构数组的类和大小

为MEX函数指定默认的fimath值。使用以下命令生成的MEX函数MATLAB编码器使用默认fimath在编译时有效的值。如果没有指定默认值fimath值,MATLAB编码器使用MATLAB默认设置fimath。MATLAB的出厂默认具有以下特性:

RoundingMethod:最近OverflowAction:饱和和ProductMode:FullPrecision SumMode:FullPrecision CastBeforeSum:真
欲了解更多信息,请参阅fimath用于共享算术规则(定点设计师)。

当运行依赖于默认值的MEX函数时fimath价值,不要将您的MATLAB会话期间更改此值。否则,您会收到一个运行时警告,提醒您在编译时和运行时之间的不匹配fimath值。

例如,假设您定义下列功能的MATLAB测试

函数y =测试%#代码生成Y =音响(0);

这个函数测试构造一个科幻对象,而不显式地指定fimath对象。因此,测试依赖于默认值fimath在对象在编译时的效果。在MATLAB提示符下,生成MEX函数text_mex使用的出厂设置MATLAB默认的fimath

代码生成测试代码生成%生成MEX函数,test_mex,%在当前文件夹

接下来,运行test_mex来显示MATLAB默认的fimath值:

test_mex ANS = 0 DataTypeMode:定点:二进制点缩放符号性:签字字长:16 FractionLength:15

现在创建一个局部MATLABfimath价值。所以你不再使用默认设置:

F = fimath( 'RoundingMethod', '地面');

最后,从内存中清除MEX功能,然后重新运行它:

明确test_mex test_mex

错配检测并导致错误:

???与比当前的默认不同的默认fimath生成此功能。错误的==> test_mex

指定用于MEX功能的多个签名。若要从入口点函数生成多签名MEX函数,请提供多个-args规格为同一入口点函数。生成的MEX函数的工作与你的代码生成过程中提供多个签名。有关多重MEX的更多信息,请参阅生成一个MEX功能,支持多种签名万博1manbetx

万博1manbetx支持的类

下表列出的类名称的支持万博1manbetxMATLAB编码器

类名 描述
合乎逻辑 真值和假值的逻辑数组
烧焦 字符数组
int8 8位带符号整数数组
UINT8 8位无符号整数数组
INT16 16位带符号整数数组
UINT16 16位无符号整数数组
INT32 32位带符号整数数组
UINT32 32位无符号整数数组
Int64的 64位带符号整数数组
uint64 64位无符号整数数组
单精度浮点或定点数阵列
双精度浮点数或定点数数组
结构 结构数组
embedded.fi 定点数阵列

用于指定主要输入的属性的规则

当指定的主输入的性质,遵循下列规则:

  • 单元阵列中的元素的顺序必须对应于其中输入出现在主要功能签名的顺序。例如,单元阵列中的第一个元素定义所述第一主功能输入的属性。

  • 为了产生比那些发生在MATLAB函数参数的参数较少,指定只有您在生成的函数希望参数的数量属性。

  • 如果MATLAB函数有输入参数,要生成没有输入参数的函数,需要向其传递一个空单元格数组-args

  • 对于每个主功能输入其类是固定点(科幻),指定输入numerictypefimath属性。

  • 对于类为的每个主函数输入结构,请按其字段在结构定义中出现的顺序指定其每个字段的属性。

原发性输入的定义属性方法

方法 优势 缺点

指定使用App入口点函数输入的属性

  • 如果你在一个工作MATLAB编码器项目,方便使用

  • 不改变原来的MATLAB代码

  • MATLAB编码器保存在项目文件中的定义

  • 效率不高,用于指定内存密集型输入,诸如大的结构和阵列

通过定义实例输入属性在命令行

注意

如果你在MATLAB文件编程定义输入的属性,您不能使用此方法

  • 易于使用

  • 不改变原来的MATLAB代码

  • 设计用于原型具有少数初级输入的函数

  • 必须在命令行每次调用时指定codegen(除非使用脚本)

  • 效率不高,用于指定内存密集型输入,诸如大的结构和阵列

在MATLAB文件中定义输入属性编程

  • 与MATLAB代码集成;不需要在每次调用时重新定义属性MATLAB编码器

  • 提供物业规范的文档中的MATLAB代码

  • 有效用于指定内存密集型输入,诸如大型结构

  • 使用复杂的语法

  • MATLAB编码器项目文件目前不承认编程定义的属性。如果您使用的一个项目,你必须在项目重新输入的输入类型。

通过定义实例输入属性在命令行

命令行选项-args

codegen功能提供了一个命令行选项-args用于指定主(入口点)的功能的输入的性质如实施例的值或类型的单元阵列。单元阵列可以是恒定的值的变量或文字阵列。使用此选项,您在同一时间指定的输入的特性,你的MATLAB函数生成代码codegen

您可以将一个入口点函数的输出类型作为输入传递给另一个入口点函数。看到传递一个入口点函数的输出作为输入。有关指定单元格数组输入的信息,请参阅在命令行指定单元格数组输入

如果你有一个调用与所需类型的入口点MATLAB函数测试函数或脚本,您可以使用coder.getArgTypes以确定所述类型的功能的输入。coder.getArgTypes返回的单元格数组coder.Type对象可以传递到codegen使用-args选择。看到主要输入的指定常规属性对于codegen

您还可以创建coder.Type通过使用编码器类型编辑器交互的对象。看到通过使用编码器类型编辑器创建和编辑输入类型

规则使用-args选项

当使用-args命令行选项通过示例来定义特性,遵循以下规则:

  • 单元阵列中的元素的顺序必须对应于其中输入出现在主要功能签名的顺序。例如,单元阵列中的第一个元素定义所述第一主功能输入的属性。

  • 为了产生比那些发生在MATLAB函数参数的参数较少,指定只有您在生成的函数希望参数的数量属性。

  • 如果MATLAB函数有输入参数,要生成没有输入参数的函数,需要向其传递一个空单元格数组-args

  • 对于每个主功能输入其类是固定点(科幻),指定输入numerictypefimath属性。

  • 对于类为的每个主函数输入结构,请按其字段在结构定义中出现的顺序指定其每个字段的属性。

通过实例在命令行指定一个主输入的属性

考虑一个将两个输入相加的MATLAB函数:

函数y = mcf(u,v) %#codegen y = u + v;

下面的示例演示如何指定主要输入的不同属性üv通过例如在命令行:

  • 使用常量的字面电池阵列指定两个输入都是真正的标量双打:

    代码生成MCF -args {0,0}

  • 使用常量的文字单元格数组来指定输入ü是一个无符号的16位,1×4矢量和输入v是一个标量双:

    codegen mcf -args {0 (1,4,'uint16'),0}

  • 分配样本值到单元阵列变量来指定两个输入都是真实的,无符号的8位整数载体:

    一个= UINT8([1; 2; 3; 4])B = UINT8([5; 6; 7; 8])EX = {A,B}代码生成MCF -args离

通过实例在命令行上指定一次固定点输入的属性

要生成MEX函数或C / C ++进行定点MATLAB代码代码,您必须安装固定点设计™软件。

考虑一个计算定点数平方根的MATLAB函数:

%#codegen函数y = sqrtfi(x) y = sqrt(x);

指定主定点输入的属性X通过示例,请按照下列步骤操作:

  1. 定义numerictype房产X, 例如:

    T = numerictype(“字”,32岁的…“FractionLength”, 23岁……“签署”,真正的);

  2. 定义fimath房产X, 例如:

    F = fimath( 'SumMode', 'SpecifyPrecision',... 'SumWordLength',32,... 'SumFractionLength',23,... 'ProductMode', 'SpecifyPrecision',... 'ProductWordLength',32,...... 'ProductFractionLength',23);
  3. 方法创建定点变量numerictypefimath属性您定义,例如:

    myeg = {音响(4.0,T,F)};

  4. 编译功能sqrtfi使用codegen命令,使可变myeg作为参数传递给-args选项,例如:

    代码生成sqrtfi -args myeg;

指定在命令行输入恒

如果您知道主输入在运行时不会更改,则可以通过指定主输入为常量值来减少生成的代码中的开销。常量输入通常用于控制算法执行方式的标志和指定数据大小或类型的值。

要指定输入是常量,使用-args用命令行选项coder.Constant对象。要指定的输入是与大小,类,复杂性,和的值的常数constant_input,请使用以下语法:

-args {coder.Constant(constant_input)}

调用具有常量输入的函数

代码生成编译恒定函数投入生成的代码。在所生成的C或C ++代码,函数签名不包含恒定输入。默认情况下,MEX函数签名包含常量输入。当你调用一个MEX功能,你必须提供相匹配的编译时间值,价值观。您可以控制一个MEX函数签名是否包括常量输入和值是否MEX函数检查您提供恒定的输入。看到常数输入检查MEX功能

指定的构造,恒定的输入

假设您定义了一个结构TMP在MATLAB工作区,以指定的矩阵的尺寸:

TMP =结构( '行',2 '的cols',3);

以下功能的MATLABrowcol接受结构输入p来定义矩阵ÿ

函数y = rowcol(u,p) %#codegen y = 0 (p.rows,p.cols) + u;

下面的示例示出了如何指定主输入ü是双标量变量和主输入吗p是一个常数结构:

codegen rowcol -args {0,code . constant (tmp)}

在命令行中指定大小可变的输入

可变大小的数据是,其大小可以在运行时更改。MATLAB支万博1manbetx撑界和代码生成无限可变大小的数据。有界可变大小的数据有固定的上界。这些数据可以在堆栈上静态分配,也可以在堆上动态分配。无界适应数据没有固定的上限。这些数据必须在堆上分配。您可以定义输入有一个或多个可变大小的尺寸 - 并指定其上限 - 使用-args选项,coder.typeof功能:

-args {coder.typeof(example_valuesize_vectorvariable_dims)}
指定与一个可变大小输入:

  • 同一类和复杂性example_value

  • 相同的尺寸和上界为size_vector

  • 变量尺寸由variable_dims

当启用了动态内存分配,可以指定天道酬勤在用于与在编译时未知上限尺寸大小矢量。

什么时候variable_dims为标量,它适用于所有维,但有以下例外:

  • 如果维数是1或0,则它们是固定的。

  • 如果维度是无界的,则总是可变大小。

欲了解更多信息,请参阅coder.typeof生成代码为可变大小数据

指定一个可变大小的向量输入

  1. 写,计算每个平均值的函数ñ一个矢量的元素一个并将它们存储在一个向量中

    函数B = nway(A,n) %#codegen %计算A的每个n个元素的平均值,并将其放入B. code . extr('error');如果((mod(元素个数(A), n) = = 0) & & (n > = 1 & & n < =元素个数的B (A))) =(1,元素个数(A) / n);k = 1;i = 1:元素个数(A) / n B (i) =意味着((k + (0: n - 1)));k = k + n;end else B = 0 (1,0);错误('n <= 0或不能平均分配元素数');结束

  2. 指定第一个输入一个作为双值的向量。其第一尺寸保持固定的尺寸和它的第二维度可增长到上限的100指定第二输入ñ作为双标量。

    代码生成-report NWAY -args {coder.typeof(0,[1100],1),1}
  3. 作为替代方案,分配coder.typeof将表达式传递给MATLAB变量,然后将该变量作为参数传递给-args

    vareg = coder.typeof(0,[1100],1)代码生成-report NWAY -args {vareg,0}

相关的话题