主要内容

指定入口点函数输入的属性

为什么你必须指定输入属性

因为C和c++静态类型语言,MATLAB®编码器™必须确定所有变量的属性在MATLAB文件在编译时。在MATLAB文件来推断变量属性,MATLAB编码器必须能够识别输入的属性函数,也称为顶级入口点函数。因此,如果您的主函数输入,您必须指定这些输入的属性MATLAB编码器。如果您的主要功能没有输入参数,MATLAB编码器可以编译MATLAB文件没有修改。你不需要指定的属性输入本地函数或外部函数调用的主要功能。

请注意

你的主要功能不能在一个包中。创建一个包装器函数外的主要功能包。新函数内调用所需的函数作为主要功能。

如果你使用波浪号(~)字符指定输入未使用的功能:

  • MATLAB编码器项目,如果你想要一个不同的类型出现在生成的代码中,指定类型。否则,输入默认为真实,标量双打。

  • 当生成代码codegen,您必须指定这些输入使用的类型arg游戏选择。

属性来指定

如果你的主要功能有输入,您必须为每个输入指定以下属性。

指定的属性
大小 复杂性 numerictype fimath
定点输入

结构中的每个字段输入

根据它的类为每个字段指定属性

其他投入

默认的属性值

MATLAB编码器分配以下主要功能的属性的默认值输入。

财产 默认的
大小 标量
复杂性 真正的
numerictype 没有默认的
fimath MATLAB违约fimath对象

指定结构字段的默认值。在大多数情况下,当你不显式地指定属性的值,MATLAB编码器使用默认值,除了结构字段。名称字段在一个结构的唯一方法是设置至少一个属性。因此,您可能需要指定结构的属性字段的默认值。有关示例,请参见指定类和标量结构的大小指定类和结构数组的大小

指定默认为墨西哥人fimath值函数。墨西哥人功能生成的MATLAB编码器使用默认的fimath值在编译时生效。如果你不指定一个默认的fimath值,MATLAB编码器使用MATLAB默认fimath。MATLAB出厂默认值有以下属性:

RoundingMethod:最近的OverflowAction:饱和ProductMode: FullPrecision SumMode: FullPrecision CastBeforeSum:真的
有关更多信息,请参见fimath分享运算规则 (定点设计师)

墨西哥人运行时函数依赖于默认fimath值,不改变这个值在MATLAB会话。否则,你收到一个运行时警告,提醒你编译时和运行时之间的不匹配fimath值。

例如,假设您定义下面的MATLAB函数测试:

测试函数y = % # codegen y = fi (0);

这个函数测试构造一个fi没有显式地指定一个对象fimath对象。因此,测试依赖于默认fimath对象实际上是在编译时。在MATLAB提示,生成墨西哥人的功能text_mex使用工厂的设置MATLAB默认的fimath:

codegen测试% codegen生成一个墨西哥人功能,test_mex, %在当前文件夹

接下来,运行test_mex来显示MATLAB默认的fimath值:

test_mex ans = 0 DataTypeMode:定点:二进制扩展Signedness:签了字:16 FractionLength: 15

现在创建一个本地MATLABfimath价值。所以你不再使用默认设置:

F = fimath (“RoundingMethod”,“地板”);

最后,明确的墨西哥人从记忆功能并重新运行:

明确test_mex test_mex

检测到的不匹配,导致一个错误:

? ? ?这个函数是用不同的默认生成fimath比当前违约。= = > test_mex误差

为墨西哥人指定多个签名的功能。生成一个多重签名墨西哥人函数从一个入口点函数,提供多个arg游戏规格相同的入口点函数。墨西哥人函数生成使用您提供的多个签名在代码生成。多重签名墨西哥人的更多信息,请参阅生成一个墨西哥人函数多个签名

金宝app支持类

下表给出了支持的类名金宝appMATLAB编码器

类名 描述
逻辑 逻辑真假值的数组
字符 字符数组
int8 8位带符号整数数组
uint8 8位无符号整数数组
int16 16位带符号整数数组
uint16 16位无符号整数数组
int32 32位带符号整数数组
uint32 32位无符号整数数组
int64 64位带符号整数数组
uint64 64位无符号整数数组
单精度浮点和定点数的数组
双精度浮点和定点数的数组
结构体 结构数组
embedded.fi 定点数的数组

规则用于指定属性的主要输入

当指定的属性主要输入,遵循以下规则:

  • 细胞数组中元素的顺序必须对应于输入的顺序出现在主函数签名。例如,细胞数组中的第一个元素定义了第一个主函数输入的属性。

  • 生成参数少于那些发生在MATLAB函数的参数,指定属性参数的数量你想要在生成的功能。

  • 如果MATLAB函数输入参数,生成一个函数,它没有输入参数,通过一个空单元阵列arg游戏

  • 为每个输入的类主要功能是固定的点(fi),指定输入numerictypefimath属性。

  • 为每个输入类的主要功能结构体,指定每个字段的属性的顺序出现在结构的定义。

方法定义属性的主要输入

方法 优势 缺点

指定的属性使用应用程序入口点函数的输入

  • 如果你是在一个工作MATLAB编码器项目,容易使用

  • 不改变原来的MATLAB代码

  • MATLAB编码器保存项目文件的定义

  • 不是有效的用于指定内存密集型等投入大结构和数组

在命令行定义输入属性的例子

请注意

如果您定义输入属性以编程方式在MATLAB文件中,您不能使用这种方法

  • 易于使用的

  • 不改变原来的MATLAB代码

  • 为原型设计的一个函数,它有几个主要的输入

  • 必须在命令行指定每次您调用吗codegen(除非你使用一个脚本)

  • 不是有效的用于指定内存密集型等投入大结构和数组

定义输入属性以编程方式在MATLAB文件中

  • 结合MATLAB代码;每次调用时不需要重新定义属性MATLAB编码器

  • 提供文档属性规范的MATLAB代码

  • 有效的用于指定内存密集型等投入大的结构

  • 使用复杂的语法

  • MATLAB编码器目前项目文件不识别属性定义的编程方式。如果您使用的是一个项目,你必须重新输入类型的项目。

在命令行定义输入属性的例子

命令行选项参数

codegen函数提供了一个命令行选项arg游戏主要用于指定的属性(入口点)函数的输入值或类型单元阵列的例子。单元阵列可以是变量或字面常量值的数组。使用这个选项,您指定的属性输入的同时生成代码的MATLAB函数codegen

您可以通过从一个入口点函数作为输入输出类型到另一个地方。看到通过一个入口点函数的输出作为输入。指定单元阵列的输入信息,请参阅在命令行中指定单元阵列的输入

如果你有一个测试函数或脚本,该脚本调用MATLAB函数入口点所需的类型,您可以使用coder.getArgTypes确定函数的输入类型。coder.getArgTypes返回一个单元阵列coder.Type你可以通过对象codegen使用arg游戏选择。看到指定一般性质的主要输入codegen

您还可以创建coder.Type通过使用编码器类型编辑器对象交互。看到创建和编辑输入类型使用编码器类型编辑器

规则使用arg游戏选项

当使用arg游戏命令行选项来定义属性的示例中,遵循以下规则:

  • 细胞数组中元素的顺序必须对应于输入的顺序出现在主函数签名。例如,细胞数组中的第一个元素定义了第一个主函数输入的属性。

  • 生成参数少于那些发生在MATLAB函数的参数,指定属性参数的数量你想要在生成的功能。

  • 如果MATLAB函数输入参数,生成一个函数,它没有输入参数,通过一个空单元阵列arg游戏

  • 为每个输入的类主要功能是固定的点(fi),指定输入numerictypefimath属性。

  • 为每个输入类的主要功能结构体,指定每个字段的属性的顺序出现在结构的定义。

指定的属性主要在命令行输入的例子

考虑一个MATLAB函数增加了它的两个输入:

函数y = mcf (u, v) % # codegen y = u + v;

下面的例子显示了如何指定不同属性的主要输入uv通过在命令行例子:

  • 使用文字的常量指定单元阵列的输入都是真正的标量双打:

    codegen mcf args {0}

  • 使用文字的常量指定单元阵列的输入u是一个无符号16位,1-by-4向量和输入v是一个标量双:

    codegen mcf args {0 (1, 4,“uint16”), 0}

  • 将样本值分配给一个细胞数组变量来指定这两个输入都是真实的,unsigned 8位整数向量:

    = uint8 ([1; 2; 3; 4]) b = uint8 ([5, 6, 7, 8)) = {a、b} codegen mcf args交货交货

指定的属性主要定点在命令行输入的例子

生成一个墨西哥人函数或C / c++代码定点MATLAB代码,您必须安装定点设计师™软件。

考虑一个MATLAB函数计算平方根的定点数:

% # codegen函数y = sqrtfi x y =√(x);

指定的属性主要定点输入x通过示例,请执行以下步骤:

  1. 定义numerictype属性x,例如:

    T = numerictype(“字”,32岁的…“FractionLength”, 23岁……“签署”,真正的);

  2. 定义fimath属性x,例如:

    F = fimath (‘SumMode’,‘SpecifyPrecision’,……“SumWordLength”, 32岁的……“SumFractionLength”, 23岁……“ProductMode”、“SpecifyPrecision’,……“ProductWordLength”, 32岁的……“ProductFractionLength”, 23);
  3. 创建一个定点的变量numerictypefimath你定义的属性,例如:

    myeg = {fi (4.0、T、F)};

  4. 编译函数sqrtfi使用codegen命令,通过变量myeg作为参数arg游戏选项,例如:

    codegen sqrtfi args myeg;

在命令行中指定常数输入

如果你知道你的主要输入不改变在运行时,可以减少开销在生成的代码中指定的主要输入常量值。常数输入通常用于控制一个算法执行的旗帜和价值观指定大小或类型的数据。

使用指定的输入是常数arg游戏命令行选项的coder.Constant对象。指定一个输入是一个常数的大小,类,复杂性,和价值的constant_input使用下面的语法:

args {coder.Constant (constant_input)}

调用函数和常数输入

代码生成器编译常数函数生成的代码的输入。在生成的C或c++代码中,函数签名不包含常数输入。默认情况下,墨西哥人函数签名包含常数输入。当你调用一个墨西哥人函数时,你必须提供编译时的值匹配的值。你可以控制一个墨西哥人是否函数签名包括常数输入和墨西哥人是否函数检查您提供恒定的值输入。看到在墨西哥人函数常数输入检查

指定结构作为一个常数输入

假设您定义一个结构tmp在MATLAB工作区中指定一个矩阵的维度:

tmp =结构(“行”2“关口”,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支金宝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为适应可变数据生成代码

指定一个适应可变向量输入

  1. 写一个函数,这个函数计算每一个的平均值n一个向量的元素一个并将它们存储在一个向量B:

    函数B = nway (n) % # codegen %计算平均每n个元素,把它们放在B coder.extrinsic('错误');如果((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;结束其他B = 0 (1,0);错误(' n < = 0或不分裂的元素数量均匀的);结束

  2. 指定第一个输入一个作为一个向量的值的两倍。第一个维度保持固定的大小和其第二维度可以长到100年的一个上界。指定第二个输入n作为一个双标量。

    codegen报告nway args{编码器。typeof (0, [100], 1), 1}
  3. 作为替代方案,分配coder.typeof表达一个MATLAB变量,然后通过变量作为参数arg游戏:

    vareg =编码器。typeof (0, [100], 1) codegen报告nway args {vareg, 0}

相关的话题