主要内容

通用代码生成工作流程

不是机器学习模型的对象函数的统计和机器学习工具箱函数的通用代码生成工作流与中描述的工作流相同MATLAB®编码器™.详细信息请参见开始使用MATLAB编码器(MATLAB编码器).要了解如何为机器学习模型的对象函数生成代码,请参见代码生成简介

这个例子简单地解释了一般的代码生成工作流程,总结在这个流程图中:

通用代码生成工作流。步骤1:定义一个入口点函数。步骤2:生成代码。步骤3:验证生成的代码。

定义入口点函数

一个入口点函数,也称为顶级主要的函数,是为代码生成而定义的函数。因为您不能在顶层使用codegen(MATLAB编码器),您必须定义一个入口点函数来调用启用代码生成的函数,并通过使用为入口点函数生成C/ c++代码codegen.入口点函数中的所有函数都必须支持代码生成。金宝app

添加% # codegen编译器指令(或pragma)到函数入口点之后的函数签名,以表明您打算为MATLAB算法生成代码。添加此指令将指导MATLAB代码分析器帮助您诊断和修复在代码生成过程中可能导致错误的违规行为。看到使用代码分析器检查代码(MATLAB编码器)

例如,生成用于估计数据集的四分位范围的代码位差,定义此函数。

函数r = iqrCodeGen(x)% # codegen估计四分位范围% iqrCodeGen返回数据x的四分位范围,%单精度或双精度矢量。R = iqr(x);结束
您可以通过指定允许可选的输入参数变长度输入宗量作为输入参数。详细信息请参见可变长度参数列表的代码生成 (MATLAB编码器)而且为代码生成指定可变大小的参数

生成代码

设置编译器

要生成C/ c++代码,必须能够访问配置正确的编译器。MATLAB编码器定位并使用受支持的已安装编译器。金宝app要查看和更改默认的C编译器,输入:

墨西哥人设置
详情请参见更改默认编译器

使用生成代码codegen

在设置编译器之后,通过使用生成入口点函数的代码codegen(MATLAB编码器)或者是MATLAB编码器应用程序来生成代码MATLAB编码器应用程序,请参阅使用MATLAB Coder App生成MEX函数(MATLAB编码器)

要在命令行生成代码,请使用codegen(MATLAB编码器).因为C和c++都是静态类型语言,所以必须在编译时确定入口点函数中所有变量的属性。在调用时指定入口点函数的所有输入的数据类型和大小codegen通过使用arg游戏选择。

  • 要指定数据类型和精确的输入数组大小,请传递一个MATLAB表达式,该表达式表示具有特定数据类型和数组大小的值集。例如,指定生成的代码来自iqrCodeGen.m必须接受带有100个元素的双精度数值列向量,输入:

    testX = randn(100,1);codegeniqrCodeGenarg游戏{testX}报告

    报告标志生成代码生成报告。看到代码生成报告(MATLAB编码器)

  • 若要指定至少一个维度可以具有任意长度,请使用arg游戏选项coder.typeof(MATLAB编码器)如下。

    args {coder.typeof (example_valuesize_vectorvariable_dims)}
    的价值example_valuesize_vector,variable_dims指定生成的代码可以接受的输入数组的属性。

    • 中的示例值具有相同的数据类型example_value

    • size_vector输入数组的数组大小是否对应variable_dims值是

    • size_vector数组大小的上限是否对应variable_dims值是真正的

    • variable_dims指定数组的每个维度的大小是可变的还是固定的。值为真正的(逻辑1)表示对应维度大小可变;值为(逻辑0)表示对应的维度有固定的大小。

    当您在编译时拥有的数据具有未知数量的观察值时,指定变量大小的输入非常方便。例如,指定生成的代码来自iqrCodeGen.m可以接受任意长度的双精度数值列向量,输入:

    testX = code .typeof(0,[Inf,1],[1,0]);codegeniqrCodeGenarg游戏{testX}报告

    0example_value值表示数据类型为因为是MATLAB默认的数值数据类型。(正,1)size_vector价值和(1,0)variable_dimsValue表示第一个维度的大小是可变的无界的,第二个维度的大小固定为1。

    请注意

    可变大小输入的规格会影响性能。详细信息请参见控制可变大小数组的内存分配(MATLAB编码器)

  • 若要指定字符数组,如支持的名-值对参数,请将字符数组指定为常量using金宝app编码器。常数(MATLAB编码器).例如,假设“名字”是否为有效的名值对参数iqrCodeGen.m,和对应的值价值是数字。然后输入:

    codegeniqrCodeGenarg游戏{testX, coder.Constant(“名字”),值}报告

详情请参见在命令行生成C代码(MATLAB编码器)而且指定入口点函数输入的属性(MATLAB编码器)

构建类型

MATLAB编码器可以为这些类型生成代码:

  • MEX (MATLAB可执行)函数

  • 独立的C/ c++代码

  • 编译成静态库的独立C/ c++代码

  • 编译成动态链接库的独立C/ c++代码

  • 编译成可执行文件的独立C/ c++代码

属性指定生成类型配置选择codegen(MATLAB编码器).有关设置代码生成选项的详细信息,请参见配置生成设置(MATLAB编码器)

默认情况下,codegen生成一个MEX函数。MEX函数是一个C/ c++程序,可在MATLAB中执行。您可以使用MEX函数来加速MATLAB算法,并测试生成的代码的功能和运行时问题。详细信息请参见MATLAB算法加速(MATLAB编码器)而且为什么在MATLAB中测试MEX函数?(MATLAB编码器)

代码生成报告

您可以使用报告标志以生成代码生成报告。此报告帮助您调试代码生成问题并查看生成的C/ c++代码。详细信息请参见代码生成报告(MATLAB编码器)

验证生成的代码

测试一个MEX函数,以验证生成的代码提供与原始MATLAB代码相同的功能。要执行此测试,请使用与运行原始MATLAB代码相同的输入运行MEX函数,然后比较结果。在生成独立代码之前在MATLAB中运行MEX函数还使您能够检测和修复难以在生成的独立代码中诊断的运行时错误。详情请参见为什么在MATLAB中测试MEX函数?(MATLAB编码器)

传递一些数据来验证是否位差iqrCodeGen,iqrCodeGen_mex返回相同的四分位范围。

testX = randn(100,1);r = iqr(testX);r_entrypoint = iqrCodeGen(testX);r_mex = iqrCodeGen_mex(testX);

通过使用比较输出isequal

isequal (r, r_entrypoint, r_mex)

isequal如果所有输入都相等,则返回逻辑1 (true)。

您也可以使用测试文件和来验证MEX功能coder.runTest(MATLAB编码器).详细信息请参见从MATLAB代码生成测试代码(MATLAB编码器)

另请参阅

(MATLAB编码器)

相关的话题