因为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
运行依赖于默认的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函数.
支持的类名如下表所示金宝appMATLAB编码器.
班级名称 | 描述 |
---|---|
逻辑 |
真假值的逻辑阵列 |
字符 |
字符阵列 |
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
返回一个单元格数组编码器.Type.
可以传递的对象Codegen.
使用arg游戏
选项。看指定主要输入的一般属性为Codegen.
.
您还可以创建编码器.Type.
对象通过使用编码器类型编辑器进行交互。看使用编码器类型编辑器创建和编辑输入类型.
当使用arg游戏
命令行选项通过示例定义属性,遵循以下规则:
单元格数组中元素的顺序必须与输入在主函数签名中出现的顺序相对应。例如,单元格数组中的第一个元素定义了第一个主函数输入的属性。
要生成比MATLAB函数中出现的参数更少的参数,只需为生成的函数中需要的参数数量指定属性。
如果MATLAB函数具有输入参数,要生成没有输入参数的函数,请传递空单元格数组arg游戏
.
对于类为不动点的每个主函数输入(fi
),指定输入numerictype
和FIMATH.
特性。
对于每个类的主要函数输入结构体
,以它们在结构定义中显示的顺序指定每个字段的属性。
考虑一个添加其两个输入的matlab函数:
函数y = mcf(u,v)%#codegen y = u + v;
以下示例显示如何指定主要输入的不同属性u
和v
命令行示例:
使用常量的文本单元格数组来指定两个输入都是实双精度标量:
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
例如,遵循以下步骤:
定义numerictype
属性x
,例如:
t = numerictype('wordlength',32,...'fractionlength',23,...'签名',true);
定义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.
对象。将输入指定为大小、类、复杂性和值为的常量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_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('错误');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或不均匀分割元素数量);结尾
指定第一个输入一个
作为双值向量。它的第一个维度的大小是固定的,第二个维度可以增长到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}