Функции объекта knnsearch и rangesearch ближайшего соседа по поиску объектов, ExhaustiveSearcher и KDTreeSearcher, поддерживает генерацию кода. В этом примере показано, как сгенерировать код для поиска ближайшего соседа с помощью исчерпывающего объекта поиска в командной строке. В примере показаны два различных способа генерации кода, в зависимости от того, как вы используете объект: загрузка объекта при помощи loadLearnerForCoder в функции точки входа и передайте объект константы времени компиляции в сгенерированный код.
Загрузите набор данных радужки Фишера.
load fisheririsУдалите пять ирисов случайным образом из данных предиктора для использования в качестве набора запросов.
rng('default'); % For reproducibility n = size(meas,1); % Sample size qIdx = randsample(n,5); % Indices of query data X = meas(~ismember(1:n,qIdx),:); Y = meas(qIdx,:);
Подготовьте исчерпывающий поиск по ближайшему соседу с помощью обучающих данных. Задайте 'Distance' и 'P' аргументы пары "имя-значение" для использования расстояния Минковского с экспонентом 1 для нахождения ближайшего соседа.
Mdl = ExhaustiveSearcher(X,'Distance','minkowski','P',1);
Найдите индекс обучающих данных (X), который является ближайшим соседом каждой точки в данных запроса (Y).
Idx = knnsearch(Mdl,Y);
saveLearnerForCoder и loadLearnerForCoderСгенерируйте код, который загружает исчерпывающий искатель, принимает данные запроса за входной параметр, а затем находит ближайшего соседа.
Сохраните исчерпывающий поиск в файл с помощью saveLearnerForCoder.
saveLearnerForCoder(Mdl,'searcherModel')saveLearnerForCoder сохраняет модель в двоичном файле MATLAB searcherModel.mat как массив структур в текущей папке.
Определите функцию точки входа myknnsearch1 который принимает данные запроса как входной параметр. В рамках функции загружает объект искателя при помощи loadLearnerForCoder, и затем передайте загруженную модель, чтобы knnsearch.
type myknnsearch1.m % Display contents of myknnsearch1.m file
function idx = myknnsearch1(Y) %#codegen
Mdl = loadLearnerForCoder('searcherModel');
idx = knnsearch(Mdl,Y);
end
Примечание.Если нажать кнопку, расположенную в правом верхнем разделе этой страницы и открыть этот пример в MATLAB ®, MATLAB ® открывает папку примера. Эта папка включает файлы функции точки входа, myknnsearch1.m, myknnsearch2.m, и myknnsearch3.m.
Сгенерируйте код для myknnsearch1 при помощи codegen (MATLAB Coder). Задайте тип данных и размерность входного параметра при помощи coder.typeof (MATLAB Coder), так что сгенерированный код принимает массив переменного размера.
codegen myknnsearch1 -args {coder.typeof(Y,[Inf,4],[1,0])}
Code generation successful.
Для более подробного примера генерации кода, который использует saveLearnerForCoder и loadLearnerForCoder, см. Генерацию кода для предсказания модели машинного обучения в командной строке. Дополнительные сведения об указании аргументов переменного размера см. в разделе «Задание аргументов переменного размера для генерации кода».
Передайте данные запроса (Y), чтобы проверить, что myknnsearch1 и Файлы MEX возвращают те же индексы.
myIdx1 = myknnsearch1(Y); myIdx1_mex = myknnsearch1_mex(Y);
Сравнение myIdx1 и myIdx1_mex при помощи isequal.
verifyMEX1 = isequal(Idx,myIdx1,myIdx1_mex)
verifyMEX1 = logical
1
isequal возвращает логический 1 (true), если все входы равны. Это сравнение подтверждает, что myknnsearch1 и Файлы MEX возвращают те же результаты.
Ближайшие соседние объекты искателя могут быть входным параметром функции, которую вы задаете для генерации кода. The -args опция codegen (MATLAB Coder) принимает объект поиска константы во время компиляции.
Определите функцию точки входа myknnsearch2 который принимает и исчерпывающую модель искателя и данные запроса как входные параметры вместо загрузки модели в функцию.
type myknnsearch2.m % Display contents of myknnsearch2.m file
function idx = myknnsearch2(Mdl,Y) %#codegen idx = knnsearch(Mdl,Y); end
Чтобы сгенерировать код, который принимает объект модели, а также данные запроса, обозначите объект модели как константу времени компиляции при помощи coder.Constant (MATLAB Coder) и включить постоянный свернутый объект модели в -args значение codegen.
codegen myknnsearch2 -args {coder.Constant(Mdl),coder.typeof(Y,[Inf,4],[1,0])}
Code generation successful.
Рабочий процесс генерации кода с постоянным свернутым объектом модели следует рабочему процессу генерации общего кода. Для получения дополнительной информации смотрите Рабочий процесс генерации общего кода.
Проверьте, что myknnsearch2 и Файлы MEX возвращают те же результаты.
myIdx2 = myknnsearch2(Mdl,Y); myIdx2_mex = myknnsearch2_mex(Mdl,Y); verifyMEX2 = isequal(Idx,myIdx2,myIdx2_mex)
verifyMEX2 = logical
1
Определите функцию точки входа myknnsearch3 который принимает объект модели, данные запроса и аргументы пары "имя-значение". Можно разрешить использование необязательных аргументов имя-значение путем определения вараргина в качестве входного параметра. Для получения дополнительной информации смотрите Генерацию кода для списков аргументов переменной длины (MATLAB Coder).
type myknnsearch3.m % Display contents of myknnsearch3.m file
function idx = myknnsearch3(Mdl,Y,varargin) %#codegen
idx = knnsearch(Mdl,Y,varargin{:});
end
Чтобы сгенерировать код, который позволяет заданную пользователем степень для расстояния Минковского, включите {coder.Constant('P'),0} в -args значение codegen. Использование coder.Constant (MATLAB Coder), поскольку имя аргумента пары "имя-значение" должно быть константой времени компиляции.
codegen myknnsearch3 -args {coder.Constant(Mdl),coder.typeof(Y,[Inf,4],[1,0]),coder.Constant('P'),0}
Code generation successful.
Проверьте, что 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 = logical
1
ExhaustiveSearcher | KDTreeSearcher | knnsearch | loadLearnerForCoder | rangesearch | saveLearnerForCoder | codegen (MATLAB CODER)