在本教程中,您将使用MATLAB®编码器™应用程序生成的MATLAB功能的静态C库。您首先生成C代码只能接受有固定预先指定的尺寸输入。然后生成C代码,可以接受许多不同大小的输入。
您也可以通过使用产生在MATLAB命令行代码codegen
命令。有关此工作流程的教程,请在命令行生成C代码。
该MATLAB编码器不支持应用程序万博1manbetxMATLAB在线™。生成C/ c++代码MATLAB在线, 使用codegen
命令。
教程文件从文件夹复制
到本地工作文件夹。在这里,matlabroot
\帮助\工具箱\编码器\例子\欧几里德
例如MATLAB安装文件夹,matlabroot
C:\ Program Files文件\ MATLAB \ R2019a
。要将这些文件复制到当前文件夹,请运行以下MATLAB命令:
的CopyFile(完整文件(matlabroot,“帮助”,“工具箱”,“编码器”,'例子',“欧几里得”))
euclidean_data.mat
,euclidean.m
,test.m
文件。
MATLAB数据文件euclidean_data.mat
包含数据两个部分组成:在三维欧几里德空间中的单个点和三维欧几里得空间的一组其它几个点。进一步来说:
X
是一个3
-通过-1
表示三维欧几里德空间中一点的列向量。
CB
是一个3
-通过-216
阵列。在每一列CB
表示在三维欧几里德空间中的点。
MATLAB的文件euclidean.m
包含的功能欧几里得
实现了核心算法在这个例子中。该函数X
和CB
作为输入。它计算之间的欧几里德距离X
并在每个点CB
并返回这些数量:
列向量Y_MIN
,它等于in的列向量CB
表示这是最接近点X
。
列向量y_max
,它等于in的列向量CB
这代表离它最远的点X
。
二维矢量idx
包含载体的列索引Y_MIN
和y_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));求出距离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_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脚本生成代码。万博1manbetx
使用测试脚本将预处理和后处理步骤与实现核心算法的功能分离开来。这种实践使您能够轻松地重用您的算法。您将为实现核心算法的MATLAB函数生成代码。您不为测试脚本生成代码。
运行测试脚本test.m
在MATLAB。输出显示ÿ
,idx
,距离
。
的最近点的坐标为:0.8 0.8 0.4的最近点的指数是171距离最近点是最远点的0.080374坐标为:0 0 1的最远点的指数是6距离最远的点是1.2923
该代码分析器在MATLAB编辑器,当你进入它不断地检查你的代码。它报告的问题,并建议修改为了最大限度地提高性能和可维护性。
开放euclidean.m
在MATLAB编辑器中。MATLAB编辑器右上角的代码分析器消息指示器是绿色的。分析器没有检测到代码中的错误、警告或改进机会。
函数声明后,加% # codegen
指示:
函数[Y,IDX,距离] =欧几里德(X,CB)% # codegen
% # codegen
指令提示代码分析器识别特定于代码生成的警告和错误。代码分析器消息指示器变为红色,表示它已检测到代码生成问题。
要查看的警告信息,将光标移动到带下划线的代码片段。该警告表明,代码生成需要的变量idx
和距离
到下标之前完全定义。这些警告出现,因为在代码生成器必须在代码中的首次亮相确定这些变量的大小。要解决此问题,使用的
函数可以同时分配和初始化这些数组。
将最小距离初始化为到cb第一个元素的距离将最大距离初始化为到cb第一个元素的距离IDX =酮(1,2);距离=酮(1,2)*范数(X-CB(:,1));
代码分析器消息指示器再次变为绿色,表示它没有检测到任何代码生成问题。
有关使用代码分析器的更多信息,请参见验证码错误和警告(MATLAB)。
保存文件。
现在可以使用。来编译代码了MATLAB编码器应用。在这里,编译指从MATLAB代码生成C/ c++代码。
的MATLAB代码编译指从MATLAB代码C / C ++代码的生成。在其他情况下,术语汇编可以指一个C / C ++编译器的作用。
在MATLAB工具条上应用程序选项卡,在代码生成,单击MATLAB编码器应用程序图标。应用程序打开选择源文件页面。
在选择源文件页,输入或选择入口点函数的名称欧几里得
。一个入口点函数是从中生成代码顶级MATLAB功能。该应用程序创建了默认名称的项目euclidean.prj
在当前文件夹中。
点击下一个去定义输入类型步。该应用程序运行代码分析器(你已经跑在前面的步骤),并在入口点函数的代码生成准备工具。代码生成准备工具筛选对于那些不支持代码生成功能和功能的MATLAB代码。万博1manbetx如果应用程序识别的问题,它会打开检查代码生成准备情况可以查看和修复问题的页面。在本例中,因为应用程序没有检测到问题,所以它打开了定义输入类型页面。欲了解更多信息,请参阅代码生成准备工具。
代码分析器和代码生成准备工具可能无法检测到所有代码生成问题。在消除这两个工具检测到的错误或警告之后,生成代码MATLAB编码器以确定您的MATLAB代码有其他合规问题。
C/ c++代码生成支持的某些MATLAB内置函数和工具箱函数、类和系统对象具有特定的代码生成限制。万博1manbetx中列出了这些限制和相关的使用说明扩展功能其相应的参考页的部分。欲了解更多信息,请参阅C/ c++代码生成支持的函数和对象万博1manbetx。
因为C使用静态类型,代码生成器必须在代码生成时确定MATLAB文件中所有变量的类、大小和复杂度编译时间。因此,你必须指定的所有入口点函数输入的特性。要指定输入特性,您可以:
通过提供一个脚本,使用样例输入调用入口点函数,指示应用程序自动确定输入属性。
直接指定属性。
在本例中,定义输入的属性X
和CB
,指定测试文件test.m
代码生成器可以用来自动定义类型:
输入或选择测试文件test.m
。
点击Autodefine输入类型。
测试文件,test.m
,调用入口点函数,欧几里得
,与预期的输入类型。该应用确定输入X
是双(3 x1)
和输入CB
是双(3 x216)
。
点击下一个去检查运行时的问题步。
该检查运行时的问题步骤生成从入口点函数的一个MEX文件,运行MEX功能,并报告问题。甲MEX函数生成代码,它可以从内部MATLAB被调用。这是执行这一步,因为你可以检测并更难生成的C代码来诊断修复运行时错误的最佳做法。默认情况下,MEX功能包括内存完整性检查。这些检查执行数组边界和尺寸检查。支票检测为MATLAB函数生成码违例的存储器的完整性。欲了解更多信息,请参阅控制运行时检查。
转换MATLAB代码到高效的C / C ++源代码,代码生成介绍优化的是,在某些情况下,造成所生成的代码来表现比原来的源代码不同。看到生成的代码和MATLAB代码之间的差异。
要打开检查运行时的问题对话框中,单击检查问题箭头。
在检查运行时的问题对话框,指定测试文件或输入调用与例如输入的入口点函数的代码。在这个例子中,使用测试文件测试
您用来定义输入类型。
点击检查问题。
该应用程序生成一个MEX函数。它运行测试脚本测试
更换要求欧几里得
调用生成的MEX。如果应用程序在生成或执行MEX函数期间检测到问题,它将提供警告和错误消息。单击这些消息以导航到有问题的代码并修复问题。在本例中,应用程序没有检测到问题。
默认情况下,应用程序收集行执行计数。这些计数帮助你看到测试文件如何test.m
行使欧几里得
功能。要查看行执行次数,点击查看MATLAB行执行计数。应用程序编辑器在代码的左侧显示一个彩色代码条。要在代码上扩展颜色高亮显示并查看行执行计数,请将光标放在栏上。
特定的绿色阴影表示此代码的行执行计数落在某个范围内。在这种情况下,对于
循环执行215次。有关如何解释行执行计数和关闭计数集合的信息,请参阅收集和查看生产线执行计数为您的MATLAB代码。
点击下一个去生成代码步。
要打开生成对话框中,单击生成箭头。
在生成对话框中,设置构建类型来静态库(.LIB)
和语言C.为其他项目构建配置设置使用默认值。
您可以选择生成一个MEX函数或其他C/ c++构建类型,而不是生成一个C静态库。可以为MEX和C/ c++构建类型提供不同的项目设置。当您在MEX和C/ c++代码生成之间切换时,请验证您所选择的设置。
点击生成。
MATLAB编码器生成一个独立的C静态库欧几里得
在里面
。工作
\代码生成\ LIB \欧几里德
是包含教程文件的文件夹。该MATLAB编码器app表示代码生成成功。它在页面的左侧显示源MATLAB文件和生成的输出文件。在变量选项卡,它显示了有关MATLAB源变量的信息。在目标生成日志选项卡,它显示生成日志,包括C/ c++编译器警告和错误。默认情况下,在代码窗口中,应用程序显示C源代码文件,工作
euclidean.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代码。的大小X
是3
,这对应于示例性输入的总大小(3×1)您在从MATLAB代码生成的代码使用。
常量双CB [648]
对应于输入CB
在您的MATLAB代码。的大小CB
是648
,这对应于示例性输入的总大小(3×216),其当您从MATLAB代码生成的代码使用。在这种情况下,所产生的代码使用的一维数组来表示在MATLAB代码的二维数组。
生成的代码具有四个附加的输入参数:阵列Y_MIN
,y_max
,idx
,距离
。这些阵列用于返回的输出值。它们对应于输出参数Y_MIN
,y_max
,idx
,距离
在原始的MATLAB代码中。
代码生成器保存函数名和注释。如果可能,代码生成器将保留您的变量名。
如果MATLAB代码中的变量被设置为常数值,它在生成的C代码中就不会显示为变量。相反,生成的C代码包含变量的实际值。
随着嵌入式编码器®,您可以交互MATLAB代码和生成的C / C ++代码之间跟踪。看到交互式跟踪之间的MATLAB代码和生成的C/ c++代码(嵌入式编码)。
您为生成的C函数euclidean.m
只能接受与代码生成期间指定的示例输入具有相同大小的输入。但是,相应的MATLAB函数的输入数组可以是任何大小。在本教程的这一部分中,您将生成C代码euclidean.m
它接受可变大小的输入。
假设你想要的是X
和CB
在生成的C代码到具有这些特性:
都是第一个维度X
和CB
可以在尺寸高达变化3
。
第二维X
是固定的,有值吗1
。
第二维CB
可以在尺寸高达变化216
。
要指定这些输入属性:
在定义输入类型步骤,输入测试文件test.m
并点击Autodefine输入类型像以前一样。测试文件调用入口点函数,euclidean.m
,与预期的输入类型。该应用确定输入X
是双(3 x1)
和输入CB
是双(3 x216)
。这些类型指定固定大小的输入。
单击输入类型规范并编辑它们。可以使用:
前缀。例如,:3
意味着对应的尺寸的尺寸可以变化高达3
。更改类型双(:3×1)
对于X
和双(:3×:216)
对于CB
。
现在,您可以按照前面相同的步骤生成代码。对于所生成的C代码中的函数签名euclidean.c
现在写着:
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
x_data
,cb_data
,y_min_data
,y_max_data
对应于输入的参数X
和CB
以及输出参数Y_MIN
和y_max
在原来的MATLAB函数中。C函数现在接受四个额外的输入参数x_size
,cb_size
,y_min_size
,y_max_size
指定的大小x_data
,cb_data
,y_min_data
,y_max_data
在运行时。
目标 | 更多信息 |
---|---|
了解MATLAB内置函数和工具箱函数、类和系统对象的代码万博1manbetx生成支持 |
|
生成和修改的实施例C的主要功能,并用它来生成C可执行程序 |
|
打包生成的文件转换成一个压缩文件 |
|
优化生成代码的执行速度或内存使用 |
|
将定制的C/ c++代码集成到生成的代码中 |
|
了解代码生成报告 |
交互式跟踪之间的MATLAB代码和生成的C/ c++代码(嵌入式编码) |