主要内容

指定用于代码生成的可变大小参数

此示例演示如何在为分类和回归模型对象的对象函数生成代码时指定可变大小的输入参数。可变大小数据是其大小可能在运行时更改的数据。当您在编译时有大小未知的数据时,指定可变大小的输入参数非常方便。此示例还描述了如何在入口点函数中包含名称-值对参数,以及如何在生成代码时指定这些参数。

有关更详细的代码生成工作流示例,请参见基于命令行的机器学习模型预测代码生成使用MATLAB Coder App生成机器学习模型预测代码.

列车分类模型

加载Fisher的虹膜数据集。将标签转换为字符矩阵。

负载鱼腥草种类=炭(种类);

使用整个数据集训练分类树。

Mdl=fitctree(MEA、物种);

Mdl是一个ClassificationTree模型

使用保存模型saveLearnerForCoder

将经过训练的分类树保存到名为ClassTreeIris.mat在当前文件夹中使用saveLearnerForCoder.

MdlName=“ClassTreeIris”;saveLearnerForCoder(Mdl,MdlName);

定义入口点函数

在当前文件夹中,定义一个名为mypredictTree.m这样做的目的如下:

  • 接受列对应于并接受有效的名称-值对参数。

  • 通过使用加载经过训练的分类树loadLearnerForCoder.

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

您可以通过指定瓦拉金作为输入参数。有关详细信息,请参阅可变长度参数列表的代码生成(MATLAB编码器).

类型mypredictTree.m%显示mypredictTree.m文件的内容
函数[label,score,node,cnum]=mypredictTree(x,savedmdl,varargin)%#codegen%MYPREDICTTREE使用分类树预测虹膜物种%MYPREDICTTREE使用存储在MAT文件%中的分类树(名称为savedmdl)预测%n×4矩阵x中n个观测值的虹膜物种,然后返回%数组标签中的预测。x的每一行包含虹膜的花瓣%和萼片(参见Fisherris数据集)。有关其他输出%参数的说明,请参见预测参考页。CompactMdl=loadLearnerForCoder(savedmdl);[label,score,node,cnum]=predict(CompactMdl,x,varargin{:});end

注:如果单击此页面右上角的按钮并在MATLAB®中打开此示例,则MATLAB®将打开示例文件夹。此文件夹包括入口点函数文件。

生成代码

指定可变大小的参数

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

使用编码器常数(MATLAB编码器)指定编译时常量输入。

coder.Constant (v)

coder.Constant (v)创建一个编码器常数类型变量,其值为常量,与v,在代码生成期间。

使用编码员(MATLAB编码器)指定可变大小的输入。

编码员(example_value, size_vector, variable_dims)

价值观示例\u值,向量的大小可变直径指定生成的代码可以接受的输入数组的属性。

  • 输入数组具有与中的示例值相同的数据类型示例\u值.

  • 向量的大小是输入数组的数组大小,如果可变直径值是错误的.

  • 向量的大小是数组大小的上限,如果可变直径值是真正的.

  • 可变直径指定数组的每个维度是可变大小还是固定大小。价值真正的(逻辑1)表示对应维度的大小可变;价值错误的(逻辑0)表示对应维度具有固定大小。

入口点函数mypredictTree接受预测器数据、包含训练模型对象的MAT文件名以及可选的名称-值对参数。假设您希望生成接受预测数据的可变大小数组的代码,并且“子树”名称-值对参数,其值为一个可变大小的向量。然后有四个输入参数:预测器数据、mat文件名以及“子树”名称-值对参数。

定义一个4 × 1单元格数组,并将入口点函数的每个输入参数类型分配给每个单元格。

ARGS=细胞(4,1);

对于第一个输入,使用编码员指定预测器数据变量是双精度的,列数与模型训练中使用的预测器数据相同,但观察数据(行)的数量是任意的。

p=numel(Mdl.Predictor名称);ARGS{1}=coder.typeof(0[Inf,p],[1,0]);

0示例\u值值表示数据类型为双重的因为双重的是MATLAB的默认数字数据类型。[Inf,p]向量的大小价值与[1,0]可变直径值表示第一个维度的大小是可变的且无限制的,而第二个维度的大小是固定的P.

第二个输入是mat文件名,它必须是一个编译时常量。使用编码器常数指定第二个输入的类型。

ARGS{2}=编码器常数(MdlName);

的名称和值是最后两个输入“子树”名称-值对参数。名称-值对参数的名称必须是编译时常量。

ARGS{3}=编码器常数(“子树”);

使用编码员的值指定“子树”是双精度行向量,且行向量大小的上限为最大值(Mdl.PrunedList).

m=最大值(Mdl.PruneList);ARGS{4}=coder.typeof(0[1,m],[0,1]);

再一次0示例\u值值表示数据类型为双重的因为双重的是MATLAB的默认数字数据类型。[1,m]向量的大小价值与[0,1]可变直径值表示第一个维度的大小固定为1.,并且第二维度的大小是可变的,其上限为M.

使用生成代码编码基因

从入口点函数生成MEX函数mypredictTree使用单元格数组ARGS,其中包括的输入参数类型mypredictTree. 使用-args选项使用-纳古特选项generate代码按照在入口点函数定义中出现的顺序包含指定数量的输出参数。

编码基因mypredictTree-argsARGS-纳古特2.
代码生成成功。

编码基因生成MEX函数mypredictTree\u mex在当前文件夹中具有与平台相关的扩展名。

这个预测函数接受单精度值、双精度值和“全部”“子树”名称-值对参数。但是,在使用MEX函数进行预测时,只能指定双精度值,因为ARGS{4}是双倍的。

验证生成的代码

使用生成的MEX函数和修剪级别1的子树,预测从训练数据中随机选择15个值的标签。将MEX函数中的标签与预测.

rng (“默认”);%的再现性Xnew=datasample(meas,15);[labelMEX,scoreMEX]=mypredictTree_-mex(Xnew,MdlName,“子树”,1); [labelPREDICT,scorePREDICT]=预测(Mdl,Xnew,“子树”,1); labelPREDICT
labelPREDICT=15x10字符阵列“virginica”“virginica”“setosa”“virginica”“versicolor”“setosa”“setosa”“versicolor”“virginica”“virginica”“setosa”“virginica”“virginica”“versicolor”“virginica”
labelMEX
labelMEX =15 x1细胞{'virginica'}{'virginica'}{'setosa'}{'versicolor'}{'setosa'}{'versicolor'}{'virginica'}{'virginica'}{'setosa'}{'virginica'}{'versicolor'}{'virginica'}{'versicolor'}{'virginica'}

除了数据类型之外,预测的标签与MEX函数标签相同。响应数据类型为时烧焦编码基因无法确定子树是标量,则生成代码的输出是字符向量的单元数组。

为了进行比较,您可以将标签预测创建一个单元格数组并使用等质量.

cell_labelPREDICT=cellstr(labelPREDICT);verifyLabel=isequal(labelMEX、cell_labelPREDICT)
验证标签=必然的1.

等质量返回逻辑1 (真正的),这意味着所有输入都相等。

也比较第二个输出。scoreMex可能包括与之相比的四舍五入差异分数预测.在这种情况下,比较scoreMEX分数预测,允许较小的公差。

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

发现如果分数预测scoreMEX不大于规定的公差1e-8. 这一比较证实了这一点分数预测scoreMEX在公差范围内是相等的1 e-8.

另见

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

相关的话题