主要内容

指定代码生成的变量大小参数

此示例显示如何在为分类和回归模型对象的对象函数生成代码时指定变量大小输入参数。可变大小的数据是其大小在运行时可能更改的数据。指定可变大小的输入参数在编译时具有未知大小的数据是方便的。此示例还介绍了如何在入口点函数中包含名称值对参数,以及如何在生成代码时指定它们。

对于更详细的代码生成工作流示例s, see命令行中计算机学习模型预测的代码生成and使用MATLAB编码器应用程序预测机器学习模型的代码生成

火车分类模型

装载Fisher的Iris数据集。将标签转换为字符矩阵。

加载渔民物种= Char(物种);

使用整个数据集列车分类树。

MDL = FITCTREE(MEAS,物种);

MDL.是A.ClassificationTree模型。

使用Savelarnerforcoder.

将培训的分类树保存到名为的文件classtreeiris.mat.使用时在您当前的文件夹中Savelarnerforcoder.

mdlname ='classtreeiris';SavelAlnerForCoder(MDL,MDLNAME);

定义入口点函数

在您当前的文件夹中,定义命名的入口点函数mypredicttree。m这有以下内容:

  • 接受对应的列的测量meas并接受有效的名称值对参数。

  • 使用培训的分类树装载loadlearnerforcoder.

  • 从加载的分类树预测标签和相应的分数,节点编号和类编号。

您可以通过指定允许可选的名称 - 值对参数varargin.作为输入参数。有关详细信息,请参阅可变长度参数列表的代码生成(MATLAB编码器)

类型mypredicttree。m%显示mypredicttree.m文件的内容
功能[标签,分数,节点,cnum] = mypredicttree(x,savedmdl,varargin)%#codegen%mypredicttree使用分类树预测虹膜物种%mypredicttree预测虹膜物种在%n-by-4矩阵x中的n观察结果中预测虹膜物种存储在Mat文件%中的分类树,其名称为savedmdl,然后返回%数组标签中的预测。每行X包含虹膜的花瓣%和萼片的长度和宽度(参见渔场数据集)。对于其他输出%参数说明,请参阅预测参考页面。compactmdl = loadlearnerforcoder(savedmdl);[标签,分数,节点,CNUM] =预测(CompactMDL,X,Varargin {:});结束

注意:如果单击此页面的右上角的按钮,请在MATLAB®中打开此示例,然后Matlab®打开示例文件夹。此文件夹包含入口点函数文件。

Generate Code

指定变量大小的参数

因为C和C ++是静态类型的语言,所以必须在编译时确定在入口点函数中的所有变量的属性使用- args.选择Codegen.

采用编码器.Constant.(MATLAB编码器)指定编译时间常量输入。

编码器.Constant.(v)

编码器.Constant.(v)创造一个编码器.Constant.类型变量,其值是恒定的,与其相同V.,在代码生成期间。

采用Coder.typeof.(MATLAB编码器)指定变量大小的输入。

Coder.typeof.(example_value, size_vector, variable_dims)

价值example_value.size_vector.,和变量_dims.specify the properties of the input array that the generated code can accept.

  • An input array has the same data type as the example values inexample_value.

  • size_vector.如果相应的输入阵列的数组大小是输入数组的变量_dims.V.alue is

  • size_vector.如果相应的阵列大小的上限是阵列大小的变量_dims.V.alue istrue

  • 变量_dims.指定阵列的每个维度是否具有可变大小或固定大小。价值true(逻辑1)表示相应的尺寸具有可变尺寸;价值(逻辑0)表示相应的维度具有固定大小。

入口点函数mypredicttree接受预测器数据,包含培训的模型对象的MAT文件名,以及可选的名称值对参数。假设您要生成接受可变大小阵列的代码,用于预测数据和数据'Subtrees'name-value pair argument with a variable-size vector for its value. Then you have four input arguments: predictor data, the MAT-file name, and the name and value of the'Subtrees'名称值对参数。

Define a 4-by-1 cell array and assign each input argument type of the entry-point function to each cell.

args = cell(4,1​​);

对于第一个输入,使用Coder.typeof.要指定预测器数据变量是双精度,具有与培训模型中使用的预测数据相同的列,但观察数(行)是任意的。

p = numel(mdl.predictornames);args {1} = coder.typeof(0,[Inf,P],[1,0]);

0.for theexample_value.值意味着数据类型是因为是matlab的默认数字数据类型。[inf,p]for thesize_vector.价值和[1,0]for the变量_dims.值意味着第一维度的大小是可变的,并且无界限度,并且第二维的大小固定为P.

该second input is the MAT-file name, which must be a compile-time constant. Use编码器.Constant.to specify the type of the second input.

args {2} = coder.constant(mdlname);

该last two inputs are the name and value of the'Subtrees'名称值对参数。名称值对参数的名称必须是编译时常量。

args {3} = coder.constant('Subtrees');

采用Coder.typeof.to specify that the value of'Subtrees'是双精度排矢量,行矢量尺寸的上限是max(mdl.prunedlist)

m = max(mdl.pruneList);args {4} = coder.typeof(0,[1,m],[0,1]);

再次,0.for theexample_value.值意味着数据类型是因为是matlab的默认数字数据类型。[1,m]for thesize_vector.价值和[0,1]for the变量_dims.值意味着第一维度的大小是固定的1,第二维度的大小是可变的,其上限是m

Generate Code UsingCodegen.

从入口点函数生成MEX功能mypredicttreeusing the cell arrayargs.,其中包括输入参数类型mypredicttree。使用使用的输入参数类型- args.选项。使用使用的生成的入口点函数中的输出参数的数量-Nargout.选项。生成代码包括在入口点函数定义中发生的顺序中指定的输出参数数。

Codegen.mypredicttree-  args.args.-Nargout.2

Codegen.生成MEX函数mypredicttree_mex.使用当前文件夹中的平台依赖扩展名。

P.redict函数接受单精度值,双精度值和'所有'for the'子树'名称值对参数。但是,当您使用MEX函数以进行预测时,您只能指定双重精度值,因为所以args {4}是双倍的。

验证生成的代码

预测使用生成的MEX函数和修剪级别的子树从训练数据中选择15个值的标签1.将标签与预测的那些相比P.redict

rng('default');重复性的%Xnew = DataMple(Meas,15);[labelmex,scoremex] = mypredicttree_mex(xnew,mdlname,'Subtrees',1);[LabelPredict,Scasspredict] =预测(MDL,Xnew,'Subtrees',1);LabelPredict.
labelpredict =15x10 char array.'virginica''virginica''setosa'''virminica'''versicolor'''setosa''''versicolor'''versicolor'''virminica''virginica''virginica'''''virginica''''virginica'''versicolor''virginica'''virginica''
LabelMex.
LabelMex.=15x1 cell{'virginica'} {'setosa'} {'versicolor'} {'versicolor'} {'setosa'} {'setosa'} {'versicolor'} {'versicolor'} {'virminica'} {'virginica'} {'virginica'}{'setosa'} {'virginica'} {'virginica'} {'versicolor'} {'virginica'}

该P.redicted labels are the same as the MEX function labels except for the data type. When the response data type ischarandCodegen.无法确定的价值子树是标量,然后生成的代码的输出是字符向量的小区数组。

对于比较,您可以转换标签预报到一个单元格阵列和使用是平等的

cell_labelpredict = cellstr(labelpredict);verifyLabel = Isequal(LabelMex,Cell_LabelPredict)
verifyLabel =.逻辑1

是平等的returns logical 1 (true),这意味着所有输入都是相等的。

比较第二个输出。scoremex.与...相比,可能包括圆截止差异记分额度。在这种情况下,比较scoremex.and记分额度,允许小容差。

找(abs(scorePREDICT-scoreMEX) > 1e-8)
ans = 0x1空双列向量

如果元素明智的绝对差异,则返回空向量记分额度andscoremex.不大于指定的公差1E-8。比较证实了记分额度andscoremex.在宽容范围内相同1e–8

也可以看看

|||(MATLAB编码器)|(MATLAB编码器)|(MATLAB编码器)

Related Topics