主要内容

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

为什么必须指定输入属性

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

请注意

您的主要功能不能在包中。创建一个包装器函数作为包外的主要函数。在新函数中调用所需的函数作为主函数。

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

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

  • 生成代码时codegen类型指定这些输入的类型arg游戏选择。

要指定的属性

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

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

结构输入中的每个字段

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

其他投入

默认属性值

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

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

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

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

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

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

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

函数y = test %#codegen 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:定点:二进制点缩放签名:Signed WordLength: 16分数长度:15

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

F = finath ('RoundingMethod','Floor');

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

清除test_mex

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

? ?这个函数是用与当前默认值不同的默认值生成的。==> test_mex错误

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

支持类

的支持的类名MATLAB编码器

类名 描述
逻辑 真值和假值的逻辑数组
字符 字符数组
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编码器项目文件目前不识别以编程方式定义的属性。如果使用的是项目,则必须在项目中重新输入输入类型。

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

命令行选项-args

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

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

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

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

-args选项的使用规则

在使用arg游戏命令行选项来定义属性,请遵循以下规则:

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

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

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

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

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

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

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

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

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

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

    编码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} cogen 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岁……“签署”,真正的);

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

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

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

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

    Codegen sqtfi -args - myg;

在命令行中指定常量输入

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

要指定输入为常量,请使用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) %#codegen y = 0 (p.rows,p.cols) + u;

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

codegen rowcol -args {0,coder.Constant(tmp)}

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

可变大小的数据是其大小可能在运行时改变的数据。MATLAB支持用于代码生成的有界和无界可变大小数据。有界可变大小的数据有固定的上界。这些数据可以在堆栈上静态分配,也可以在堆上动态分配。无界可变大小的数据没有固定的上界。这些数据必须在堆上分配。方法将输入定义为具有一个或多个可变大小的维度,并指定它们的上界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('error');如果((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;end else B = 0 (1,0);错误('n <= 0或未平均划分元素数');结束

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

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

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

输入类型规格及参数

使用函数参数验证(参数块)来指定入口点函数的输入类型是不支持的。即使你的入口函数包含参数块验证输入参数,您必须使用中列出的三种方法之一指定这些输入参数的属性定义主要输入属性的方法

生成代码中入口点函数输入的默认值

参数块允许您为一个或多个位置输入参数指定默认值。在参数声明中指定默认值使位置参数可选,因为当您在函数调用中不传递值时,MATLAB可以使用默认值。方法生成代码时codegen命令来加速定点代码fiaccel(定点设计师)命令时,可以选择不指定具有恒定默认值的一个或多个可选位置参数的属性。在这种情况下,这些可选参数的默认值在生成的代码中被硬编码,这些参数不会出现在生成的代码接口中。示例请参见下表。

MATLAB代码

生成的代码

函数out = useDefaults_1(a,b,c)参数一个(1,1)的两倍= 3 b(1,1)的两倍= 5 c(1,1)的两倍= 7结束Out = a + b + c;结束

codegen命令:

codegen配置:自由- cuseDefaults_1arg游戏{}报告

生成的代码:

double useDefaults_1(void){返回15.0;}

函数out = useDefaults_2(a,b,c)参数一个(1,1)的两倍b(1,1)的两倍= 5 c(1,1)的两倍= 7结束Out = a + b + c;结束

codegen命令:

codegen配置:自由- cuseDefaults_2arg游戏0报告

生成的代码:

double useDefaults_2(double a) {return (a + 5.0) + 7.0;}

codegen命令:

codegen配置:自由- cuseDefaults_2arg游戏{0}报告

生成的代码:

double useDefaults_2(double a, double b) {return (a + b) + 7.0;}

相关的话题

Baidu
map