本页面提供的是上一版软件的文档。当前版本中已删除对应的英文页面。
从简单 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] */