代码生成的输入类型规范
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游戏{一},
myMultiply.c
包含C函数:double myMultiply(double a, double b){返回a * b;}
指定
一个
而且b
作为实双元5
——- - - - - -5
矩阵。要为这些输入生成代码,运行这些命令:A = 0 (5,5);codegen配置:自由myMultiplyarg游戏{一},
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游戏{一},
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_data
,b_data
,y_data
对应于输入参数x
而且b
输出参数y
在原始MATLAB函数。C函数现在接受三个额外的参数,a_size
,b_size
,y_size
的大小a_data
,b_data
,y_data
在运行时。