主要内容

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

为什么必须指定输入属性

因为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
有关更多信息,请参见fimath表示共享算术规则 (定点设计师)

当运行依赖于默认值的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属性。

  • 对于每个主函数输入,其类为结构体,按照它们在结构定义中出现的顺序指定其每个字段的属性。

定义初级输入属性的方法

方法 优势 缺点

使用App指定入口点函数输入的属性

  • 如果你在一家MATLAB编码器项目,使用方便

  • 不改变原始的MATLAB代码

  • MATLAB编码器将定义保存在项目文件中

  • 对于指定内存密集型输入,如大型结构和数组,效率不高

在命令行通过示例定义输入属性

请注意

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

  • 易于使用的

  • 不改变原始的MATLAB代码

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

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

  • 对于指定内存密集型输入,如大型结构和数组,效率不高

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

  • 与MATLAB代码集成;不需要在每次调用时重新定义属性MATLAB编码器

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

  • 高效地指定内存密集型输入,如大型结构

  • 使用复杂的语法

  • 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举例来说,请遵循以下步骤:

  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. 方法创建不动点变量numerictype而且fimath您定义的属性,例如:

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

  4. 编译函数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_valuesize_vectorvariable_dims)}
指定一个可变大小的输入:

  • 相同的类和复杂性example_value

  • 大小和上界相同size_vector

  • 指定的可变尺寸variable_dims

当启用动态内存分配时,可以指定在大小向量中,用于在编译时具有未知上界的维度。

variable_dims是一个标量,它应用于所有维度,但有以下例外:

  • 如果维度是1或0,这是固定的。

  • 如果维度是无界的,它总是可变大小的。

有关更多信息,请参见coder.typeof而且为可变大小数据生成代码

指定一个可变大小的向量输入

  1. 写一个函数来计算每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或未平均分配元素数量');结束

  2. 指定第一个输入一个作为一个双值向量。它的第一个维度保持固定的大小,第二个维度可以增长到100的上限。指定第二个输入n作为一个双标量。

    Codegen -report nway -args{编码器。typeof (0, [100], 1), 1}
  3. 作为一种替代方法,可以指定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命令:

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命令:

codegen配置:自由- cuseDefaults_2arg游戏0报告

生成的代码:

double useDefaults_2(double a) {return (a + 5.0) + 7.0;}

codegen命令:

codegen配置:自由- cuseDefaults_2arg游戏{0}报告

生成的代码:

double useDefaults_2(double a, double b) {return (a + b) + 7.0;}

相关的话题

Baidu
map