主要内容

代码生成的输入类型规范

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作为真正的双重标量。要为这些输入生成代码,请运行以下命令:

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

    double myMultiply(double a, double b) {return 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;我< 5;i++) {for (i1 = 0;i1 < 5;I1 ++) {d = 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双b [25]对应于输入一个b在matlab代码中。一维阵列的大小一个b在C代码中25的值,它等于示例输入数组中使用的元素总数codegen函数。

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

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

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

    指定一个b作为实际的可变大小的双数组,最大大小为10在维度。要生成代码,运行以下命令:

    a = coder.typeof(1,[10 10],1);codegen配置:自由myMultiplyarg游戏{一},
    生成的C函数的签名为:

    void multiply(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对应于输入参数xb输出参数y在原始MATLAB函数中。C函数现在接受另外三个参数,a_size.b_size, 和y_size.的大小a_datab_data., 和y_data在运行时。

另请参阅

|

相关话题