这个例子展示了如何使用MATLAB®Coder™应用程序生成C/ c++代码,用于分类和回归模型对象的预测Codegen.
(MATLAB编码器).看命令行中计算机学习模型预测的代码生成有关详细信息。
某些分类和回归模型对象具有一个预测
或者随机的
支持代码生成的函数。万博1manbetx使用这些对象函数进行预测需要经过训练的分类或回归模型对象,但用于代码生成的入口点函数不能将这些对象作为输入变量。通过使用来解决这个限制saveLearnerForCoder
和loadlearnerforcoder.
如本例所述。
此流程图显示了分类和回归模型对象的对象函数的代码生成工作流。
在此示例中,您可以使用分类集合模型K.- 使用邻居弱的学习者并通过使用保存培训的模型saveLearnerForCoder
.然后,定义通过使用加载保存的模型的入口点函数loadlearnerforcoder.
并调用对象函数。编写一个脚本来测试入口点函数。最后,使用MATLAB Coder app生成代码并验证生成的代码。
加载电离层
数据集。此数据集具有34个预测器和351个雷达返回的二进制响应,无论是坏的吗('B'
)或良好('G'
)。
加载电离层
培训分类集合模型K.- 使用随机子空间方法,最邻居弱的学习者。有关使用随机子空间集合的分类的详细信息,请参阅随机子空间分类.
rng (“默认”)%的再现性学习者= templateknn('numneighbors',2);mdl = fitcensemble(x,y,'方法'那“子”那“NPredToSample”5,......'学习者',学习者,'numlearnicalnycle'13);
saveLearnerForCoder
将经过训练的集成模型保存到一个名为knnensemble.mat.
在您当前的文件夹中。
saveLearnerForCoder (Mdl'knnensemble')
saveLearnerForCoder
制定完整分类模型MDL.
紧凑,然后将其保存到Matlab二进制文件中knnensemble.mat.
作为当前文件夹中的结构阵列。
一个入口点功能,也称为顶层或者主函数,是您为代码生成而定义的函数。您必须定义一个入口点函数,该函数调用支持代码生成的函数,并从入口点函数生成C/ c++代码。入口点函数中的所有函数都必须支持代码生成。万博1manbetx
在当前文件夹中的新文件中,定义名为myknnensemblepredict.
这有以下内容:
接受输入数据(X
),保存模型的文件名(文件名
的有效名称-值对参数预测
功能 (varargin.
)。
使用。加载经过训练的集成模型loadlearnerforcoder.
.
从加载模型预测标签和相应的分数。
您可以通过指定来允许可选的名称-值参数varargin.作为输入参数。有关详细信息,请参阅可变长度参数列表的代码生成(MATLAB编码器).
类型myknnEnsemblePredict.m%显示myknensemblepredict.m文件的内容。
function [label,score] = myknnEnsemblePredict(X,fileName,varargin) %#codegen CompactMdl = loadLearnerForCoder(fileName);(标签,分数)=预测(CompactMdl X,变长度输入宗量{:});结束
添加%#codegen.
编译器指令(或Pragma)到函数签名后的入门点函数,表示您打算为Matlab算法生成代码。添加此指令指示MATLAB代码分析仪帮助您诊断和修复将在代码生成中导致错误的违规。看使用代码分析仪检查代码(MATLAB编码器).
笔记:如果您单击此页面右上方的按钮并在MATLAB®中打开此示例,那么MATLAB®将打开示例文件夹。此文件夹包含入口点函数文件(myknnEnsemblePredict.m
)和测试文件(test_myknnEnsemblePredict.m
,稍后描述)。
要生成C / C ++代码,您必须访问正确配置的C / C ++编译器。MATLAB编码器定位并使用支持的安装编译器。万博1manbetx您可以使用梅克斯
-设置
查看和更改默认编译器。有关更多详细信息,请参阅更改默认编译器.
写一个调用的测试脚本myknnensemblepredict.
功能。在“测试脚本”中,指定在生成的代码中使用的输入参数和名称值对参数。您使用此测试脚本在使用MATLAB编码器应用程序生成代码时自动定义输入类型。
在此示例中,创建test_myknnEnsemblePredict.m
如图所示,文件在当前文件夹中。
类型test_myknnEnsemblePredict.m%显示test_myknnensemblepredict.m文件的内容。
%% load样本数据加载电离层%% test myknnensemblepredict [标签,得分] = myknnensemblepredict(x,'knnensemble','学习者,1:13);
有关详细信息,请参阅使用应用程序自动定义输入类型(MATLAB编码器).
MATLAB Coder应用程序生成C或c++代码从MATLAB®代码。基于工作流的用户界面引导您完成代码生成过程。下面的步骤描述了MATLAB代码应用程序的简单工作流程。更多详细信息,请参见Matlab编码器(MATLAB编码器)和使用MATLAB编码器应用程序生成C代码(MATLAB编码器).
1.打开MATLAB代码应用程序并选择入门点函数文件。
在这一点应用标签,在应用部分,单击展示更多箭头打开应用程序库。在下面代码生成,点击Matlab编码器.该应用程序打开了选择源文件页面。输入或选择入口点函数的名称,myknnensemblepredict.
.
点击下一个去定义输入类型页面。
2.定义输入类型
因为C使用静态键入,因此MATLAB编码器必须在编译时确定MATLAB文件中所有变量的属性。因此,您需要指定入口点函数输入的属性。
输入或选择测试脚本test_myknnensemblepredict
并点击自动杂记输入类型.
MATLAB编码器应用程序识别输入类型myknnensemblepredict.
基于测试脚本的功能。
修改输入类型:
X
-应用程序推断输入X
是双(351 x34)
.必须将预测器的数量固定为与训练模型中的预测器数量相同。但是,您可以对预测具有不同的观察。如果观察数未知,则变化双(351 x34)
至双(x34: 351)
或者双(:INFX34)
.那个设定双(x34: 351)
允许观察数最多351,以及设置双(:INFX34)
允许无界数的观察数。在此示例中,指定双(:INFX34)
通过点击351.
并选择:INF.
.
文件名
- 点击字符
, 选择定义常数,并使用单引号键入文件名,'knnensemble'
.
varargin {1}
—名称-值对参数中的名称必须是编译时常量。点击字符
, 选择定义常数和类型'学习者'
.
varargin {2}
- 允许用户定义的指数在生成的代码中最多可达13名较弱的学习者,更改双(1 * 13)
至双(1 x: 13)
.
点击下一个去检查运行时间问题页面。此可选步骤生成MEX文件,运行MEX函数,并报告问题。点击下一个去生成代码页面。
3.生成C代码
放构建类型到MEX并点击产生.该应用程序生成MEX功能,myknnEnsemblePredict_mex
.MEX函数是一个C/ c++程序,可从MATLAB执行。您可以使用MEX函数来加速MATLAB算法,并测试生成的代码的功能和运行时问题。有关详细信息,请参阅MATLAB算法加速(MATLAB编码器)和为什么在Matlab中测试MEX函数?(MATLAB编码器).
根据指定的构建类型,MATLAB编码器生成编译为静态库,动态链接库或可执行文件的MEX函数或独立C / C ++代码。有关设置构建类型的详细信息,请参阅配置构建设置(MATLAB编码器).
点击下一个去完成工作流程页面。
4.查看完成工作流程页面
这完成工作流程页面表示代码生成成功。此页面还提供了项目摘要和引导生成输出的链接。
在定义输入类型后,您可以将MATLAB编码器项目转换为MATLAB命令的等效脚本。然后您运行脚本以生成代码。有关详细信息,请参阅将MATLAB编码器项目转换为MATLAB脚本(MATLAB编码器).
在Matlab编码器应用程序工具栏上,单击打开动作菜单按钮:
选择转换为脚本,然后单击保存.该应用程序创建文件myknnEnsemblePredict_script.m
,它在配置对象中再现项目并运行Codegen.
(MATLAB编码器)功能。
显示文件的内容myknnEnsemblePredict_script.m
.
类型myknnEnsemblePredict_script.m
%myknnensemblepredict_script从myknnensemblepredict生成mex函数myknnensemblepredict_mex%。2017年11月17日,从项目'myknensemblepredict.prj'生成%%脚本。%%另见编码器,coder.config,coder.typeof,codegen。%% create'coder.mexcodeConfig'的configuration对象。cfg = coder.config('mex');cfg.generateReport = true;cfg.reportpotentialDifferences = false;%%定义入门点'myknensemblepredict'的参数类型。args = cell(1,1);args {1} = cell(4,1); ARGS{1}{1} = coder.typeof(0,[Inf 34],[1 0]); ARGS{1}{2} = coder.Constant('knnEnsemble'); ARGS{1}{3} = coder.Constant('Learners'); ARGS{1}{4} = coder.typeof(0,[1 13],[0 1]); %% Invoke MATLAB Coder. codegen -config cfg myknnEnsemblePredict -args ARGS{1} -nargout 2
运行脚本。
myknnensemblepredict_script.
代码生成成功:要查看报告,打开('codegen/mex/myknnEnsemblePredict/html/report.mldatx')。
测试MEX功能以验证生成的代码是否提供了与原始MATLAB代码相同的功能。要执行此测试,请使用与运行原始MATLAB代码的相同输入运行MEX函数,然后比较结果。在生成独立代码之前在MATLAB中运行MEX函数也使您能够检测和修复在生成的独立代码中诊断的运行时错误。有关更多详细信息,请参阅为什么在Matlab中测试MEX函数?(MATLAB编码器).
传递一些预测数据以验证myknnensemblepredict.
MEX函数返回相同的结果。
[标签1,得分1] =预测(mdl,x,'学习者',1:10);[label2,score2] = myknensemblepredict(x,'knnensemble'那'学习者',1:10);[label3,score3] = myknensemblepredict_mex(x,'knnensemble'那'学习者',1:10);
比较标签1
那标签2.
, 和标签3.
通过使用是平等的
.
Isequal(Label1,Label2,Label3)
ans =.逻辑1
是平等的
返回逻辑1 (真的
),这意味着所有输入都是相等的。
这得分3.
MEX功能的输出可能包括与输出相比的圆截止差异预测
功能。在这种情况下,比较得分1
和得分3.
,允许小容差。
找到(abs (score1-score3) > 1 e-12)
ans = 0x1空双列向量
找
如果元素之间的绝对差,则返回一个空向量得分1
和得分3.
不大于指定的公差1E-12
.对比证实了myknnensemblepredict.
MEX函数返回相同的结果。
learnerCoderConfigurer
|loadlearnerforcoder.
|saveLearnerForCoder
|Codegen.
(MATLAB编码器)