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游戏{一},
myMultiply.c
包含C功能:
double myMultiply(double a, double b) {return 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;我< 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游戏{一},
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_data
,b_data.
, 和y_data
对应于输入参数x
和b
输出参数y
在原始MATLAB函数中。C函数现在接受另外三个参数,a_size.
,b_size
, 和y_size.
的大小a_data
,b_data.
, 和y_data
在运行时。