主要内容

代码生成的输入类型规范

C/ c++和MATLAB®以不同的方式处理变量。这些影响代码生成工作流的差异包括:

  • C/ c++源代码包括所有变量的类型声明。C/ c++编译器在编译时使用这些声明来确定所有变量的类型。MATLAB代码不包括显式类型声明。MATLAB执行引擎在运行时确定变量的类型。

  • 在C/ c++中,数组的内存可以在编译时静态声明(固定大小的数组),也可以在运行时动态分配(可变大小的数组)。所有MATLAB数组都使用动态分配的内存,并且大小可变。

为了允许生成具有特定类型的C/ c++代码,在C/ c++或MEX代码生成过程中,必须将所有输入变量的属性(类、大小和复杂性)指定给MATLAB入口点函数。一个入口点函数是一个顶级的MATLAB函数,您可以从中生成代码。代码生成器使用这些输入属性来确定所生成代码中所有变量的属性。不同的输入类型规格会导致相同的MATLAB代码生成不同版本的生成代码。

方法生成代码codegen命令时,使用arg游戏选项指定输入类型。方法生成代码MATLAB编码器™应用程序中指定输入类型定义输入类型页面。

要了解输入类型规范如何影响生成的代码,请考虑一个简单的MATLAB函数myMultiply两个量相乘一个而且b并返回乘积的值。

函数y = myMultiply(a,b) y = a*b;结束

为输入参数的三种不同类型规范生成静态C库代码一个而且b。在每种情况下,检查生成的代码。

  • 指定一个而且b作为实双标量。要为这些输入生成代码,运行这些命令:

    A = 1;codegen配置:自由myMultiplyarg游戏{一},
    生成的C源文件myMultiply.c包含C函数:

    double myMultiply(double a, double b){返回a * b;}
  • 指定一个而且b作为实双元5——- - - - - -5矩阵。要为这些输入生成代码,运行这些命令:

    A = 0 (5,5);codegen配置:自由myMultiplyarg游戏{一},
    生成的C源文件myMultiply.c包含C函数:

    void myMultiply(const double a[25], const double b[25], double y[25]) {int i;int i1;双d;int i2;For (i = 0;I < 5;i++) {for (i1 = 0;I1 < 5;I1 ++) {d = 0.0;For (i2 = 0; i2 < 5; i2++) { d += a[i + 5 * i2] * b[i2 + 5 * i1]; } y[i + 5 * i1] = d; } } }
    Const double a[25]而且Const double b[25]与输入相对应一个而且b在MATLAB代码。一维数组的大小一个而且b在C代码中是25方法时使用的示例输入数组中元素的总数codegen函数。

    C函数还有一个参数:一维数组y的大小25。它使用这个数组返回函数的输出。

    您还可以生成与MATLAB代码具有相同数组维度的代码。看到生成使用n维索引的代码

  • 最后,生成的代码myMultiply它可以接受许多不同大小的输入数组。要指定可变大小的输入,可以使用coder.typeof函数。coder.typeof (A, B, 1)指定具有相同类和复杂度的可变大小输入一个和由size向量的相应元素给出的上界B

    指定一个而且b作为可变大小的实双数组,其最大大小为10在任何一个维度上。要生成代码,运行这些命令:

    A =编码器。typeof (1, 10 [10], 1);codegen配置:自由myMultiplyarg游戏{一},
    生成的C函数的签名是:

    void myMultiply(const double a_data[], const int a_size[2], const double b_data[], const int b_size[2], double y_data[], int y_size[2])
    的参数a_datab_data,y_data对应于输入参数x而且b输出参数y在原始MATLAB函数。C函数现在接受三个额外的参数,a_sizeb_size,y_size的大小a_datab_data,y_data在运行时。

另请参阅

|

相关的话题