最近邻搜索器的代码生成
对象函数knnsearch
而且rangesearch
最近邻搜索器对象的,ExhaustiveSearcher
而且KDTreeSearcher
,支持代码生成。此示例演示如何在命令行上使用穷尽搜索器对象生成查找最近邻居的代码。该示例显示了生成代码的两种不同方法,这取决于您使用对象的方式:通过using加载对象loadLearnerForCoder
,并向生成的代码传递一个编译时常量对象。
训练穷尽最近邻居搜索器
载入费雪的虹膜数据集。
负载fisheriris
从预测器数据中随机删除五个虹膜作为查询集使用。
rng (“默认”);%用于重现性N = size(meas,1);样本容量qIdx = randsample(n,5);查询数据的索引X = meas(~ismember(1:n,qIdx),:);Y = meas(qIdx,:);
使用训练数据准备一个详尽的最近邻搜索器。指定“距离”
而且“P”
名称-值对参数使用指数为1的闵可夫斯基距离来查找最近的邻居。
Mdl = expltivesearcher;“距离”,闵可夫斯基的,“P”1);
查找训练数据的索引(X
),它是查询数据中每个点的最近邻居(Y
).
Idx = knnsearch(Mdl,Y);
使用生成代码saveLearnerForCoder
而且loadLearnerForCoder
生成加载穷尽搜索器的代码,将查询数据作为输入参数,然后查找最近的邻居。
将穷尽搜索器保存到使用的文件中saveLearnerForCoder
.
saveLearnerForCoder (Mdl“searcherModel”)
saveLearnerForCoder
将模型保存到MATLAB二进制文件中searcherModel.mat
作为当前文件夹中的结构数组。
定义入口点函数myknnsearch1
它将查询数据作为输入参数。在函数中,使用loadLearnerForCoder
,然后将加载的模型传递给knnsearch
.
类型myknnsearch1.m显示myknnsearch1的内容。m文件
函数idx = myknnsearch1(Y) %#codegen Mdl = loadLearnerForCoder('searcherModel');idx = knnsearch(Mdl,Y);结束
注意:如果您单击位于此页右上角部分的按钮,并在MATLAB®中打开此示例,那么MATLAB®将打开示例文件夹。这个文件夹包括入口点函数文件,myknnsearch1.m
,myknnsearch2.m
,myknnsearch3.m
.
生成以下代码myknnsearch1
通过使用codegen
(MATLAB编码器).使用指定输入参数的数据类型和维数coder.typeof
(MATLAB编码器)因此生成的代码接受可变大小的数组。
codegenmyknnsearch1arg游戏{coder.typeof (Y,[正无穷,4],[1,0])}
代码生成成功。
以获取更详细的代码生成示例saveLearnerForCoder
而且loadLearnerForCoder
,请参阅命令行机器学习模型预测的代码生成.有关指定可变大小参数的详细信息,请参见为代码生成指定可变大小的参数.
传递查询数据(Y
)以核实myknnsearch1
和MEX文件返回相同的索引。
myIdx1 = myknnsearch1(Y);myIdx1_mex = myknnsearch1_mex(Y);
比较myIdx1
而且myIdx1_mex
通过使用isequal
.
verifyMEX1 = isequal(Idx,myIdx1,myIdx1_mex)
verifyMEX1 =逻辑1
isequal
返回逻辑1 (真正的
)如果所有的输入都相等。这一比较证实了myknnsearch1
和MEX文件返回相同的结果。
生成具有常量折叠模型对象的代码
最近邻居搜索器对象可以是为代码生成定义的函数的输入参数。的arg游戏
选择codegen
(MATLAB编码器)接受一个编译时常量搜索器对象。
定义入口点函数myknnsearch2
它将详尽的搜索器模型和查询数据作为输入参数,而不是将模型加载到函数中。
类型myknnsearch2.m显示myknnsearch2的内容。m文件
函数idx = myknnsearch2(Mdl,Y) %#codegen idx = knnsearch(Mdl,Y);结束
要生成接受模型对象和查询数据的代码,可以使用将模型对象指定为编译时常量编码器。常数
(MATLAB编码器)并包含常量折叠模型对象在arg游戏
的价值codegen
.
codegenmyknnsearch2arg游戏{coder.Constant (Mdl)、coder.typeof (Y,[正无穷,4],[1,0])}
代码生成成功。
具有常数折叠模型对象的代码生成工作流遵循一般的代码生成工作流。详情请参见通用代码生成工作流.
验证myknnsearch2
和MEX文件返回相同的结果。
myIdx2 = myknnsearch2(Mdl,Y);myIdx2_mex = myknnsearch2_mex(Mdl,Y);verifyMEX2 = isequal(Idx,myIdx2,myIdx2_mex)
verifyMEX2 =逻辑1
生成具有名称-值对参数的代码
定义入口点函数myknnsearch3
它接受模型对象、查询数据和名值对参数。可以通过指定允许可选的名称-值参数变长度输入宗量作为输入参数。详情请参见可变长度参数列表的代码生成(MATLAB编码器).
类型myknnsearch3.m显示myknnsearch3的内容。m文件
函数idx = myknnsearch3(Mdl,Y,varargin) %#codegen idx = knnsearch(Mdl,Y,varargin{:});结束
若要生成允许使用用户定义的闵可夫斯基距离指数的代码,请使用include{coder.Constant(“P”),0}
在arg游戏
的价值codegen
.使用编码器。常数
(MATLAB编码器)因为名值对参数的名称必须是编译时常量。
codegenmyknnsearch3arg游戏{coder.Constant (Mdl)、coder.typeof (Y,[正无穷,4],[1,0]),coder.Constant(“P”),0}
代码生成成功。
验证myknnsearch3
和MEX文件返回相同的结果。
newIdx = knnsearch(Mdl,Y,“P”2);myIdx3 = myknnsearch3(Mdl,Y,“P”2);myIdx3_mex = myknnsearch3_mex(Mdl,Y,“P”2);verifyMEX3 = isequal(newIdx,myIdx3,myIdx3_mex)
verifyMEX3 =逻辑1
另请参阅
codegen
(MATLAB编码器)|saveLearnerForCoder
|loadLearnerForCoder
|knnsearch
|rangesearch
|ExhaustiveSearcher
|KDTreeSearcher