在本教程中,您将使用马铃薯®编码器™Codegen.
命令为MATLAB函数生成静态C库。您首先生成C代码,该代码只能接受已修复的缩减大小的输入。然后,您可以生成C代码,可以接受许多不同大小的输入。
您也可以使用使用的代码Matlab编码器有关这个工作流程的教程,请参阅使用MATLAB Coder App生成C代码.
从文件夹中复制教程文件
到一个本地工作文件夹。这里,matlabroot
帮助\ \工具箱\编码器\ \欧几里得例子
是matlab安装文件夹,例如,matlabroot
C:\Program Files\MATLAB\R2019a
.要将这些文件复制到当前文件夹,运行MATLAB命令:
拷贝文件(fullfile (matlabroot,“帮助”,“工具箱”,“编码器”,'例子',“欧几里得”))
euclidean_data.mat
,euclidean.m
,test.m
,build_lib_fixed.m
,build_lib_varifeiem.m.
文件。
MATLAB数据文件euclidean_data.mat
包含两条数据:三维欧几里德空间的单点和三维欧几里德空间中的一组其他几个点。进一步来说:
x
是A.3.
-经过-1
表示三维欧几里得空间中的一点的列向量。
cb
是A.3.
-经过-216
数组中。每一列中cb
代表三维欧几里德空间中的一个点。
matlab文件euclidean.m
包含功能欧几里德
实现核心算法在这个例子中。的函数x
和cb
作为输入。它计算的是欧氏距离x
和每个点cb
并返回这些数量:
列向量y_min
,它等于列中的列cb
这表示最接近的点x
.
列向量y_max.
,它等于列中的列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));求在cb中距离x最小的向量%找到cb中的向量,最大距离到x为index = 2:大小(cb,2)d = norm(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_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))));
构建脚本build_lib_fixed.m
和build_lib_varifeiem.m.
包含从MATLAB代码生成静态C库的命令,分别接受固定大小和可变大小的输入。在稍后生成C代码时,将显示这些脚本的内容。
提示
您可以通过使用从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代码以获取不支持代码生成的功能和功能。金宝app
某些MATLAB内置功能和工具箱功能,类和支持C / C ++代码生成的系统对象具有特定的代码生成限制。金宝app这些限制和相关的使用说明列于扩展能力它们相应的参考页面的部分。有关更多信息,请参阅C/ c++代码生成支持的函数和对象金宝app.
打开euclidean.m
在MATLAB编辑器中。MATLAB Editor右上角的Code Analyzer消息指示器是绿色的。分析器没有检测到代码中的错误、警告或改进机会。
在函数声明之后,添加%#codegen.
指令:
函数[y,Idx,距离] = euclidean(x,cb)%#codegen.
%#codegen.
指令提示代码分析器识别特定于代码生成的警告和错误。Code Analyzer消息指示器变为红色,表明它已检测到代码生成问题。
要查看警告消息,请将光标移动到带下划线的代码片段。警告表明代码生成需要变量idx.
和距离
在下标之前完全定义。出现这些警告是因为代码生成器必须在这些变量第一次出现在代码中时确定它们的大小。要修复此问题,请使用那些
函数同时分配和初始化这些数组。
%初始化最小距离为cb的第一个元素的距离%初始化最大距离与CB的第一个元素的距离Idx =那些(1,2);距离=α(1,2)*常规(X-CB(:,1));
代码分析器消息指示器再次变为绿色,表示它不会检测到任何更多的代码生成问题。
有关使用代码分析仪的更多信息,请参阅检查错误和警告代码.
保存文件。
要运行代码生成准备工具,请调用编码器.Screener.
函数从MATLAB命令行。
编码器.CEENER(“欧几里得”)
该工具不检测任何代码生成问题欧几里德
.有关更多信息,请参阅代码生成准备工具.
中不支持代码生成准备工具金宝appMatlab Online™.
请注意
代码分析器和代码生成准备工具可能无法检测到所有代码生成问题。消除了这些工具检测的错误或警告后,通过使用生成代码Matlab编码器以确定您的MATLAB代码是否有其他遵从性问题。
现在可以使用Matlab编码器应用。在这里,编译指的是从MATLAB代码生成C/ c++代码。
请注意
MATLAB代码的编译是指从MATLAB代码中生成C/ c++代码。在其他情况下,术语编译可以指C/ c++编译器的操作。
由于C使用静态类型,代码生成器必须在代码生成时确定MATLAB文件中所有变量的类、大小和复杂性,也称为编译时.因此,在为文件生成代码时,必须指定入口点函数的所有输入参数的属性。一个入口点函数是用于生成代码的顶级MATLAB函数。
方法生成代码时Codegen.
命令,可以使用arg游戏
选项指定对入口点函数的示例输入参数。代码生成器使用此信息来确定输入参数的属性。
在下一步中,您将使用Codegen.
命令从入口点函数生成MEX文件欧几里德
.
您从入学点函数生成MEX功能。MEX函数是生成的代码,可以从MATLAB中调用。您运行MEX函数并检查生成的MEX功能和原始MATLAB功能是否具有相同的功能。
这是一个最佳做法,因为您可以检测和修复更难诊断的C代码中更难的运行时错误。默认情况下,MEX功能包括内存完整性检查。这些检查执行阵列界限和维度检查。检查在为MATLAB函数生成的代码中检测违反内存完整性。有关更多信息,请参阅控制运行时间检查.
为了将MATLAB代码转换为高效的C/ c++源代码,代码生成器引入了优化,在某些情况下,会导致生成的代码的行为与原始源代码不同。看到生成代码与MATLAB代码的区别.
生成一个MEX文件euclidean.m
通过使用Codegen.
命令。要验证MEX函数,运行测试脚本测试
呼叫MATLAB功能欧几里德
替换为对生成的MEX函数的调用。
Codegen.euclidean.marg游戏{x, cb}以及测试
默认情况下,Codegen.
生成一个名为mex函数euclidean_mex.
在当前文件夹中。
你用了arg游戏
选择指定样本输入参数的入口点功能欧几里德
.代码生成器使用此信息来确定输入参数的属性。
你用了以及
运行测试文件的选项test.m
.此选项替换呼叫欧几里德
在测试文件中呼叫euclidean_mex.
.
的输出是:
运行测试文件:'test'和MEX函数'euclidean_mex'。最近点坐标为:0.8 0.8 0.4最近点指数为171到最近点的距离为0.080374最远点坐标为:0 0 1最远点指数为6到最远点的距离为1.2923
欧几里德
.请注意
在从MATLAB代码生成独立C / C ++代码之前,会生成MEX函数。运行生成的MEX函数,并确保它具有与MATLAB函数相同的运行时行为。如果生成的MEX函数会产生与MATLAB不同的答案,或产生错误,则必须在继续进行独立代码生成之前修复这些问题。否则,您生成的独立代码可能是不可靠的并且具有未定义的行为。
构建脚本build_lib_fixed.m
包含用于生成代码的命令euclidean.m
.
%加载测试数据负载euclidean_data.mat%为euclideanm的代码与codegen生成代码。使用测试数据为示例输入。Codegen.-报告-config:libeuclidean.marg游戏{x, cb}
Codegen.
读取文件euclidean.m
并将MATLAB代码转换为C代码。
的-报告
选项指示Codegen.
生成代码生成报告,您可以使用该报告调试代码生成问题,并验证您的MATLAB代码是否适合代码生成。
的-config:lib
选项指示Codegen.
来生成静态C库,而不是生成默认的MEX函数。
的arg游戏
选项指示Codegen.
生成以下代码euclidean.m
使用示例输入参数的类,大小和复杂性x
和cb
.
而不是生成C静态库,您可以选择通过使用合适的选项生成MEX函数或其他C / C ++构建类型Codegen.
命令。有关各种代码生成选项的更多信息,请参见Codegen.
.
运行构建脚本。
MATLAB处理构建文件并输出消息:
代码成功:查看报告。
欧几里德
在工作
\ codegen \ lib \ euclidean
.这里,工作
是包含教程文件的文件夹。要在报表查看器中查看代码生成报告,请单击查看报告.
如果代码生成器在代码生成期间检测到错误或警告,则报告将描述问题并提供问题MATLAB代码的链接。看到代码生成报告.
提示
使用构建脚本在命令行生成代码。构建脚本自动执行在命令行中重复执行的一系列MATLAB命令,从而节省您的时间并消除输入错误。
要将生成的C代码与原始的MATLAB代码进行比较,请打开C文件,euclidean.c
,而且euclidean.m
MATLAB编辑器中的文件。
生成的C代码的重要信息:
函数签名是:
void euclidean(const double x [3],const double cb [648],双y_min [3],双y_max [3],double Idx [2],双距离[2])
const double 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函数euclidean.m
只能接受与代码生成期间指定的示例输入大小相同的输入。然而,对应MATLAB函数的输入数组可以是任意大小的。在本教程的这一部分中,您将从下面生成C代码euclidean.m
接受可变大小的输入。
假设你想要x
和cb
在生成的C代码中有这些属性:
两者的第一个维度x
和cb
可以尺寸变化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.-报告-config:libeuclidean.marg游戏{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_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内置函数和工具箱函数、类和System金宝app对象的代码生成支持 |
|
生成C ++代码 |
|
交互式地创建和编辑输入类型 |
使用编码器类型编辑器创建和编辑输入类型 |
生成和修改一个示例C主函数,并使用它来构建一个C可执行程序 |
|
将生成的文件打包成压缩文件 |
|
优化生成代码的执行速度或内存使用 |
|
将自定义C / C ++代码集成到生成的代码中 |
|
了解代码生成报告 |
MATLAB代码与生成C / C ++代码之间的交互跟踪(嵌入式编码器) |