此示例显示如何在为分类和回归模型对象的对象函数生成代码时指定变量大小输入参数。可变大小的数据是其大小在运行时可能更改的数据。指定可变大小的输入参数在编译时具有未知大小的数据是方便的。此示例还介绍了如何在入口点函数中包含名称值对参数,以及如何在生成代码时指定它们。
有关更详细的代码生成工作流示例,请参阅命令行中计算机学习模型预测的代码生成和使用MATLAB编码器应用程序预测机器学习模型的代码生成。
装载Fisher的Iris数据集。将标签转换为字符矩阵。
加载渔民物种= Char(物种);
使用整个数据集列车分类树。
MDL = FITCTREE(MEAS,物种);
MDL.
是A.ClassificationTree
模型。
Savelarnerforcoder.
将培训的分类树保存到名为的文件classtreeiris.mat.
使用时在您当前的文件夹中Savelarnerforcoder.
。
mdlname ='classtreeiris';SavelAlnerForCoder(MDL,MDLNAME);
在您当前的文件夹中,定义命名的入口点函数mypredictTree.m
这有以下内容:
接受对应的列的测量量
并接受有效的名称值对参数。
使用培训的分类树装载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®打开示例文件夹。此文件夹包含入口点函数文件。
指定变量大小的参数
因为C和C ++是静态类型的语言,所以必须在编译时确定在入口点函数中的所有变量的属性使用- args.
选择Codegen.
。
采用编码器.Constant.
指定编译时间常量输入。
coder.Constant (v)
coder.Constant (v)
创造一个编码器.Constant.
类型变量,其值是恒定的,与其相同V.
,在代码生成期间。
采用Coder.typeof.
指定变量大小的输入。
Coder.typeof.(example_value, size_vector, variable_dims)
价值example_value.
那size_vector.
, 和变量_dims.
指定生成的代码可以接受的输入数组的属性。
输入数组具有与中的示例值相同的数据类型example_value.
。
size_vector.
如果相应的输入阵列的数组大小是输入数组的变量_dims.
值是错误的
。
size_vector.
如果相应的阵列大小的上限是阵列大小的变量_dims.
值是真正的
。
变量_dims.
指定阵列的每个维度是否具有可变大小或固定大小。价值真正的
(逻辑1)表示相应的尺寸具有可变尺寸;价值错误的
(逻辑0)表示相应的维度具有固定大小。
入口点函数mypredicttree
接受预测器数据,包含培训的模型对象的MAT文件名,以及可选的名称值对参数。假设您要生成接受可变大小阵列的代码,用于预测数据和数据“子树”
名称-值对参数,其值为一个可变大小的向量。然后有四个输入参数:预测器数据、mat文件名以及“子树”
名称值对参数。
定义一个4 × 1单元格数组,并将入口点函数的每个输入参数类型分配给每个单元格。
args = cell(4,1);
对于第一个输入,使用Coder.typeof.
要指定预测器数据变量是双精度,具有与培训模型中使用的预测数据相同的列,但观察数(行)是任意的。
p = numel(mdl.predictornames);args {1} = coder.typeof(0,[Inf,P],[1,0]);
0.
为example_value.
值意味着数据类型是双倍的
因为双倍的
是matlab的默认数字数据类型。[inf,p]
为size_vector.
价值和[1,0]
为变量_dims.
值意味着第一维度的大小是可变的,并且无界限度,并且第二维的大小固定为P.
。
第二个输入是mat文件名,它必须是一个编译时常量。采用编码器.Constant.
指定第二个输入的类型。
args {2} = coder.constant(mdlname);
的名称和值是最后两个输入“子树”
名称值对参数。名称值对参数的名称必须是编译时常量。
args {3} = coder.constant(“子树”);
采用Coder.typeof.
的值指定“子树”
是双精度排矢量,行矢量尺寸的上限是max(mdl.prunedlist)
。
m = max(mdl.pruneList);args {4} = coder.typeof(0,[1,m],[0,1]);
再次,0.
为example_value.
值意味着数据类型是双倍的
因为双倍的
是matlab的默认数字数据类型。[1,m]
为size_vector.
价值和[0,1]
为变量_dims.
值意味着第一维度的大小是固定的1
,第二维度的大小是可变的,其上限是m
。
使用代码使用Codegen.
从入口点函数生成MEX功能mypredicttree
使用单元格数组args.
,其中包括输入参数类型mypredicttree
。使用使用的输入参数类型- args.
选项。使用使用的生成的入口点函数中的输出参数的数量-Nargout.
选项。生成代码包括在入口点函数定义中发生的顺序中指定的输出参数数。
Codegen.mypredicttree- args.args.-Nargout.2
Codegen.
生成MEX函数mypredicttree_mex.
使用当前文件夹中的平台依赖扩展名。
这预测
函数接受单精度值,双精度值和'全部'
为'子树'
名称值对参数。但是,当您使用MEX函数以进行预测时,您只能指定双重精度值,因为所以args {4}
是双倍的。
预测使用生成的MEX函数和修剪级别的子树从训练数据中选择15个值的标签1.将标签与预测的那些相比预测
。
rng (“默认”);重复性的%Xnew = DataMple(Meas,15);[labelmex,scoremex] = mypredicttree_mex(xnew,mdlname,“子树”,1);[LabelPredict,Scasspredict] =预测(MDL,Xnew,“子树”,1);LabelPredict.
labelpredict =15x10 char array.'virginica''virginica''setosa'''virminica'''versicolor'''setosa''''versicolor'''versicolor'''virminica''virginica''virginica'''''virginica''''virginica'''versicolor''virginica'''virginica''
LabelMex.
labelMEX =15 x1细胞{'virginica'} {'setosa'} {'versicolor'} {'versicolor'} {'setosa'} {'setosa'} {'versicolor'} {'versicolor'} {'virminica'} {'virginica'} {'virginica'}{'setosa'} {'virginica'} {'virginica'} {'versicolor'} {'virginica'}
除了数据类型之外,预测的标签与MEX函数标签相同。响应数据类型为时char
和Codegen.
无法确定的价值子树
是标量,然后生成的代码的输出是字符向量的小区数组。
对于比较,您可以转换标签预报
到一个单元格阵列和使用是平等的
。
cell_labelpredict = cellstr(labelpredict);verifyLabel = Isequal(LabelMex,Cell_LabelPredict)
verifyLabel =.逻辑1
是平等的
返回逻辑1 (真正的
),这意味着所有输入都是相等的。
比较第二个输出。scoremex.
与...相比,可能包括圆截止差异记分额度
。在这种情况下,比较scoremex.
和记分额度
,允许小容差。
找到(abs (scorePREDICT-scoreMEX) > 1 e-8)
ans = 0x1空双列向量
寻找
如果元素明智的绝对差异,则返回空向量记分额度
和scoremex.
不大于指定的公差1E-8
。比较证实了记分额度
和scoremex.
在宽容范围内相同1 e-8
。
Codegen.
|编码器.Constant.
|Coder.typeof.
|learnerCoderConfigurer
|loadlearnerforcoder.
|Savelarnerforcoder.