在本教程中,您将使用MATLAB®编码器™应用程序生成一个MATLAB函数的静态C库。首先生成C代码,它只能接受具有固定预先分配大小的输入。然后生成可以接受许多不同大小输入的C代码。
控件也可以在MATLAB命令行中生成代码codegen
命令。有关此工作流的教程,请参见在命令行生成C代码.
的MATLAB编码器应用程序不受支持金宝appMATLAB在线™.生成C/ c++代码MATLAB在线,可以使用codegen
命令。
从文件夹中复制教程文件
到本地工作文件夹。在这里,matlabroot
帮助\ \工具箱\编码器\ \欧几里得例子
是MATLAB安装文件夹,例如,matlabroot
C:\Program Files\MATLAB\R2019a
.要将这些文件复制到当前文件夹,请运行此matlab命令:
拷贝文件(fullfile (matlabroot,'帮助','工具箱','编码器','例子','euclidean')))
euclidean_data.mat
,欧几里德
, 和test.m.
文件。
MATLAB数据文件euclidean_data.mat
包含两条数据:三维欧几里德空间的单点和三维欧几里德空间中的一组其他几个点。进一步来说:
x
是一个3.
-经过-1
代表三维欧几里德空间中的点的柱矢量。
cb
是一个3.
-经过-216.
数组中。每一列中cb
代表三维欧几里德空间中的一个点。
matlab文件欧几里德
包含的功能欧几里得
实现核心算法在这个例子中。的函数x
和cb
作为输入。它计算的是欧氏距离x
和每个点cb
然后返回这些量:
栏矢量y_min
,它等于列cb
这表示最接近的点x
.
栏矢量y_max
,它等于列cb
这代表了最远的点x
.
二维矢量idx
包含向量的列索引y_min
和y_max
在cb
.
二维矢量距离
包含计算出的最小和最大距离x
.
功能[y_min,y_max,idx,距离] = euclidean(x,cb)%初始化最小距离与与CB的第一元素的距离%初始化最大距离为cb的第一个元素的距离IDX(1)= 1;IDX(2)= 1;距离(1)=常规(X-CB(:,1));距离(2)=常规(X-CB(:,1));%找到Cb中的向量,最小距离到x求在cb中距离x最大的向量为index = 2:大小(cb,2)d = norm(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,距离] = euclidean(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函数生成代码。您不为测试脚本生成代码。
运行测试脚本test.m.
在matlab。输出显示y
,idx
, 和距离
.
最近点的坐标是:0.8 0.8 0.4的最接近点的索引为171距离最接近的点为0.080374坐标是:0 0 1最远点指数为6距离到最远点为1.2923
当你输入代码时,MATLAB编辑器中的代码分析器会不断地检查你的代码。它报告问题并建议修改,以最大限度地提高性能和可维护性。
开放欧几里德
在Matlab编辑器中。MATLAB编辑器右上角的代码分析仪消息指示器为绿色。分析仪没有检测到代码的改进错误,警告或机会。
在函数声明之后,添加% # codegen
指令:
功能[y,Idx,距离] = euclidean(x,cb)% # codegen
% # codegen
指令提示代码分析仪识别特定于代码生成的警告和错误。代码分析仪消息指示灯变为红色,表示它已检测到代码生成问题。
要查看警告消息,请将光标移动到带下划线的代码片段。警告表明代码生成需要变量idx
和距离
在下标之前完全定义。出现这些警告是因为代码生成器必须在这些变量第一次出现在代码中时确定它们的大小。要修复此问题,请使用的
函数同时分配和初始化这些数组。
%初始化最小距离与与CB的第一元素的距离%初始化最大距离为cb的第一个元素的距离Idx =那些(1,2);距离=α(1,2)*常规(X-CB(:,1));
Code Analyzer消息指示器再次变为绿色,表明它不再检测到任何代码生成问题。
有关使用代码分析器的更多信息,请参见检查错误和警告代码(matlab)。
保存文件。
现在可以使用MATLAB编码器应用。在这里,编译指来自MATLAB代码的C / C ++代码的生成。
MATLAB代码的编译是指从MATLAB代码中生成C/ c++代码。在其他情况下,术语编译可以指C/ c++编译器的操作。
基于MATLAB的工具条应用程序选项卡,在代码生成, 点击MATLAB编码器应用程序图标。应用程序打开选择源文件页。
在里面选择源文件页,输入或选择入口点函数的名称欧几里得
.一个入口点函数是用于生成代码的顶级MATLAB函数。应用程序创建一个默认名称的项目euclidean.prj
在当前文件夹中。
点击下一个去定义输入类型的一步。该应用程序运行代码分析仪(您在上一步中已经运行),并且在入口点函数上的代码生成准备工具。代码生成准备工具屏幕筛选MATLAB代码以获取不支持代码生成的功能和功能。金宝app如果应用程序识别问题,则会打开审核代码生成准备页面您可以在哪里审核和修复问题。在这个例子中,因为应用程序没有检测到问题,所以它打开定义输入类型页。有关更多信息,请参见代码生成准备工具.
代码分析器和代码生成准备工具可能无法检测到所有代码生成问题。消除了这两种工具检测的错误或警告后,生成代码MATLAB编码器以确定您的MATLAB代码是否有其他遵从性问题。
C/ c++代码生成支持的某些MATLAB内置函数和工具箱函数、类和System对象具有特定的代码生成限制。金宝app这些限制和相关的使用说明列在扩展功能它们相应的参考页面的部分。有关更多信息,请参见C / C ++代码生成支持的函数和对象金宝app.
由于C使用静态类型,代码生成器必须在代码生成时确定MATLAB文件中所有变量的类、大小和复杂性,也称为编译时.因此,您必须指定所有入学点函数输入的属性。要指定输入属性,可以:
指示应用程序通过提供使用示例输入调用入口点函数的脚本自动确定输入属性。
直接指定属性。
在此示例中,要定义输入的属性x
和cb
,指定测试文件test.m.
代码生成器可以使用它自动定义类型:
输入或选择测试文件test.m.
.
点击自动杂记输入类型.
测试文件,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行执行计数.应用程序编辑器将在代码左侧显示颜色编码栏。要扩展代码上突出显示的颜色,请参阅行执行计数,将光标放在栏上。
特定的绿色阴影表示此代码的行执行计数落在一定范围内。在这种情况下,为
-loop执行215次。有关如何解释行执行计数并关闭计数的信息的信息,请参阅收集和查看行执行计数的MATLAB代码.
点击下一个去生成代码的一步。
打开生成对话框,单击生成箭.
在里面生成对话框,设置构建类型来静态库(.lib)
和语言其他项目构建配置设置使用默认值。
您可以选择生成MEX函数或其他C/ c++构建类型,而不是生成C静态库。对于MEX和C/ c++构建类型,可以使用不同的项目设置。当您在MEX和C/ c++代码生成之间切换时,请验证您所选择的设置。
点击生成.
MATLAB编码器生成独立的C静态库欧几里得
在里面
.工作
\ codegen \ lib \ euclidean
是包含教程文件的文件夹。的MATLAB编码器App表示代码生成成功。它在页面的左侧显示MATLAB源文件和生成的输出文件。在变量选项卡时,显示有关MATLAB源变量的信息。在目标构建日志标签,它显示构建日志,包括C / C ++编译器警告和错误。默认情况下,在代码窗口中,该应用程序显示C源代码文件,工作
euclidean.c.
.中查看不同的文件源代码或输出文件窗格,单击文件名。
点击查看报告在“报表查看器”中查看报表。如果代码生成器在代码生成期间检测到错误或警告,则报告将描述问题并提供问题MATLAB代码的链接。有关更多信息,请参见代码生成报告.
点击下一个打开完成工作流程页。
的完成工作流程页面表示代码生成成功。它提供了一个项目摘要和要生成的输出的链接。
要将生成的C代码与原始的MATLAB代码进行比较,请打开C文件,euclidean.c.
,欧几里德
文件在MATLAB编辑器中。
有关生成的C代码的重要信息:
函数签名为:
void euclidean(const double x [3],const double cb [648],双y_min [3],双y_max [3],double Idx [2],双距离[2])
const双x [3]
对应于输入x
在您的MATLAB代码中。的大小x
是3.
,它对应于您从MATLAB代码生成代码时使用的示例输入的总大小(3 x 1)。
const双cb [648]
对应于输入cb
在您的MATLAB代码中。的大小cb
是648.
,它对应于您在从MATLAB代码生成代码时使用的示例输入的总大小(3 x 216)。在这种情况下,生成的代码使用一维阵列来表示MATLAB代码中的二维数组。
生成的代码有四个附加输入参数:数组y_min
,y_max
,idx
, 和距离
.这些数组用于返回输出值。它们对应于输出参数y_min
,y_max
,idx
, 和距离
在原始的matlab代码中。
代码生成器保留您的函数名称和注释。当可能时,代码生成器保留您的变量名称。
如果您的MATLAB代码中的变量被设置为常量值,那么在生成的C代码中它不会以变量的形式出现。相反,生成的C代码包含变量的实际值。
嵌入式编码器®,可以交互式地跟踪MATLAB代码与生成的C/ c++代码之间的关系。看到交互式跟踪MATLAB代码和生成的C/ c++代码(嵌入式编码器)。
生成的C函数欧几里德
只能接受与代码生成期间指定的示例输入大小相同的输入。然而,对应MATLAB函数的输入数组可以是任意大小的。在本教程的这一部分中,您将从下面生成C代码欧几里德
它接受可变大小的输入。
假设你想要x
和cb
在生成的C代码中有这些属性:
两者的第一维度x
和cb
可以尺寸变化3.
.
第二个维度x
是固定的并且有值1
.
第二个维度cb
可以尺寸变化216.
.
要指定这些输入属性:
在里面定义输入类型步骤,输入测试文件test.m.
并点击自动杂记输入类型像以前一样。测试文件调用入口点函数,欧几里德
,预期的输入类型。该应用程序确定输入x
是双(3 x1)
和输入cb
是双(3 x216)
.这些类型指定了固定大小的输入。
单击输入类型规范并编辑它们。属性可以指定变量大小,最大可达指定的限制:
字首。例如,:3
意味着相应的尺寸可以尺寸变化3.
.更改类型双(:3 x 1)
为x
和双(:3 x:216)
为cb
.
您现在可以按照与以前遵循相同的步骤生成代码。生成的C代码的函数签名euclidean.c.
现在读:
void euclidean(const double x_data [],const int x_size [1],const int cb_size [2],double y_min_data [],int y_min_size [1],double y_max_data [],int y_max_size [1],双重idx [2],双距离[2])
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内置功能和工具箱功能,类和系统对象的金宝app代码生成支持 |
|
生成和修改一个示例C主函数,并使用它来构建一个C可执行程序 |
|
将生成的文件打包成压缩文件 |
|
优化生成代码的执行速度或内存使用情况 |
|
将您的定制C/ c++代码集成到生成的代码中 |
|
了解代码生成报告 |
交互式跟踪MATLAB代码和生成的C/ c++代码(嵌入式编码) |