指定入口点函数输入的属性
为什么必须指定输入属性
因为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
运行依赖于默认值的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
),指定输入numerictype
和fimath
属性。对于类为的每个主函数输入
结构体
,按照每个字段在结构定义中出现的顺序指定它们的属性。
定义主要输入属性的方法
方法 | 优势 | 缺点 |
---|---|---|
|
|
|
请注意 如果在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) %#codegen 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} cogen MCF -args ex
在命令行中通过示例指定主定点输入的属性
要生成用于定点MATLAB代码的MEX函数或C/ c++代码,必须安装定点设计器™软件。
考虑一个计算定点数平方根的MATLAB函数:
%#codegen函数y = sqrtfi(x) y = sqrt(x);
指定主定点输入的属性x
通过示例,请遵循以下步骤:
定义
numerictype
属性x
,例如:T = numerictype('WordLength',32,…“FractionLength”,23岁……“签署”,真正的);
定义
fimath
属性x
,例如:F = finath ('SumMode',' specificprecision ',…“SumWordLength”,32岁的……“SumFractionLength”,23岁……“ProductMode”、“SpecifyPrecision’,……“ProductWordLength”,32岁的……“ProductFractionLength”,23);
创建一个定点变量
numerictype
和fimath
您定义的属性,例如:myyeg = {fi(4.0,T,F)};
编译函数
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_value,size_vector,variable_dims)}
相同的类和复杂度
example_value
大小和上界与
size_vector
指定的可变尺寸
variable_dims
当启用动态内存分配时,可以指定正
在大小向量中,对于在编译时具有未知上界的维度。
当variable_dims
是一个标量,它应用于所有维度,除了以下例外:
如果维度是1或0,它们是固定的。
如果维度是无界的,则始终是可变大小。
有关更多信息,请参见coder.typeof
和生成可变大小数据的代码.
指定可变大小的矢量输入
写一个函数,计算每一个的平均值
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或未平均划分元素数');结束
指定第一个输入
一个
作为双精度值的向量。它的第一个维度保持固定的大小,而它的第二个维度可以增长到100的上限。指定第二个输入n
作为双标量。Codegen -report nway -args {coder。typeof (0, [100], 1), 1}
作为一种选择,分配
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配置:自由- 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配置:自由- cuseDefaults_2arg游戏0报告 生成的代码: double useDefaults_2(double a) {return (a + 5.0) + 7.0;} |
codegen配置:自由- cuseDefaults_2arg游戏{0}报告 生成的代码: double useDefaults_2(double a, double b) {return (a + b) + 7.0;} |