由于C和C ++是静态类型语言,MATLAB®编码器™必须在编译时确定在MATLAB文件中所有变量的性质。要在MATLAB文件推断变量属性,MATLAB编码器必须能够识别输入的属性主功能,也被称为顶层或入口点功能。因此,如果你的主要功能有输入,您必须指定这些输入的性能,MATLAB编码器。如果您的主函数没有输入参数,MATLAB编码器可以编译您的MATLAB文件,而无需修改。你并不需要指定的输入由主函数调用的本地函数或外部函数的性质。
如果您使用的符号(〜)字符来指定未使用功能的输入:
在MATLAB编码器的项目,如果你想有一个不同的类型出现在生成的代码,指定类型。否则,输入默认为真,标双打。
当生成代码与codegen
,你必须指定使用这些输入类型-args
选择。
如果您的主要功能有输入,你必须为每个输入以下属性。
对于 | 指定的属性 | ||||
---|---|---|---|---|---|
类 | 尺寸 | 复杂 | numerictype | fimath | |
定点输入 |
|
|
|
|
|
在结构输入的每个字段 | |||||
其他投入 |
|
|
|
MATLAB编码器受让人的下列缺省值的主要功能的输入特性。
财产 | 默认的 |
---|---|
类 | 双 |
尺寸 | 标量 |
复杂性 | 真正的 |
numerictype |
无缺省值 |
fimath |
MATLAB默认fimath 宾语 |
指定默认值的结构字段。在大多数情况下,当您没有显式地为属性指定值时,MATLAB编码器使用缺省值除了结构域。命名中的结构的字段的唯一方法是设置其属性中的至少一个。因此,您可能需要为结构域的属性指定默认值。举例来说,看到指定标量结构的类和大小和指定结构数组的类和大小。
为MEX函数指定默认的fimath值。使用以下命令生成的MEX函数MATLAB编码器使用默认fimath
在编译时有效的值。如果没有指定默认值fimath
值,MATLAB编码器使用MATLAB默认设置fimath
。MATLAB的出厂默认具有以下特性:
RoundingMethod:最近OverflowAction:饱和和ProductMode:FullPrecision SumMode:FullPrecision CastBeforeSum:真
当运行依赖于默认值的MEX函数时fimath
价值,不要将您的MATLAB会话期间更改此值。否则,您会收到一个运行时警告,提醒您在编译时和运行时之间的不匹配fimath
值。
例如,假设您定义下列功能的MATLAB测试
:
函数y =测试%#代码生成Y =音响(0);
这个函数测试
构造一个科幻
对象,而不显式地指定fimath
对象。因此,测试
依赖于默认值fimath
在对象在编译时的效果。在MATLAB提示符下,生成MEX函数text_mex
使用的出厂设置MATLAB默认的fimath
:
代码生成测试代码生成%生成MEX函数,test_mex,%在当前文件夹
接下来,运行test_mex
来显示MATLAB默认的fimath
值:
test_mex ANS = 0 DataTypeMode:定点:二进制点缩放符号性:签字字长:16 FractionLength:15
现在创建一个局部MATLABfimath
价值。所以你不再使用默认设置:
F = fimath( 'RoundingMethod', '地面');
最后,从内存中清除MEX功能,然后重新运行它:
明确test_mex test_mex
错配检测并导致错误:
???与比当前的默认不同的默认fimath生成此功能。错误的==> test_mex
指定用于MEX功能的多个签名。若要从入口点函数生成多签名MEX函数,请提供多个-args
规格为同一入口点函数。生成的MEX函数的工作与你的代码生成过程中提供多个签名。有关多重MEX的更多信息,请参阅生成一个MEX功能,支持多种签名万博1manbetx。
下表列出的类名称的支持万博1manbetxMATLAB编码器。
类名 | 描述 |
---|---|
合乎逻辑 |
真值和假值的逻辑数组 |
烧焦 |
字符数组 |
int8 |
8位带符号整数数组 |
UINT8 |
8位无符号整数数组 |
INT16 |
16位带符号整数数组 |
UINT16 |
16位无符号整数数组 |
INT32 |
32位带符号整数数组 |
UINT32 |
32位无符号整数数组 |
Int64的 |
64位带符号整数数组 |
uint64 |
64位无符号整数数组 |
单 |
单精度浮点或定点数阵列 |
双 |
双精度浮点数或定点数数组 |
结构 |
结构数组 |
embedded.fi |
定点数阵列 |
当指定的主输入的性质,遵循下列规则:
单元阵列中的元素的顺序必须对应于其中输入出现在主要功能签名的顺序。例如,单元阵列中的第一个元素定义所述第一主功能输入的属性。
为了产生比那些发生在MATLAB函数参数的参数较少,指定只有您在生成的函数希望参数的数量属性。
如果MATLAB函数有输入参数,要生成没有输入参数的函数,需要向其传递一个空单元格数组-args
。
对于每个主功能输入其类是固定点(科幻
),指定输入numerictype
和fimath
属性。
对于类为的每个主函数输入结构
,请按其字段在结构定义中出现的顺序指定其每个字段的属性。
方法 | 优势 | 缺点 |
---|---|---|
|
|
|
注意如果你在MATLAB文件编程定义输入的属性,您不能使用此方法 |
|
|
|
|
该codegen
功能提供了一个命令行选项-args
用于指定主(入口点)的功能的输入的性质如实施例的值或类型的单元阵列。单元阵列可以是恒定的值的变量或文字阵列。使用此选项,您在同一时间指定的输入的特性,你的MATLAB函数生成代码codegen
。
您可以将一个入口点函数的输出类型作为输入传递给另一个入口点函数。看到传递一个入口点函数的输出作为输入。有关指定单元格数组输入的信息,请参阅在命令行指定单元格数组输入。
如果你有一个调用与所需类型的入口点MATLAB函数测试函数或脚本,您可以使用coder.getArgTypes
以确定所述类型的功能的输入。coder.getArgTypes
返回的单元格数组coder.Type
对象可以传递到codegen
使用-args
选择。看到主要输入的指定常规属性对于codegen
。
您还可以创建coder.Type
通过使用编码器类型编辑器交互的对象。看到通过使用编码器类型编辑器创建和编辑输入类型。
当使用-args
命令行选项通过示例来定义特性,遵循以下规则:
单元阵列中的元素的顺序必须对应于其中输入出现在主要功能签名的顺序。例如,单元阵列中的第一个元素定义所述第一主功能输入的属性。
为了产生比那些发生在MATLAB函数参数的参数较少,指定只有您在生成的函数希望参数的数量属性。
如果MATLAB函数有输入参数,要生成没有输入参数的函数,需要向其传递一个空单元格数组-args
。
对于每个主功能输入其类是固定点(科幻
),指定输入numerictype
和fimath
属性。
对于类为的每个主函数输入结构
,请按其字段在结构定义中出现的顺序指定其每个字段的属性。
考虑一个将两个输入相加的MATLAB函数:
函数y = mcf(u,v) %#codegen y = u + v;
下面的示例演示如何指定主要输入的不同属性ü
和v
通过例如在命令行:
使用常量的字面电池阵列指定两个输入都是真正的标量双打:
代码生成MCF -args {0,0}
使用常量的文字单元格数组来指定输入ü
是一个无符号的16位,1×4矢量和输入v
是一个标量双:
codegen mcf -args {0 (1,4,'uint16'),0}
分配样本值到单元阵列变量来指定两个输入都是真实的,无符号的8位整数载体:
一个= UINT8([1; 2; 3; 4])B = UINT8([5; 6; 7; 8])EX = {A,B}代码生成MCF -args离
要生成MEX函数或C / C ++进行定点MATLAB代码代码,您必须安装固定点设计™软件。
考虑一个计算定点数平方根的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 = {音响(4.0,T,F)};
编译功能sqrtfi
使用codegen
命令,使可变myeg
作为参数传递给-args
选项,例如:
代码生成sqrtfi -args myeg;
如果您知道主输入在运行时不会更改,则可以通过指定主输入为常量值来减少生成的代码中的开销。常量输入通常用于控制算法执行方式的标志和指定数据大小或类型的值。
要指定输入是常量,使用-args
用命令行选项coder.Constant
对象。要指定的输入是与大小,类,复杂性,和的值的常数constant_input
,请使用以下语法:
-args {coder.Constant(constant_input
)}
代码生成编译恒定函数投入生成的代码。在所生成的C或C ++代码,函数签名不包含恒定输入。默认情况下,MEX函数签名包含常量输入。当你调用一个MEX功能,你必须提供相匹配的编译时间值,价值观。您可以控制一个MEX函数签名是否包括常量输入和值是否MEX函数检查您提供恒定的输入。看到常数输入检查MEX功能。
假设您定义了一个结构TMP
在MATLAB工作区,以指定的矩阵的尺寸:
TMP =结构( '行',2 '的cols',3);
以下功能的MATLABrowcol
接受结构输入p
来定义矩阵ÿ
:
函数y = rowcol(u,p) %#codegen y = 0 (p.rows,p.cols) + u;
下面的示例示出了如何指定主输入ü
是双标量变量和主输入吗p
是一个常数结构:
codegen rowcol -args {0,code . constant (tmp)}
可变大小的数据是,其大小可以在运行时更改。MATLAB支万博1manbetx撑界和代码生成无限可变大小的数据。有界可变大小的数据有固定的上界。这些数据可以在堆栈上静态分配,也可以在堆上动态分配。无界适应数据没有固定的上限。这些数据必须在堆上分配。您可以定义输入有一个或多个可变大小的尺寸 - 并指定其上限 - 使用-args
选项,coder.typeof
功能:
-args {coder.typeof(example_value,size_vector,variable_dims)}
同一类和复杂性example_value
相同的尺寸和上界为size_vector
变量尺寸由variable_dims
当启用了动态内存分配,可以指定天道酬勤
在用于与在编译时未知上限尺寸大小矢量。
什么时候variable_dims
为标量,它适用于所有维,但有以下例外:
如果维数是1或0,则它们是固定的。
如果维度是无界的,则总是可变大小。
欲了解更多信息,请参阅coder.typeof
和生成代码为可变大小数据。
写,计算每个平均值的函数ñ
一个矢量的元素一个
并将它们存储在一个向量中乙
:
函数B = nway(A,n) %#codegen %计算A的每个n个元素的平均值,并将其放入B. code . extr('error');如果((mod(元素个数(A), n) = = 0) & & (n > = 1 & & 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指定第二输入ñ
作为双标量。
代码生成-report NWAY -args {coder.typeof(0,[1100],1),1}
作为替代方案,分配coder.typeof
将表达式传递给MATLAB变量,然后将该变量作为参数传递给-args
:
vareg = coder.typeof(0,[1100],1)代码生成-report NWAY -args {vareg,0}