主要内容

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

为什么要指定输入属性

因为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的默认工厂有以下属性:

RoundingMethod: Nearest OverflowAction: Saturate ProductMode: FullPrecision SumMode: FullPrecision CastBeforeSum: true
有关更多信息,请参见FIMATH共享算术规则 (定点设计师)

运行依赖于默认的MEX函数FIMATH.值,在MATLAB会话期间不要更改此值。否则,您将收到运行时警告,警告您编译时和运行时不匹配FIMATH.值。

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

函数y = test %#codegen y = fi(0);

功能测试构建A.fi对象而不明确指定aFIMATH.对象。所以,测试依赖于默认值FIMATH.对象在编译时有效。在MATLAB提示下,生成MEX函数text_mex使用的出厂设置MATLAB默认FIMATH.

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

接下来,运行test_mex来显示MATLAB默认FIMATH.价值:

test_mex ans = 0 DataTypeMode: Fixed-point: binary point scaling Signedness: Signed WordLength: 16 FractionLength: 15

现在创建一个本地MATLABFIMATH.价值。因此,您不再使用默认设置:

F = fimath(“RoundingMethod”,“地板”);

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

明确test_mex test_mex

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

???此函数是使用与当前默认值不同的默认fmath生成的。在==> test_mex错误

为MEX函数指定多个签名。从入口点函数生成多功能MEX功能,提供多个arg游戏相同入口点功能的规格。生成的MEX函数与您在代码生成期间提供的多个签名一起工作。有关多签名MEX的更多信息,请参见为多个签名生成一个MEX函数

金宝app支持类

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

班级名称 描述
逻辑 真假值的逻辑阵列
字符 字符阵列
INT8. 8位带符号整数数组
uint8 8位无符号整数数组
int16 16位带符号整数数组
uint16 16位无符号整数数组
int32 32位有符号整型数组
uint32 32位无符号整型数组
int64 64位带符号整型数组
UINT64 64位无符号整数数组
单身的 单精度浮点或定点数字数组
双精度浮点或定点数组
结构体 结构阵列
embedded.fi 定点数的数组

指定主要输入属性的规则

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

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

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

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

  • 对于类为不动点的每个主函数输入(fi),指定输入numerictypeFIMATH.特性。

  • 对于每个类的主要函数输入结构体,以它们在结构定义中显示的顺序指定每个字段的属性。

定义主输入属性的方法

方法 好处 缺点

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

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

  • 不改变原始的MATLAB代码

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

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

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

请注意

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

  • 易于使用的

  • 不改变原始的MATLAB代码

  • 设计用于原型化具有几个主要输入的功能

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

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

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

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

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

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

  • 使用复杂的语法

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

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

命令行选项参数

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

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

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

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

使用-args选项的规则

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

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

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

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

  • 对于类为不动点的每个主函数输入(fi),指定输入numerictypeFIMATH.特性。

  • 对于每个类的主要函数输入结构体,以它们在结构定义中显示的顺序指定每个字段的属性。

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

考虑一个添加其两个输入的matlab函数:

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

以下示例显示如何指定主要输入的不同属性uv命令行示例:

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

    Codegen MCF -args {0,0}

  • 使用常量的文字单元阵列来指定输入u是一个无符号的16位1 × 4向量和输入吗v为标量双精度:

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

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

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

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

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

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

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

指定主定点输入的属性x例如,遵循以下步骤:

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

    t = numerictype('wordlength',32,...'fractionlength',23,...'签名',true);

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

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

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

  4. 编译函数sqrtfi使用Codegen.命令,传递变量myeg作为论证arg游戏选项,例如:

    Codegen sqrtfi -args myeg;

在命令行指定常量输入

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

要指定输入为常量,请使用arg游戏命令行选项,带有编码器.Constant.对象。将输入指定为大小、类、复杂性和值为的常量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)%#codegen y = zeros(p.rows,p.cols)+ u;

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

Codegen Rowcol -Args {0,coder.Constant(TMP)}

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

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

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

  • 与。相同的类和复杂性example_value

  • 大小和上界相同size_vector

  • 可变尺寸指定variable_dims

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

variable_dims它是一个标量,它适用于所有尺寸,以下例外情况:

  • 如果尺寸为1或0,则为固定。

  • 如果尺寸是无限的,这始终是可变的大小。

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

指定变量大小向量输入

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

    功能b = nway(a,n)%#codegen%a的每个n个元素的计算平均值,并将它们放在b.coder.extrinsic('错误');if((mod(mod(a),n)== 0)&&(n> = 1 && n <= numel(a)))b = one(1,numel(a)/ n);k = 1;对于i = 1:numel(a)/ n b(i)=平均值(a(k +(0:n-1)));k = k + n;结束否则B = Zeros(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}

相关话题