主要内容

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

为什么必须指定输入属性

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

如果使用波浪号(~)字符指定未使用的函数输入:

  • MATLAB编码器项目中,如果您希望在生成的代码中显示不同的类型,请指定类型。否则,输入默认为实,标量加倍。

  • 当使用codegen属性指定这些输入的类型arg游戏选择。

要指定的属性

如果主函数有输入,则必须为每个输入指定以下属性。

指定的属性
大小 复杂性 numerictype fimath
定点输入

结构输入中的每个字段

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

其他投入

默认属性值

MATLAB编码器为主要函数输入的属性分配以下默认值。

财产 默认的
大小 标量
复杂性 真正的
numerictype 没有默认的
fimath MATLAB违约fimath对象

为结构字段指定默认值。在大多数情况下,当您没有显式地为属性指定值时,MATLAB编码器除结构字段外,使用默认值。在结构中命名字段的唯一方法是设置至少一个属性。因此,您可能需要为结构字段的属性指定默认值。有关示例,请参见指定标量结构的类和大小而且指定结构数组的类和大小

指定MEX函数的默认fimath值。生成的MEX函数MATLAB编码器使用默认值fimath在编译时有效的值。如果没有指定默认值fimath值,MATLAB编码器使用MATLAB默认fimath.MATLAB工厂默认值具有以下属性:

取整方法:最近溢出动作:饱和ProductMode: FullPrecision SumMode: FullPrecision CastBeforeSum: true
有关更多信息,请参见fimath表示共享算术规则 (定点设计师)

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

例如,假设您定义了以下MATLAB函数测验

函数y = test %#代码原y = fi(0);

这个函数测验构造一个fi对象,而无需显式指定fimath对象。因此,测验依赖于默认值fimath对象在编译时生效。在MATLAB提示符下,生成MEX函数text_mex控件的出厂设置MATLAB默认的fimath

codegen在当前文件夹中生成一个MEX函数test_mex, %

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

test_mex ans = 0 DataTypeMode:定点:二进制点缩放signdness: Signed WordLength: 16 FractionLength: 15

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

F = fimath('舍入方法','地板');

最后,从内存中清除MEX函数并重新运行它:

清除test_mex test_mex

检测到不匹配并导致错误:

???该函数生成时使用的默认fimath与当前默认fimath不同。==> test_mex错误

为MEX功能指定多个签名。若要从入口点函数生成多签名MEX函数,请提供multiplearg游戏规格相同的入口点功能。生成的MEX函数使用您在代码生成期间提供的多个签名。有关多重签名MEX的详细信息,请参见为多个签名生成一个MEX函数

金宝app支持类

支持的类名如下表所示金宝appMATLAB编码器

类名 描述
逻辑 true和false值的逻辑数组
字符 字符数组
int8 8位有符号整数数组
uint8 8位无符号整数数组
int16 16位有符号整数数组
uint16 16位无符号整数数组
int32 32位有符号整数数组
uint32 32位无符号整数数组
int64 64位有符号整数数组
uint64 64位无符号整数数组
单精度浮点数或定点数数组
双精度浮点数或定点数数组
结构体 结构数组
embedded.fi 定点数数组

指定主要输入属性的规则

当指定主要输入的属性时,请遵循以下规则:

  • 单元格数组中元素的顺序必须与输入在主函数签名中出现的顺序相对应。例如,单元格数组中的第一个元素定义了第一个主函数输入的属性。

  • 若要生成比MATLAB函数中出现的参数更少的参数,请仅为生成的函数中所需的参数数量指定属性。

  • 如果MATLAB函数有输入参数,要生成没有输入参数的函数,请将空单元格数组传递给arg游戏

  • 对于每个类为定点的主函数输入(fi),指定输入numerictype而且fimath属性。

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

定义初级输入属性的方法

方法 优势 缺点

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

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

  • 不改变原来的MATLAB代码

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

  • 对于指定内存密集型输入(如大型结构和数组)效率不高

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

请注意

如果在MATLAB文件中以编程方式定义输入属性,则不能使用此方法

  • 使用方便

  • 不改变原来的MATLAB代码

  • 为原型化一个有几个主要输入的函数而设计的

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

  • 对于指定内存密集型输入(如大型结构和数组)效率不高

在MATLAB文件中定义输入属性

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

  • 提供MATLAB代码中属性规范的文档

  • 高效地指定内存密集型输入,如大型结构

  • 使用复杂的语法

  • MATLAB编码器项目文件目前不能识别以编程方式定义的属性。如果正在使用项目,则必须在项目中重新输入输入类型。

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

命令行选项-args

codegen函数提供命令行选项arg游戏用于将主要(入口点)函数输入的属性指定为示例值或类型的单元格数组。单元格数组可以是常量值的变量或文字数组。使用此选项,您可以在为MATLAB函数生成代码的同时指定输入的属性codegen

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

如果您有一个测试函数或脚本,它调用具有所需类型的入口点MATLAB函数,那么您可以使用coder.getArgTypes来确定函数输入的类型。coder.getArgTypes的单元格数组编码器。类型可以传递给的对象codegen使用arg游戏选择。看到指定主要输入的一般属性codegen

你也可以创建编码器。类型对象交互使用编码器类型编辑器。看到使用编码器类型编辑器创建和编辑输入类型

-args选项的使用规则

当使用arg游戏命令行选项通过示例定义属性,遵循以下规则:

  • 单元格数组中元素的顺序必须与输入在主函数签名中出现的顺序相对应。例如,单元格数组中的第一个元素定义了第一个主函数输入的属性。

  • 若要生成比MATLAB函数中出现的参数更少的参数,请仅为生成的函数中所需的参数数量指定属性。

  • 如果MATLAB函数有输入参数,要生成没有输入参数的函数,请将空单元格数组传递给arg游戏

  • 对于每个类为定点的主函数输入(fi),指定输入numerictype而且fimath属性。

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

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

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

函数y = McF (u,v) %#编码原y = u + v;

下面的示例展示了如何指定主要输入的不同属性u而且v通过命令行示例:

  • 使用常量的文字单元格数组来指定两个输入都是实标量双精度:

    代码原MCF -args {0,0}

  • 使用常量的文字单元格数组来指定输入u是无符号16位,1乘4向量和输入v是标量双精度:

    代码原MCF -args {0 (1,4,'uint16'),0}

  • 将样本值赋给单元格数组变量,以指定两个输入都是实数,无符号8位整数向量:

    A = uint8([1;2;3;4]) b = uint8([5;6;7;8]) ex = {A,b}密码元MCF -args ex

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

要为定点MATLAB代码生成MEX函数或C/ c++代码,必须安装定点设计器™软件。

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

%#代码原函数y = sqrtfi(x) y = sqrt(x);

指定主定点输入的属性x举例来说,请遵循以下步骤:

  1. 定义numerictype属性x,例如:

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

  2. 定义fimath属性x,例如:

    F = fimath('SumMode',' specificprecision ',…“SumWordLength”,32岁的……“SumFractionLength”,23岁……“ProductMode”、“SpecifyPrecision’,……“ProductWordLength”,32岁的……“ProductFractionLength”,23);
  3. 属性创建一个定点变量numerictype而且fimath您定义的属性,例如:

    myeg = {fi(4.0,T,F)};

  4. 编译函数sqrtfi使用codegen命令,传递变量myeg的参数arg游戏选项,例如:

    代码原sqrtfi -args myeg;

在命令行中指定常量输入

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

要指定输入为常量,请使用arg游戏命令行选项。编码器。常数对象。的大小、类、复杂度和值指定输入为常量constant_input,使用以下语法:

args{编码器。常数(constant_input)}

调用常量输入函数

代码生成器将常量函数输入编译到生成的代码中。在生成的C或c++代码中,函数签名不包含常量输入。缺省情况下,MEX函数签名中包含常量输入。在调用MEX函数时,必须提供与编译时值匹配的值。您可以控制MEX函数签名是否包含常量输入,以及MEX函数是否检查您为常量输入提供的值。看到MEX函数中的常量输入检查

指定一个结构作为常量输入

假设您定义了一个结构tmp在MATLAB工作空间中指定矩阵的维数:

TMP = struct('rows', 2, 'cols', 3);

下面的MATLAB函数rowcol接受结构输入p定义矩阵y

函数y = rowcol(u,p) %#代码原y =零(p.rows,p.cols) + u;

下面的示例展示了如何指定主要输入u双标量变量和主输入p是常量结构:

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

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

可变大小的数据是其大小可能在运行时改变的数据。MATLAB支金宝app持有界和无界可变大小数据的代码生成。有界的可变大小数据具有固定的上界。这些数据可以在堆栈上静态分配,也可以在堆上动态分配。无界可变大小的数据没有固定的上界。这些数据必须分配到堆上。属性可以将输入定义为具有一个或多个可变大小的维度,并指定它们的上界arg游戏选项,coder.typeof功能:

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

  • 相同的类和复杂性example_value

  • 大小和上界相同size_vector

  • variable_dims

启用动态内存分配时,可以指定在size向量中,用于在编译时具有未知上界的维度。

variable_dims是标量,则它应用于所有维度,但有以下例外:

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

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

有关更多信息,请参见coder.typeof而且生成可变大小数据的代码

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

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

    函数B = nway(A,n) %#codegen %计算A中每n个元素的平均值,并将它们放入B中。如果((mod(元素个数(A), n) = = 0) & & 1 & & n (n > = < =元素个数的B (A))) =(1,元素个数(A) / n);K = 1;i = 1:元素个数(A) / n B (i) =意味着((k + (0: n - 1)));K = K + n;else B = 0 (1,0);错误('n <= 0或未平均分配元素数量');结束

  2. 指定第一个输入一个作为一个双值向量。它的第一个维度保持固定的大小,而第二个维度可以增长到100的上限。指定第二个输入n作为一个双重标量。

    Codegen -report nway -args{编码器。typeof (0, [100], 1), 1}
  3. 作为一种替代方法,分配coder.typeof表达式传递给MATLAB变量,然后将该变量作为参数传递给arg游戏

    Vareg =编码器。Typeof (0,[1 100],1) codegen -report nway -args {vareg, 0}

相关的话题