主要内容

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

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

你也可以生成代码在MATLAB命令行通过使用codegen命令。教程在这个工作流,请参阅在命令行生成C代码

MATLAB编码器应用程序不支持金宝appMATLAB在线™。生成C / c++代码MATLAB在线,可以使用codegen命令。

教程文件:欧氏距离

打开这个例子中获取文件对于本教程。

教程的描述文件

本教程使用的euclidean_data.mat,euclidean.m,test.m文件。

  • MATLAB数据文件euclidean_data.mat包含两个数据:一个点在三维欧氏空间和一组其他几个点在三维欧几里得空间。更具体地说:

    • x是一个3——- - - - - -1列向量表示一个点在三维欧几里得空间。

    • cb是一个3——- - - - - -216年数组中。每一列中cb代表一个点在三维欧几里得空间。

  • MATLAB文件euclidean.m包含的功能欧几里得实现核心算法在这个例子中。的函数xcb作为输入。这之间的欧氏距离计算x和每一个点cb并返回这些数量:

    • 列向量y_min,等于列cb表示最近的点x

    • 列向量y_max,等于列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));%在cb找到向量最小距离x%在cb找到向量最大距离x指数= 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_min,y_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))));

提示

你可以从MATLAB函数通过使用生成代码MATLAB编码器。不支持从MATLAB脚本代码生成。金宝app

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

生成C代码MATLAB函数

运行原MATLAB代码

运行测试脚本test.m在MATLAB。输出显示y,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 (1、2);距离= 1(1、2)*规范(x-cb (: 1));

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

    使用代码分析器的更多信息,请参阅校验码错误和警告使用代码分析器

  4. 保存文件。

    现在,您可以编译代码通过使用MATLAB编码器应用。在这里,编译指的是一代的C / c++代码从MATLAB代码。

请注意

编制MATLAB代码指的是一代的C / c++代码的MATLAB代码。在其他情况下,编译一词可以指一个C / c++编译器的作用。

打开MATLAB编码器应用程序并选择源文件

  1. 在MATLAB将来发布应用程序选项卡,在代码生成,单击MATLAB编码器应用程序图标。应用程序打开选择源文件页面。

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

  3. 点击下一个定义输入类型的一步。应用程序运行的代码分析器(你已经跑在前面的步骤)和代码生成准备工具的入口点函数。代码生成工具准备屏幕的MATLAB代码特性和功能不支持代码生成。金宝app如果应用程序标识问题,它打开了审查代码生成准备页面,您可以查看并修复问题。在这个例子中,因为应用程序没有检测问题,它打开了定义输入类型页面。有关更多信息,请参见代码生成工具准备

    请注意

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

某些MATLAB内置函数和工具箱函数、类和系统对象支持C / c++代码生成有特定的代码生成的局限性。金宝app这些限制和相关使用笔记中列出扩展功能相应的参考页面的部分。有关更多信息,请参见函数和对象支持C / c++代码生成金宝app

定义输入类型

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

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

  • 直接指定属性。

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

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

  2. 点击Autodefine输入类型

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

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

检查运行时问题

检查运行时问题一步生成一个墨西哥人文件从你的入口点函数,墨西哥人功能,运行和报告问题。一个墨西哥人函数可以从内部调用MATLAB生成的代码。这是一个最佳实践执行这一步,因为你可以探测和修复中更难诊断运行时错误生成的C代码。默认情况下,墨西哥人功能包括内存完整性检查。这些检查执行数组界限和尺寸检查。内存完整性的检查检测违反代码生成的MATLAB函数。有关更多信息,请参见控制运行时检查

MATLAB代码转换为有效的C / c++源代码,代码生成器介绍优化,在某些情况下,导致生成的代码的行为不同于原始的源代码。看到生成的代码和MATLAB代码之间的区别

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

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

  3. 点击检查问题

    应用程序生成一个墨西哥人的功能。它运行测试脚本测试更换要求欧几里得与调用生成的墨西哥人。如果应用程序检测到问题在墨西哥人一代或执行函数,它提供了警告和错误消息。点击这些信息导航到有问题的代码和解决这个问题。在本例中,应用程序并不检测问题。

  4. 默认情况下,应用程序收集行执行计数。这些重要的帮你看看测试文件test.m锻炼的欧几里得函数。查看行执行数量,点击视图MATLAB行执行计数。程序编辑器显示一个颜色栏左边的代码。延长颜色突出显示的代码和线执行计数,将您的鼠标停留在酒吧。

    特定的绿色表明这段代码的执行行数下降在一定范围内。在这种情况下,循环执行215次。如何解释信息行执行计数和关闭的,看到的收集和查看执行计数MATLAB代码行

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

请注意

生成独立的C / c++代码之前从MATLAB代码,生成一个墨西哥人的功能。运行生成的墨西哥人功能,并确保它与MATLAB函数相同的运行时行为。如果生成的墨西哥人与MATLAB函数产生的答案不同,或产生一个错误,你必须解决这些问题在继续之前独立的代码生成。否则,生成的独立代码可能是不可靠的,未定义的行为。

生成C代码

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

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

    而不是生成一个静态库,您可以选择生成一个墨西哥人函数或其他类型的C / c++构建。不同的项目设置可用于墨西哥人和C / c++构建类型。当你在墨西哥人之间切换和C / c++代码生成、验证您选择的设置。

  3. 点击生成

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

  4. 点击查看报告在报告中查看器查看报告。如果在代码生成代码生成器检测错误或警告,这份报告描述了问题和提供有问题的MATLAB代码的链接。有关更多信息,请参见代码生成报告

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

检查页面完成工作流

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

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

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

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

  • 函数签名:

    空白欧几里得(const双x [3], const双cb[648],双y_min[3],双y_max[3],双idx[2],[2]双距离)

    const双x [3]对应的输入x在你的MATLAB代码。的大小x3对应于总大小(3 x 1)示例的输入,你当你从MATLAB代码生成的代码使用。

    const双cb [648]对应的输入cb在你的MATLAB代码。的大小cb648年对应于总大小(3 x 216)使用的示例中输入您当你从MATLAB代码生成的代码。在这种情况下,生成的代码使用一维数组来表示一个二维数组的MATLAB代码。

    生成的代码有四个额外的输入参数:数组y_min,y_max,idx,距离。这些数组是用来返回的输出值。他们对应的输出参数y_min,y_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年

指定这些输入属性:

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

  2. 单击输入类型规格和编辑。您可以指定变量的大小,指定的限制,通过使用:前缀。例如,:3意味着相应的维度可以大小不同3。更改类型双(:3 * 1)x双(3 x: 216)cb

你现在可以生成代码遵循相同的步骤。生成的C代码的函数签名euclidean.c现在写着:

空白欧几里得(const双x_data [], const int x_size [1], const双cb_data [], const int cb_size[2],双y_min_data [], int y_min_size[1],双y_max_data [], int y_max_size[1],双idx[2],[2]双距离)
的参数x_data,cb_data,y_min_data,y_max_data对应的输入参数xcb和输出参数y_miny_max在最初的MATLAB函数。现在的C函数接受四个额外的输入参数x_size,cb_size,y_min_size,y_max_size指定的大小x_data,cb_data,y_min_data,y_max_data在运行时。

下一个步骤

目标 更多的信息

学习MATLAB代码生成支持内置函数和工具箱函数,类和对金宝app象系统

函数和对象支持C / c++代码生成金宝app

生成c++代码

c++代码生成

生成和修改一个示例C主要功能和使用它来构建一个可执行程序

在一个应用程序中使用一个示例C主要

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

包代码为其他开发环境

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

优化策略

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

调用自定义的C / c++代码生成的代码

了解代码生成报告

代码生成报告

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