代码生成的输入类型设定
C/C++ 和 MATLAB® 以不同方式处理变量。影响代码生成工作流的一些差异包括:
C/C++ 源代码包括所有变量的类型声明。C/C++ 编译器在编译时使用这些声明来确定所有变量的类型。MATLAB 代码不包括显式类型声明。MATLAB 执行引擎在运行时决定变量的类型。
在 C/C++ 中,数组的内存可以在编译时静态声明(固定大小数组),也可以在运行时动态分配(可变大小数组)。所有 MATLAB 数组都使用动态分配的内存,大小可变。
要允许生成具有特定类型的 C/C++ 代码,您必须在 C/C++ 或 MEX 代码生成期间指定 MATLAB 入口函数的所有输入变量的属性(类、大小和复/实性)。入口函数是顶层 MATLAB 函数,您可以从中生成代码。代码生成器使用这些输入属性来确定生成的代码中所有变量的属性。不同的输入类型设定可能导致相同的 MATLAB 代码生成不同版本的代码。
您可以指定输入类型:
下面以一个简单的 MATLAB 函数 myMultiply
为例,说明输入类型设定如何影响生成的代码。该函数将 a
和 b
两个量相乘,并返回乘积的值。
function y = myMultiply(a,b) y = a*b; end
为输入参量 a
和 b
的三种不同类型设定生成静态 C 库代码。在每种情况下,检查生成的代码。
将
a
和b
指定为双精度实数标量。要为这些输入生成代码,请运行以下命令:生成的 C 源文件a = 1; codegen -config:lib myMultiply -args {a,a}
myMultiply.c
包含 C 函数:double myMultiply(double a, double b) { return a * b; }
将
a
和b
指定为由双精度实数组成的5
×5
矩阵。要为这些输入生成代码,请运行以下命令:生成的 C 源文件a = zeros(5,5); codegen -config:lib myMultiply -args {a,a}
myMultiply.c
包含 C 函数:void myMultiply(const double a[25], const double b[25], double y[25]) { int i; int i1; double 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]
对应于 MATLAB 代码中的输入a
和b
。C 代码中一维数组a
和b
的大小是25
,这等于在调用codegen
函数时使用的示例输入数组中的元素总数。C 函数还另有一个参量:一维数组
y
,其大小为25
。它使用此数组返回函数的输出。您还可以生成与 MATLAB 代码具有相同数组维度的代码。请参阅Generate Code That Uses N-Dimensional Indexing。
最后,您为
myMultiply
(它可接受许多不同大小的输入数组)生成代码。要指定可变大小的输入,您可以使用coder.typeof
函数。coder.typeof(A,B,1)
指定一个可变大小的输入,其类和复/实性与A
相同,其上限由大小向量B
的对应元素给出。将
a
和b
指定为可变大小的双精度实数数组,任一维度上的最大大小为10
。要生成代码,请运行以下命令:生成的 C 函数的签名是:a = coder.typeof(1,[10 10],1); codegen -config:lib myMultiply -args {a,a}
参量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
对应于原始 MATLAB 函数中的输入参量a
和b
以及输出参量y
。现在,C 函数接受另外三个参量a_size
、b_size
和y_size
,它们在运行时指定a_data
、b_data
和y_data
的大小。