生成C代码使用MATLAB编码器应用程序

在本教程中,您将使用MATLAB®编码器™应用程序生成的MATLAB功能的静态C库。您首先生成C代码只能接受有固定预先指定的尺寸输入。然后生成C代码,可以接受许多不同大小的输入。

您也可以通过使用产生在MATLAB命令行代码codegen命令。有关此工作流程的教程,请在命令行生成C代码

MATLAB编码器不支持应用程序万博1manbetxMATLAB在线™。生成C/ c++代码MATLAB在线, 使用codegen命令。

教程文件

教程文件从文件夹复制matlabroot\帮助\工具箱\编码器\例子\欧几里德到本地工作文件夹。在这里,matlabroot例如MATLAB安装文件夹,C:\ Program Files文件\ MATLAB \ R2019a。要将这些文件复制到当前文件夹,请运行以下MATLAB命令:

的CopyFile(完整文件(matlabroot,“帮助”“工具箱”“编码器”'例子'“欧几里得”))
本地工作文件夹不能是私人文件夹或文件夹@。本教程使用euclidean_data.mateuclidean.m,test.m文件。

  • MATLAB数据文件euclidean_data.mat包含数据两个部分组成:在三维欧几里德空间中的单个点和三维欧几里得空间的一组其它几个点。进一步来说:

    • X是一个3-通过-1表示三维欧几里德空间中一点的列向量。

    • CB是一个3-通过-216阵列。在每一列CB表示在三维欧几里德空间中的点。

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

    • 列向量Y_MIN,它等于in的列向量CB表示这是最接近点X

    • 列向量y_max,它等于in的列向量CB这代表离它最远的点X

    • 二维矢量idx包含载体的列索引Y_MINy_maxCB

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

    函数[y_min, y_max idx,距离]=欧几里得(x, cb)将最小距离初始化为到cb第一个元素的距离将最大距离初始化为到cb第一个元素的距离idx (1) = 1;idx (2) = 1;距离(1)=规范(x-cb (: 1));距离(2)=规范(x-cb (: 1));求出距离x最小的cb中的向量找到距离x最大的cb中的向量对于索引= 2:尺寸(CB,2)d =范数(X-CB(:,索引));如果d <距离(1)距离(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_maxidx,距离。然后脚本在命令行显示计算出的数量。

    加载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))]);

小费

可以使用以下命令从MATLAB函数生成代码MATLAB编码器。不支持从MATLAB脚本生成代码。万博1manbetx

使用测试脚本将预处理和后处理步骤与实现核心算法的功能分离开来。这种实践使您能够轻松地重用您的算法。您将为实现核心算法的MATLAB函数生成代码。您不为测试脚本生成代码。

的生成C代码MATLAB函数

运行原MATLAB代码

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

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

使MATLAB适合代码生成的代码

该代码分析器在MATLAB编辑器,当你进入它不断地检查你的代码。它报告的问题,并建议修改为了最大限度地提高性能和可维护性。

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

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

    函数[Y,IDX,距离] =欧几里德(X,CB)% # codegen
    % # codegen指令提示代码分析器识别特定于代码生成的警告和错误。

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

  3. 要查看的警告信息,将光标移动到带下划线的代码片段。该警告表明,代码生成需要的变量idx距离到下标之前完全定义。这些警告出现,因为在代码生成器必须在代码中的首次亮相确定这些变量的大小。要解决此问题,使用函数可以同时分配和初始化这些数组。

    将最小距离初始化为到cb第一个元素的距离将最大距离初始化为到cb第一个元素的距离IDX =酮(1,2);距离=酮(1,2)*范数(X-CB(:,1));

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

    有关使用代码分析器的更多信息,请参见验证码错误和警告(MATLAB)。

  4. 保存文件。

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

注意

的MATLAB代码编译指从MATLAB代码C / C ++代码的生成。在其他情况下,术语汇编可以指一个C / C ++编译器的作用。

打开MATLAB编码器App和选择源文件

  1. 在MATLAB工具条上应用程序选项卡,在代码生成,单击MATLAB编码器应用程序图标。应用程序打开选择源文件页面。

  2. 选择源文件页,输入或选择入口点函数的名称欧几里得。一个入口点函数是从中生成代码顶级MATLAB功能。该应用程序创建了默认名称的项目euclidean.prj在当前文件夹中。

  3. 点击下一个定义输入类型步。该应用程序运行代码分析器(你已经跑在前面的步骤),并在入口点函数的代码生成准备工具。代码生成准备工具筛选对于那些不支持代码生成功能和功能的MATLAB代码。万博1manbetx如果应用程序识别的问题,它会打开检查代码生成准备情况可以查看和修复问题的页面。在本例中,因为应用程序没有检测到问题,所以它打开了定义输入类型页面。欲了解更多信息,请参阅代码生成准备工具

    注意

    代码分析器和代码生成准备工具可能无法检测到所有代码生成问题。在消除这两个工具检测到的错误或警告之后,生成代码MATLAB编码器以确定您的MATLAB代码有其他合规问题。

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

定义输入类型

因为C使用静态类型,代码生成器必须在代码生成时确定MATLAB文件中所有变量的类、大小和复杂度编译时间。因此,你必须指定的所有入口点函数输入的特性。要指定输入特性,您可以:

  • 通过提供一个脚本,使用样例输入调用入口点函数,指示应用程序自动确定输入属性。

  • 直接指定属性。

在本例中,定义输入的属性XCB,指定测试文件test.m代码生成器可以用来自动定义类型:

  1. 输入或选择测试文件test.m

  2. 点击Autodefine输入类型

    测试文件,test.m,调用入口点函数,欧几里得,与预期的输入类型。该应用确定输入X双(3 x1)和输入CB双(3 x216)

  3. 点击下一个检查运行时的问题步。

检查运行时的问题

检查运行时的问题步骤生成从入口点函数的一个MEX文件,运行MEX功能,并报告问题。甲MEX函数生成代码,它可以从内部MATLAB被调用。这是执行这一步,因为你可以检测并更难生成的C代码来诊断修复运行时错误的最佳做法。默认情况下,MEX功能包括内存完整性检查。这些检查执行数组边界和尺寸检查。支票检测为MATLAB函数生成码违例的存储器的完整性。欲了解更多信息,请参阅控制运行时检查

转换MATLAB代码到高效的C / C ++源代码,代码生成介绍优化的是,在某些情况下,造成所生成的代码来表现比原来的源代码不同。看到生成的代码和MATLAB代码之间的差异

  1. 要打开检查运行时的问题对话框中,单击检查问题箭头

  2. 检查运行时的问题对话框,指定测试文件或输入调用与例如输入的入口点函数的代码。在这个例子中,使用测试文件测试您用来定义输入类型。

  3. 点击检查问题

    该应用程序生成一个MEX函数。它运行测试脚本测试更换要求欧几里得调用生成的MEX。如果应用程序在生成或执行MEX函数期间检测到问题,它将提供警告和错误消息。单击这些消息以导航到有问题的代码并修复问题。在本例中,应用程序没有检测到问题。

  4. 默认情况下,应用程序收集行执行计数。这些计数帮助你看到测试文件如何test.m行使欧几里得功能。要查看行执行次数,点击查看MATLAB行执行计数。应用程序编辑器在代码的左侧显示一个彩色代码条。要在代码上扩展颜色高亮显示并查看行执行计数,请将光标放在栏上。

    特定的绿色阴影表示此代码的行执行计数落在某个范围内。在这种情况下,对于循环执行215次。有关如何解释行执行计数和关闭计数集合的信息,请参阅收集和查看生产线执行计数为您的MATLAB代码

  5. 点击下一个生成代码步。

生成C代码

  1. 要打开生成对话框中,单击生成箭头

  2. 生成对话框中,设置构建类型静态库(.LIB)语言C.为其他项目构建配置设置使用默认值。

    您可以选择生成一个MEX函数或其他C/ c++构建类型,而不是生成一个C静态库。可以为MEX和C/ c++构建类型提供不同的项目设置。当您在MEX和C/ c++代码生成之间切换时,请验证您所选择的设置。

  3. 点击生成

    MATLAB编码器生成一个独立的C静态库欧几里得在里面工作\代码生成\ LIB \欧几里德工作是包含教程文件的文件夹。该MATLAB编码器app表示代码生成成功。它在页面的左侧显示源MATLAB文件和生成的输出文件。在变量选项卡,它显示了有关MATLAB源变量的信息。在目标生成日志选项卡,它显示生成日志,包括C/ c++编译器警告和错误。默认情况下,在代码窗口中,应用程序显示C源代码文件,euclidean.c。中查看另一个文件源代码输出文件窗格中,单击文件名。

  4. 点击查看报告要在报表查看器中查看报表。如果代码生成器在代码生成过程中检测到错误或警告,则报告将描述问题并提供指向有问题的MATLAB代码的链接。欲了解更多信息,请参阅代码生成报告

  5. 点击下一个打开完成工作流程页面。

查看Finish工作流页面

完成工作流程页面显示的代码生成成功。它提供了一个项目摘要和链接生成的输出。

比较生成的C代码到原始MATLAB代码

要比较你生成的C代码到原来的MATLAB代码,打开C文件,euclidean.c,euclidean.m文件在MATLAB编辑器中。

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

  • 函数签名为:

    空隙欧几里德(常量双X [3],常量双CB [648],双Y_MIN [3],双Y_MAX [3],双IDX [2],双距离[2])

    const双x [3]对应于输入X在您的MATLAB代码。的大小X3,这对应于示例性输入的总大小(3×1)您在从MATLAB代码生成的代码使用。

    常量双CB [648]对应于输入CB在您的MATLAB代码。的大小CB648,这对应于示例性输入的总大小(3×216),其当您从MATLAB代码生成的代码使用。在这种情况下,所产生的代码使用的一维数组来表示在MATLAB代码的二维数组。

    生成的代码具有四个附加的输入参数:阵列Y_MINy_maxidx,距离。这些阵列用于返回的输出值。它们对应于输出参数Y_MINy_maxidx,距离在原始的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

要指定这些输入属性:

  1. 定义输入类型步骤,输入测试文件test.m并点击Autodefine输入类型像以前一样。测试文件调用入口点函数,euclidean.m,与预期的输入类型。该应用确定输入X双(3 x1)和输入CB双(3 x216)。这些类型指定固定大小的输入。

  2. 单击输入类型规范并编辑它们。可以使用前缀。例如,:3意味着对应的尺寸的尺寸可以变化高达3。更改类型双(:3×1)对于X双(:3×:216)对于CB

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

* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
的参数x_datacb_datay_min_data,y_max_data对应于输入的参数XCB以及输出参数Y_MINy_max在原来的MATLAB函数中。C函数现在接受四个额外的输入参数x_sizecb_sizey_min_size,y_max_size指定的大小x_datacb_datay_min_data,y_max_data在运行时。

下一个步骤

目标 更多信息

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

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

生成和修改的实施例C的主要功能,并用它来生成C可执行程序

在应用程序中使用的实施例C的主要

打包生成的文件转换成一个压缩文件

包代码其它开发环境

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

优化策略

将定制的C/ c++代码集成到生成的代码中

从MATLAB代码中调用C/ c++代码

了解代码生成报告

代码生成报告

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