主要内容

一般代码生成工作流程

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

该示例简要说明了此流程图中总结的一般代码生成工作流程:

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

定义入口点功能

一个入口点功能,也称为顶层或者基本的函数是您为代码生成定义的函数。因为您无法使用最高级别调用任何功能代码根(MATLAB编码器),您必须定义一个调用启用代码生成功能的入口点功能,并通过使用用于入口点函数的C/C ++代码代码根。入口点功能中的所有功能都必须支持代码生成。万博1manbetx

添加%#codegen函数签名后,编译器指令(或PRAGMA)到入口点功能,以指示您打算为MATLAB算法生成代码。添加此指令指示MATLAB代码分析仪,以帮助您诊断和修复在代码生成期间会导致错误的违规行为。看使用代码分析仪检查代码(MATLAB编码器)

例如,要生成使用使用的代码IQR,定义此功能。

功能r = iqrcodegen(x)%#codegen%IQRCODEGEN估计四分位数%iqrcodegen返回数据x的四分位数范围%单位或双重矢量。r = iqr(x);结尾
您可以通过指定来允许可选的输入参数varargin作为输入参数。有关详细信息,请参阅可变长度参数列表的代码生成 (MATLAB编码器)为代码生成指定变量尺寸参数

生成代码

设置编译器

要生成C/C ++代码,您必须可以访问正确配置的编译器。MATLAB编码器找到并使用支持的,安装的编译器。万博1manbetx要查看和更改默认的C编译器,请输入:

梅克斯-设置
有关更多详细信息,请参阅更改默认编译器

使用代码使用代码根

设置编译器后,通过使用来为入口点函数生成代码代码根(MATLAB编码器)或者MATLAB编码器应用程序。学习如何使用MATLAB编码器应用,请参阅通过使用MATLAB编码器应用程序生成MEX函数(MATLAB编码器)

要在命令行中生成代码,请使用代码根(MATLAB编码器)。由于C和C ++是静态键入的语言,因此您必须在编译时确定入口点函数中所有变量的属性。调用时指定入口点函数的所有输入的数据类型和大小代码根通过使用-args选项。

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

    testx = randn(100,1);代码根IQRCODEGEN-args{testx}-报告

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

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

    -args {coder.typeof(example_value,,,,size_vector,,,,variable_dims
    example_value,,,,size_vector, 和variable_dims指定生成代码可以接受的输入数组的属性。

    • 输入数组具有与示例值相同的数据类型example_value

    • size_vector如果相应variable_dims值是错误的

    • size_vector如果相应variable_dims值是真的

    • variable_dims指定数组的每个维度是否具有可变大小或固定大小。一个值真的(逻辑1)表示相应的维度具有可变大小;一个值错误的(逻辑0)表示相应的尺寸具有固定的大小。

    当您拥有编译时数量未知数的数据时,指定变量大小输入很方便。例如,从中指定生成的代码iqrcodegen.m可以接受任何长度的双精度数字列向量,请输入:

    testx = coder.typeof(0,[Inf,1],[1,0]);代码根IQRCODEGEN-args{testx}-报告

    0为了example_value价值意味着数据类型是双倍的因为双倍的是MATLAB的默认数字数据类型。[INF,1]为了size_vector价值和[1,0]为了variable_dims值表示第一维的大小是可变且无限的,并且第二维的大小固定为1。

    笔记

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

  • 要指定字符数组(例如支持的名称值对参数),将字符数组指定为常数使用万博1manbetxCoder.constant(MATLAB编码器)。例如,假设'姓名'是有效的名称值对参数iqrcodegen.m,以及相应的值价值是数字。然后输入:

    代码根IQRCODEGEN-args{testx,coder.constant('name'),value}-报告

有关更多详细信息,请参阅在命令行中生成C代码(MATLAB编码器)指定入口点功能输入的属性(MATLAB编码器)

构建类型

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

  • MEX(MATLAB可执行)功能

  • 独立C/C ++代码

  • 独立C/C ++代码编译到静态库

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

  • 独立C/C ++代码编译为可执行文件

您可以使用-config选项代码根(MATLAB编码器)。有关设置代码生成选项的更多详细信息,请参阅配置构建设置(MATLAB编码器)

默认,代码根生成MEX功能。MEX函数是C/C ++程序,可从MATLAB执行。您可以使用MEX函数来加速MATLAB算法并测试生成的代码,以解决功能和运行时问题。有关详细信息,请参阅MATLAB算法加速度(MATLAB编码器)为什么在MATLAB中测试MEX功能?(MATLAB编码器)

代码生成报告

您可以使用-报告标志以生成代码生成报告。该报告可帮助您调试代码生成问题并查看生成的C ++代码。有关详细信息,请参阅代码生成报告(MATLAB编码器)

验证生成的代码

测试MEX功能以验证生成的代码是否提供与原始MATLAB代码相同的功能。要执行此测试,请使用用于运行原始MATLAB代码的相同输入运行MEX函数,然后比较结果。在生成独立代码之前,在MATLAB中运行MEX函数还使您能够检测和修复运行时错误,这些错误在生成的独立代码中很难诊断。有关更多详细信息,请参阅为什么在MATLAB中测试MEX功能?(MATLAB编码器)

传递一些数据以验证是否IQR,,,,IQRCODEGEN, 和iqrcodegen_mex返回相同的四分位间范围。

testx = randn(100,1);r = iqr(testx);r_entrypoint = iqrcodegen(testx);r_mex = iqrcodegen_mex(testx);

通过使用是平等的

iSequal(r,r_entrypoint,r_mex)

是平等的返回逻辑1(true),如果所有输入均等。

您还可以使用测试文件验证MEX函数,并且coder.runtest(MATLAB编码器)。有关详细信息,请参阅从MATLAB代码生成的测试代码(MATLAB编码器)

也可以看看

(MATLAB编码器)

相关话题