指定入口点函数输入的属性
为什么必须指定输入属性
因为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工厂默认值有以下属性:
整入方法:Nearest OverflowAction: saturateproductmode: 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:定点:二进制点缩放signeness: Signed WordLength: 16 FractionLength: 15
现在创建一个本地MATLABfimath
价值。所以你不再使用默认设置:
F = fimath(“RoundingMethod”,“地板”);
最后,从内存中清除MEX函数并重新运行它:
明确test_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文件中以编程方式定义输入属性,则不能使用此方法 |
|
|
|
|
在命令行通过示例定义输入属性
命令行选项参数
的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
是标量双精度值:Codegen MCF -args {zero (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
举例来说,请遵循以下步骤:
定义
numerictype
属性x
,例如:T = numerictype(“字”,32岁的…“FractionLength”,23岁……“签署”,真正的);
定义
fimath
属性x
,例如:F = fimath(‘SumMode’,‘SpecifyPrecision’,……“SumWordLength”,32岁的……“SumFractionLength”,23岁……“ProductMode”、“SpecifyPrecision’,……“ProductWordLength”,32岁的……“ProductFractionLength”,23);
方法创建不动点变量
numerictype
而且fimath
您定义的属性,例如:myeg = {fi(4.0,T,F)};
编译函数
sqrtfi
使用codegen
命令,传递变量myeg
作为论证arg游戏
选项,例如:Codegen 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) %#codegen y = 0 (p.rows,p.cols) + u;
下面的示例演示如何指定主要输入u
双标量变量是主输入吗p
是一个常量结构:
codegen rowcol -args {0,code . 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中。如果((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{编码器。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代码 |
生成的代码 |
---|---|
函数= useDefaults_1 (a, b, c)参数一个(1,1)的两倍b = 3(1,1)的两倍c = 5(1,1)的两倍= 7结束Out = a + b + c;结束 |
codegen配置:自由- cuseDefaults_1arg游戏{}报告 生成的代码: double useDefaults_1(void){返回15.0;} |
函数= useDefaults_2 (a, b, c)参数一个(1,1)的两倍b(1,1)的两倍c = 5(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;} |