指定代码生成可变尺寸参数

这个例子展示了如何当用于分类和回归模型的对象的对象函数生成代码指定可变大小的输入参数。可变大小的数据是,其大小可以在运行时更改。指定大小可变的输入参数是方便当你有在编译时未知大小的数据。该实施例还描述了如何在包括一个入口点函数和如何生成代码时,以指定它们的名称 - 值对的参数。

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

列车分类模型

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

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

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

MDL = fitctree(MEAS,物种);

Mdl公司是一个分类树模型。

使用保存模型saveLearnerForCoder

在训练的分类树保存到指定的文件ClassTreeIris.mat类通过使用当前文件夹saveLearnerForCoder

MDL名称='ClassTreeIris';saveLearnerForCoder(MDL,MdlName);

定义入口点函数

在当前文件夹,定义一个名为入口点函数我的预测树.m这样做如下:

  • 接受列对应于蜂蜜酒和接受有效的名称 - 值对的参数。

  • 通过加载训练的分类树loadLearnerForCoder

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

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

类型我的预测树.m%显示mypredictTree.m文件的内容
函数[标签,得分,节点,CNUM] = mypredictTree(X,savedmdl,varargin)%#代码生成%MYPREDICTTREE预测使用分类树%MYPREDICTTREE虹膜物种预测虹膜物种在%的n个观察n乘4矩阵X使用存储在MAT文件%名称的分类树是savedmdl,然后返回在%阵列标签的预测。x的每行都包含长度和花瓣%和虹膜的萼片(参见fisheriris数据集)的宽度。对于其他的输出参数%说明,请参阅预测参考页。CompactMdl = loadLearnerForCoder(savedmdl);[标号,得分,节点,CNUM] =预测(CompactMdl中,x,{varargin:});结束

注意:如果您单击位于此页面的右上部分的按钮,打开在MATLAB®这个例子中,然后打开MATLAB®的示例文件夹中。此文件夹包含入口点函数文件。

生成代码

指定大小可变的参数

由于C和C ++是静态类型语言中,必须使用在编译时确定在入口点函数的所有变量的性质-args的选择代码生成

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

编码器常数(五)

编码器常数(五)创建编码器常数值为常量的类型变量,与v,在代码生成期间。

使用编码器类型指定一个可变大小的输入。

编码器类型(例如值、大小矢量、变量尺寸)

示例值size_vector,和可变尺寸指定生成的代码可以接受的输入数组的属性。

  • 输入数组的数据类型与中的示例值相同示例值

  • size_vector是输入数组的数组大小,如果可变尺寸价值是

  • size_vector是数组大小的上限,如果可变尺寸价值是真的

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

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

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

ARGS=细胞(4,1);

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

P = numel(Mdl.PredictorNames);ARGS {1} = coder.typeof(0,[天道酬勤,P],[1,0]);

0对于示例值值表示数据类型为双重的因为双重的是MATLAB的默认数值数据类型。[中导,p]对于size_vector价值和[1,0]对于可变尺寸值意味着该第一尺寸的大小是可变的和无界的,和第二维的尺寸被固定为p

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

ARGS {2} = coder.Constant(MdlName);

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

ARGS {3} = coder.Constant('子树');

使用编码器类型指定'子树'是一个双精度行向量和上界的行向量的大小是最大值(删除列表)

M = MAX(Mdl.PruneList);ARGS {4} = coder.typeof(0,[1,M],[0,1]);

再次,0对于示例值值表示数据类型为双重的因为双重的是MATLAB的默认数值数据类型。[1米]对于size_vector价值和[0,1]对于可变尺寸值意味着该第一尺寸的大小被固定为1,第二个维度的大小是可变的,其上限是

使用生成代码代码生成

从入口点函数生成MEX函数mypredictTree使用单元格数组参数,它包括输入参数类型mypredictTree。指定使用的输入参数类型-args选项。使用指定在生成的入口点函数的输出参数的个数-鼻涕虫选项。的生成代码包括的输出参数在它们发生在入口点函数定义的顺序指定的数量。

代码生成mypredictTree-args参数-鼻涕虫2

代码生成生成MEX函数我的预测树在当前文件夹中使用依赖于平台的扩展名。

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

验证生成的代码

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

rng公司('默认');%再现性Xnew = datasample(MEAS,15);[labelMEX,scoreMEX] = mypredictTree_mex(Xnew,MdlName,'子树',1);[labelPREDICT,scorePREDICT] =预测(MDL,Xnew,'子树',1);标签预测
labelPREDICT =15×10字符数组“维吉尼亚”“维吉尼亚”“塞托萨”“维吉尼亚”“花色”“塞托萨”“塞托萨”“花色”“维吉尼亚”“维吉尼亚”“塞托萨”“维吉尼亚”“维吉尼亚”“花色”“维吉尼亚”
拉伯梅克斯
拉伯梅克斯=15x1单元{virginica'}{virginica'}{setosa'}{virginica'}{versicolor'}{setosa'}{setosa'}{versicolor'}{virginica'}{virginica'}{setosa'}{virginica'}{virginica'}{versicolor'}{virginica'}

除数据类型外,预测的标签与MEX函数标签相同。当响应数据类型为烧焦代码生成无法确定子树是一个标量,然后从生成的代码的输出字符向量的单元阵列。

为了进行比较,您可以转换标签预测到单元格数组并使用是平等的

cell_labelPREDICT = cellstr(labelPREDICT);verifyLabel = ISEQUAL(labelMEX,cell_labelPREDICT)
验证标签=合乎逻辑1

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

同时比较第二个输出。记分可能包括与记分预测。在这种情况下,比较记分记分预测,允许小的公差。

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

找到如果元素之间的绝对差记分预测记分不低于规定的公差较大1e-8级. 对比证实记分预测记分在公差范围内相等1e-8级

也可以看看

|||||

相关主题