Main Content

本页面提供的是上一版软件的文档。当前版本中已删除对应的英文页面。

从简单 MATLAB 函数生成 C 代码

此示例说明如何在命令行使用 codegen 命令从简单的 MATLAB® 函数生成 C 代码。

创建简单函数

创建一个简单函数来计算一个矩阵及其转置的矩阵乘积和逐元素乘积。添加 %#codegen 指令,以提示 MATLAB 代码分析器识别特定于代码生成的警告和错误。使用 arguments 模块将输入指定为由 doubles 值组成的 5x5 矩阵。

type matMult.m
function [elementProduct, matrixProduct]  = matMult(A) %#codegen
arguments
    A (5,5) double
end
elementProduct = A .* A';
matrixProduct = A * A';
end

创建一个示例矩阵,并在 MATLAB 中运行 matMult

A = magic(5);
[x,y] = matMult(A)
x = 5×5

   289   552     4    80   165
   552    25    42   168   288
     4    42   169   380   550
    80   168   380   441     6
   165   288   550     6    81

y = 5×5

        1155         870         715         690         795
         870        1055         845         765         690
         715         845        1105         845         715
         690         765         845        1055         870
         795         690         715         870        1155

生成用于测试的 MEX 函数

使用 codegen 命令从 matMult 生成一个 MEX 函数。codegen 命令会检查 MATLAB 函数是否适用于代码生成,并生成 MEX 函数,您可以在生成 C 代码之前在 MATLAB 中测试该函数。

codegen matMult
Code generation successful.

默认情况下,codegen 在当前文件夹中生成名为 matMult_mex 的 MEX 函数。运行 MEX 函数检查运行时错误,并将 MEX 函数输出与 MATLAB 函数输出进行比较。

[x_mex,y_mex] = matMult_mex(A)
x_mex = 5×5

   289   552     4    80   165
   552    25    42   168   288
     4    42   169   380   550
    80   168   380   441     6
   165   288   550     6    81

y_mex = 5×5

        1155         870         715         690         795
         870        1055         845         765         690
         715         845        1105         845         715
         690         765         845        1055         870
         795         690         715         870        1155

生成和检查 C 代码

使用带 -config:lib 选项的 codegen 命令从 matMult 生成打包为独立 C 库的 C 代码。您可以在 codegen/lib/matMult 文件夹中找到生成的 C 代码。检查生成的 C 代码,并将其与 MATLAB 代码进行比较。

codegen -config:lib matMult
Code generation successful.
type codegen/lib/matMult/matMult.c
/*
 * File: matMult.c
 *
 * MATLAB Coder version            : 23.2
 * C/C++ source code generated on  : 16-Oct-2023 16:08:56
 */

/* Include Files */
#include "matMult.h"

/* Function Definitions */
/*
 * Arguments    : const double A[25]
 *                double elementProduct[25]
 *                double matrixProduct[25]
 * Return Type  : void
 */
void matMult(const double A[25], double elementProduct[25],
             double matrixProduct[25])
{
  double elementProduct_tmp[25];
  int i;
  int i1;
  int i2;
  for (i = 0; i < 5; i++) {
    for (i1 = 0; i1 < 5; i1++) {
      elementProduct_tmp[i1 + 5 * i] = A[i + 5 * i1];
    }
  }
  for (i = 0; i < 25; i++) {
    elementProduct[i] = A[i] * elementProduct_tmp[i];
  }
  for (i = 0; i < 5; i++) {
    for (i1 = 0; i1 < 5; i1++) {
      double d;
      d = 0.0;
      for (i2 = 0; i2 < 5; i2++) {
        d += A[i + 5 * i2] * elementProduct_tmp[i2 + 5 * i1];
      }
      matrixProduct[i + 5 * i1] = d;
    }
  }
}

/*
 * File trailer for matMult.c
 *
 * [EOF]
 */

另请参阅

|

相关主题