Main Content

本页翻译不是最新的。点击此处可查看最新英文版本。

代码生成的输入类型设定

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

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

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

要允许生成具有特定类型的 C/C++ 代码,您必须在 C/C++ 或 MEX 代码生成期间指定 MATLAB 入口函数的所有输入变量的属性(类、大小和复/实性)。入口函数是顶层 MATLAB 函数,您可以从中生成代码。代码生成器使用这些输入属性来确定生成的代码中所有变量的属性。不同的输入类型设定可能导致相同的 MATLAB 代码生成不同版本的代码。

您可以指定输入类型:

  • 通过使用 arguments 块在 MATLAB 入口函数中执行函数参量验证

  • MATLAB Coder™定义输入类型窗格中

  • 通过在命令行将 -args 选项与 codegen 结合使用

  • 通过在 MATLAB 代码中使用 assert 语句预条件输入变量

下面以一个简单的 MATLAB 函数 myMultiply 为例,说明输入类型设定如何影响生成的代码。该函数将 ab 两个量相乘,并返回乘积的值。

function y = myMultiply(a,b)
y = a*b;
end

为输入参量 ab 的三种不同类型设定生成静态 C 库代码。在每种情况下,检查生成的代码。

  • ab 指定为双精度实数标量。要为这些输入生成代码,请运行以下命令:

    a = 1;
    codegen -config:lib myMultiply -args {a,a}
    生成的 C 源文件 myMultiply.c 包含 C 函数:

    double myMultiply(double a, double b)
    {
      return a * b;
    }
  • ab 指定为由双精度实数组成的 5×5 矩阵。要为这些输入生成代码,请运行以下命令:

    a = zeros(5,5);
    codegen -config:lib myMultiply -args {a,a}
    生成的 C 源文件 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 代码中的输入 ab。C 代码中一维数组 ab 的大小是 25,这等于在调用 codegen 函数时使用的示例输入数组中的元素总数。

    C 函数还另有一个参量:一维数组 y,其大小为 25。它使用此数组返回函数的输出。

    您还可以生成与 MATLAB 代码具有相同数组维度的代码。请参阅Generate Code That Uses N-Dimensional Indexing

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

    ab 指定为可变大小的双精度实数数组,任一维度上的最大大小为 10。要生成代码,请运行以下命令:

    a = coder.typeof(1,[10 10],1);
    codegen -config:lib myMultiply -args {a,a}
    生成的 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_datay_data 对应于原始 MATLAB 函数中的输入参量 ab 以及输出参量 y。现在,C 函数接受另外三个参量 a_sizeb_sizey_size,它们在运行时指定 a_datab_datay_data 的大小。

另请参阅

|

相关主题