因为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
当运行依赖于缺省值的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函数.
支持的类名如下表所示金宝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
属性。
为类的每个主函数输入结构体
,按照它们在结构定义中出现的顺序指定其每个字段的属性。
方法 | 优势 | 缺点 |
---|---|---|
|
|
|
请注意 如果在MATLAB文件中以编程方式定义输入属性,则不能使用此方法 |
|
|
|
|
的codegen
函数提供命令行选项arg游戏
用于将主要(入口点)函数输入的属性指定为示例值或类型的单元格数组。单元格数组可以是常量值的变量或文字数组。使用此选项,您可以在为MATLAB函数生成代码的同时指定输入的属性codegen
.
可以将输出类型从一个入口点函数传递给另一个入口点函数作为输入。看到传递一个入口点函数输出作为输入.有关指定单元格数组输入的信息,请参见在命令行中指定单元格数组输入.
如果您有一个测试函数或脚本,它调用具有所需类型的入口点MATLAB函数,那么您可以使用coder.getArgTypes
来确定函数输入的类型。coder.getArgTypes
的单元格数组编码器。类型
可以传递给的对象codegen
使用arg游戏
选择。看到指定主要输入的一般属性为codegen
.
你也可以创建编码器。类型
对象交互使用编码器类型编辑器。看到使用编码器类型编辑器创建和编辑输入类型.
当使用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
举例来说,请遵循以下步骤:
定义numerictype
属性x
,例如:
T = numerictype('WordLength',32,…“FractionLength”,23岁……“签署”,真正的);
定义fimath
属性x
,例如:
F = fimath('SumMode',' specificprecision ',…“SumWordLength”,32岁的……“SumFractionLength”,23岁……“ProductMode”、“SpecifyPrecision’,……“ProductWordLength”,32岁的……“ProductFractionLength”,23);
属性创建一个定点变量numerictype
而且fimath
您定义的属性,例如:
myeg = {fi(4.0,T,F)};
编译函数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_value,size_vector,variable_dims)}
相同的类和复杂性example_value
大小和上界相同size_vector
由variable_dims
启用动态内存分配时,可以指定正
在size向量中,用于在编译时具有未知上界的维度。
当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;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}