主要内容

在命令行生成C代码

在本教程中,您将使用马铃薯®编码器™Codegen.命令为MATLAB函数生成静态C库。您首先生成C代码,该代码只能接受已修复的缩减大小的输入。然后,您可以生成C代码,可以接受许多不同大小的输入。

也可以使用Matlab编码器应用程序。有关此工作流程的教程,请参阅使用MATLAB编码器应用程序生成C代码

教程文件

从文件夹中复制教程文件matlabroot\ help \ toolbox \ coder \ examples \ euclidean到一个本地工作文件夹。这里,matlabroot是matlab安装文件夹,例如,C:\ Program Files \ Matlab \ R2019A.要将这些文件复制到当前文件夹,运行MATLAB命令:

Copyfile(FullFile(Matlabroot,“帮助”“工具箱”“编码器”“例子”“欧几里得”))
本地工作文件夹不能是私有文件夹或@文件夹。本教程使用euclidean_data.mat.euclidean.mtest.mbuild_lib_fixed.m,build_lib_varifeiem.m.文件。

  • MATLAB数据文件euclidean_data.mat.包含两部分数据:三维欧几里得空间中的一个点和三维欧几里得空间中其他几个点的集合。更具体地说:

    • X是A.3.——- - - - - -1表示三维欧几里得空间中的一点的列向量。

    • CB.是A.3.——- - - - - -216大批。每列CB.表示三维欧几里得空间中的一点。

  • MATLAB文件euclidean.m包含功能欧几里德实现这一点核心算法在这个例子中。该功能需要XCB.作为输入。它计算之间的欧几里德距离X每个点CB.并返回这些数量:

    • 列向量y_min,它等于列中的列CB.这代表了最接近的点X

    • 列向量y_max.,它等于列中的列CB.这表示距离最远的点X

    • 二维向量idx.它包含向量的列指标y_miny_max.CB.

    • 二维向量距离包含了计算到的最小距离和最大距离X

    函数[y_min, y_max idx,距离]=欧几里得(x, cb)%初始化最小距离为cb的第一个元素的距离%初始化最大距离与CB的第一个元素的距离idx (1) = 1;idx (2) = 1;距离(1)=规范(x-cb (: 1));距离(2)=规范(x-cb (: 1));%找到Cb中的向量,最小距离到x求在cb中距离x最大的向量为了指数= 2:尺寸(cb, 2) d =规范(x-cb(:,指数));如果距离(1)= D;idx(1) =指数;结尾如果D>距离(2)距离(2)= D;IDX(2)=索引;结尾结尾%输出最小和最大距离矢量y_min = cb (:, idx (1));y_max = cb (:, idx (2));结尾
  • matlab脚本test.m加载数据文件euclidean_data.mat.进入工作区。然后调用该功能欧几里德计算y_miny_max.idx.,距离.然后脚本在命令行显示计算的数量。

    装载euclidean_data.mat.是在调用核心算法之前执行的预处理步骤。显示结果是后处理步骤。

    %加载测试数据加载euclidean_data.mat.%确定最近和最远的点和相应的距离[y_min, y_max idx,距离]=欧几里得(x, cb);%显示输出的最近点disp (“最接近点的坐标是:”);disp (num2str (y_min '));DISP(['最近点的索引是',num2str(IDX(1))]);DISP(['到最近点的距离是'num2str(距离(1))));disp(换行符);%显示最远点的输出disp (“最远点的坐标是:”);disp (num2str (y_max '));DISP(['最远点的索引是',num2str(IDX(2))]);DISP(['到最远点的距离是',num2str(距离(2))]);
  • 构建脚本build_lib_fixed.mbuild_lib_varifeiem.m.包含用于从MATLAB代码生成静态C库的命令,分别接受固定大小和可变大小输入。这些脚本的内容显示在教程中稍后显示,当您生成C代码时。

小费

您可以通过使用从MATLAB函数生成代码Matlab编码器.不支持从MATLAB脚本生成代码。万博1manbetx

使用测试脚本从实现核心算法的功能中分离和后处理步骤。此操作使您可以轻松地重用算法。您为实现核心算法的MATLAB函数生成代码。您不会为测试脚本生成代码。

为此生成C代码马铃薯函数

跑原来马铃薯代码

运行测试脚本test.m在MATLAB。输出显示yidx.,距离

最近点坐标为:0.8 0.8 0.4最近点指数为171到最近点的距离为0.080374最远点坐标为:0 0 1最远点指数为6到最远点的距离为1.2923

使马铃薯适合代码生成的代码

要使您的MATLAB代码适用于代码生成,请使用代码分析器和代码生成准备工具。MATLAB编辑器中的代码分析器在输入时连续检查代码。它报告了问题并建议修改以最大限度地提高性能和可维护性。代码生成准备工具屏幕筛选MATLAB代码以获取不支持代码生成的功能和功能。万博1manbetx

某些MATLAB内置功能和工具箱功能,类和支持C / C ++代码生成的系统对象具有特定的代码生成限制。万博1manbetx这些限制和相关的使用说明列于扩展能力对应参考页的部分。有关更多信息,请参阅C/ c++代码生成支持的函数和对象万博1manbetx

  1. 打开euclidean.m在MATLAB编辑器中。MATLAB Editor右上角的Code Analyzer消息指示器是绿色的。分析器没有检测到代码中的错误、警告或改进机会。

  2. 函数声明后,添加%#codegen.指示:

    函数[y, idx,距离]=欧几里得(x, cb)%#codegen.
    %#codegen.指令提示代码分析器识别特定于代码生成的警告和错误。

    Code Analyzer消息指示器变为红色,表明它已检测到代码生成问题。

  3. 若要查看警告消息,请将光标移动到带下划线的代码片段。警告表明代码生成需要这些变量idx.距离在寄出它们之前完全定义。这些警告出现,因为代码生成器必须在代码中的第一个外观中确定这些变量的大小。要解决此问题,请使用那些函数同时分配和初始化这些数组。

    %初始化最小距离为cb的第一个元素的距离%初始化最大距离与CB的第一个元素的距离idx = 1(1、2);距离= 1(1、2)*规范(x-cb (: 1));

    代码分析器消息指示器再次变为绿色,表示它不会检测到任何更多的代码生成问题。

    有关使用代码分析仪的更多信息,请参阅检查代码中的错误和警告

  4. 保存文件。

  5. 要运行代码生成准备工具,请调用编码器.Screener.函数从MATLAB命令行。

    coder.screener (“欧几里得”

    该工具未检测到任何代码生成问题欧几里德.有关更多信息,请参阅代码生成准备工具

    中不支持代码生成准备工具万博1manbetxMatlab Online™

    笔记

    代码分析器和代码生成准备工具可能无法检测到所有代码生成问题。消除了这些工具检测的错误或警告后,通过使用生成代码Matlab编码器确定您的Matlab代码是否具有其他合规性问题。

现在可以使用Matlab编码器应用。在这里,编译指来自MATLAB代码的C / C ++代码的生成。

笔记

MATLAB代码的编译是指来自MATLAB代码的C / C ++代码的生成。在其他情况下,术语编译可以指C / C ++编译器的操作。

定义输入类型

由于C使用静态类型,代码生成器必须在代码生成时确定MATLAB文件中所有变量的类、大小和复杂性,也称为编译时间.因此,当您为文件生成代码时,必须将所有输入参数的属性指定为入口点函数。一个入学点函数是您生成代码的顶级MATLAB功能。

使用使用时生成代码Codegen.命令,使用- args.选项指定对入口点函数的示例输入参数。代码生成器使用此信息来确定输入参数的属性。

在下一步中,您将使用Codegen.命令从入口点函数生成MEX文件欧几里德

检查运行时间问题

从入口点函数生成MEX函数。MEX函数生成的代码可以从MATLAB内部调用。运行MEX函数,检查生成的MEX函数与原始MATLAB函数是否具有相同的功能。

这是一个最佳做法,因为您可以检测和修复更难诊断的C代码中更难的运行时错误。默认情况下,MEX功能包括内存完整性检查。这些检查执行阵列界限和维度检查。检查在为MATLAB函数生成的代码中检测违反内存完整性。有关更多信息,请参阅控制运行时间检查

要将MATLAB代码转换为高效的C / C ++源代码,代码生成器会引入优化,在某些情况下,导致生成的代码与原始源代码不同。看生成代码与MATLAB代码之间的差异

  1. 生成一个MEX文件euclidean.m通过使用Codegen.命令。要验证MEX功能,请运行测试脚本测试调用MATLAB函数欧几里德替换为生成的MEX函数的调用。

    Codegen.euclidean.m-  args.{x, cb}-测试测试

    • 默认情况下,Codegen.生成一个名为mex函数euclidean_mex.在当前文件夹中。

    • 你用了- args.选择指定样本输入参数的入口点功能欧几里德.代码生成器使用此信息来确定输入参数的属性。

    • 你用了-测试运行测试文件的选项test.m.这个选项替换了对的调用欧几里德在测试文件中呼叫euclidean_mex.

    输出是:

    运行测试文件:'test'和MEX函数'euclidean_mex'。最近点坐标为:0.8 0.8 0.4最近点指数为171到最近点的距离为0.080374最远点坐标为:0 0 1最远点指数为6到最远点的距离为1.2923
    此输出与原始MATLAB函数生成的输出相匹配,并验证MEX函数。现在,您已经准备好生成独立的C代码欧几里德

笔记

在从MATLAB代码生成独立的C/ c++代码之前,生成一个MEX函数。运行生成的MEX函数,并确保它具有与MATLAB函数相同的运行时行为。如果生成的MEX函数生成的答案与MATLAB不同,或者生成错误,则必须在继续独立代码生成之前修复这些问题。否则,您生成的独立代码可能不可靠,并且具有未定义的行为。

生成C代码

构建脚本build_lib_fixed.m包含要为生成代码的命令euclidean.m

%加载测试数据加载euclidean_data.mat.生成欧几里得的代码。与codegen m。使用测试数据作为示例输入。Codegen.报告配置:自由euclidean.m-  args.{x, cb}
注意:

  • Codegen.读取文件euclidean.m并将MATLAB代码转换为C代码。

  • 报告选项指示Codegen.生成代码生成报告,您可以使用该报告调试代码生成问题,并验证您的MATLAB代码是否适合代码生成。

  • 配置:自由选项指示Codegen.要生成静态C库,而不是生成默认MEX函数。

  • - args.选项指示Codegen.生成以下代码euclidean.m使用示例输入参数的类,大小和复杂性XCB.

而不是生成C静态库,您可以选择通过使用合适的选项生成MEX函数或其他C / C ++构建类型Codegen.命令。有关各种代码生成选项的更多信息,请参见Codegen.

  1. 运行构建脚本。

    MATLAB处理构建文件并输出消息:

    代码成功:查看报告。
    代码生成器生成一个独立的C静态库欧几里德工作\ codegen \ lib \欧几里得.这里,工作是包含教程文件的文件夹。

  2. 要在报表查看器中查看代码生成报表,请单击查看报告

    如果代码生成器在代码生成期间检测到错误或警告,则报告描述问题并提供有关MATLAB代码的链接。看代码生成报告

小费

使用构建脚本在命令行生成代码。构建脚本自动执行一系列MATLAB命令,您可以在命令行重复执行这些命令,节省您的时间并消除输入错误。

比较生成的C代码和原始的马铃薯代码

要将生成的C代码与原始MATLAB代码进行比较,请打开C文件,euclidean.c,而且euclidean.mMATLAB编辑器中的文件。

生成的C代码的重要信息:

  • 函数签名是:

    Void euclidean(const double x[3], const double cb[648], double y_min[3], double y_max[3], double idx[2], double distance[2])

    const double x [3]对应于输入X在MATLAB代码中。的大小X3.,它对应于您在为MATLAB代码生成代码时使用的示例输入的总大小(3 x 1)。

    const double cb [648]对应于输入CB.在MATLAB代码中。的大小CB.648,它对应于您在生成MATLAB代码的代码时使用的示例输入的总大小(3 x 216)。在这种情况下,生成的代码使用一维阵列来表示MATLAB代码中的二维数组。

    生成的代码有四个额外的输入参数:数组y_miny_max.idx.,距离.这些阵列用于返回输出值。它们对应于输出参数y_miny_max.idx.,距离在原始的MATLAB代码。

  • 代码生成器保留函数名和注释。如果可能,代码生成器会保留变量名。

    笔记

    如果MATLAB代码中的变量设置为常量值,则不会在生成的C代码中显示为变量。相反,生成的C代码包含变量的实际值。

使用嵌入式编码器®,您可以在MATLAB代码和生成的C / C ++代码之间交互式追踪。看MATLAB代码与生成C / C ++代码之间的交互跟踪(嵌入式编码器)

生成可变大小输入的C代码

您生成的C函数euclidean.m只能接受与代码生成期间指定的示例输入大小相同的输入。然而,对应MATLAB函数的输入数组可以是任意大小的。在本教程的这一部分中,您将从下面生成C代码euclidean.m接受可变大小的输入。

假设你想要XCB.在生成的C代码中有以下属性:

  • 两者的第一维度XCB.大小可以变化到3.

  • 第二个维度X是固定的,有值吗1

  • 第二个维度CB.大小可以变化到216

要指定这些输入属性,请使用coder.typeof功能。Coder.typeof(a,b,1)指定具有相同类和复杂性的可变大小输入一种上界由大小向量的相应元素给出B..使用构建脚本build_lib_varifeiem.m.使用coder.typeof指定生成的C库中的变量大小输入的属性。

%加载测试数据加载euclidean_data.mat.%使用代码器.Typeof指定变量大小输入eg_x =编码器。typeof (x, [3 1], 1);eg_cb =编码器。typeof (cb [216], 1);生成欧几里得的代码。使用编码器。typeof指定示例输入的上限值Codegen.报告配置:自由euclidean.m-  args.{eg_x,eg_cb}

现在,您可以按照与前面相同的步骤生成代码。中生成的C代码的函数签名euclidean.c现在写着:

Void euclidean(const double x_data[], const int x_size[1], const double cb_data[], const int cb_size[2], double y_min_data[], int y_min_size[1], double y_max_data[], int y_max_size[1], double idx[2], double distance[2])
的参数x_datacb_datay_min_data.,y_max_data.对应于输入参数XCB.和输出参数y_miny_max.在原始的matlab函数中。C函数现在接受四个附加输入参数x_sizecb_size.y_min_size.y_max_size指定尺寸x_datacb_datay_min_data.,y_max_data.在运行时。

下一个步骤

目标 更多信息

了解对MATLAB内置函数和工具箱函数、类和System万博1manbetx对象的代码生成支持

C/ c++代码生成支持的函数和对象万博1manbetx

生成C ++代码

c++代码生成

以交互方式创建和编辑输入类型

使用编码器类型编辑器创建和编辑输入类型

生成和修改示例C main函数并使用它来构建C可执行程序

在应用程序中使用示例C MAIN

将文件包生成到压缩文件中

其他开发环境的包代码

优化生成代码的执行速度或内存使用

优化策略

将自定义C / C ++代码集成到生成的代码中

来自MATLAB代码的C / C ++代码

了解代码生成报告

代码生成报告

MATLAB代码与生成C / C ++代码之间的交互跟踪(嵌入式编码器)

也可以看看

|