Объект функционирует knnsearch
и rangesearch
самых близких соседних объектов искателя, ExhaustiveSearcher
и KDTreeSearcher
, генерации кода поддержки. Этот пример показывает, как сгенерировать код для нахождения самого близкого соседа, использующего исчерпывающий объект искателя в командной строке. Пример показывает два различных способа сгенерировать код, в зависимости от способа, которым вы используете объект: загрузите объект при помощи loadCompactModel
в функции точки входа и передайте время компиляции постоянный объект сгенерированному коду.
Загрузите ирисовый набор данных Фишера.
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);
saveCompactModel
и loadCompactModel
Сгенерируйте код, который загружает исчерпывающего искателя, берет данные о запросе в качестве входного параметра, и затем находит самого близкого соседа.
Сохраните исчерпывающего искателя в файл с помощью saveCompactModel
.
saveCompactModel(Mdl,'searcherModel')
saveCompactModel
сохраняет модель в двоичный файл MATLAB searcherModel.mat как массив структур в текущей папке.
Задайте функцию точки входа myknnsearch1
, который берет данные о запросе в качестве входного параметра. В функции загрузите объект искателя при помощи loadCompactModel
, и затем передайте загруженную модель knnsearch
.
type myknnsearch1.m % Display contents of myknnsearch1.m file
function idx = myknnsearch1(Y) %#codegen Mdl = loadCompactModel('searcherModel'); idx = knnsearch(Mdl,Y); end
Примечание: Если вы нажимаете кнопку, расположенную в верхнем правом разделе этой страницы, и открываете этот пример в MATLAB®, затем MATLAB® открывает папку в качестве примера. Эта папка включает файлы функции точки входа, myknnsearch1.m
, myknnsearch2.m
и myknnsearch3.m
.
Сгенерируйте код для myknnsearch1
при помощи codegen
. Задайте тип данных и размерность входного параметра при помощи coder.typeof
так, чтобы сгенерированный код принял массив переменного размера.
codegen myknnsearch1 -args {coder.typeof(Y,[Inf,4],[1,0])}
Для более подробного примера генерации кода, который использует saveCompactModel
и loadCompactModel
, смотрите Генерацию кода для Прогноза Модели Машинного обучения в Командной строке. Для получения дополнительной информации об определении аргументов переменного размера, смотрите, Задают Аргументы Переменного Размера для Генерации кода.
Передайте данные о запросе (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
возвращает логическую единицу (true
), если все входные параметры равны. Это сравнение подтверждает, что myknnsearch1
и файл MEX возвращают те же результаты.
Самые близкие соседние объекты искателя могут быть входным параметром функции, которую вы задаете для генерации кода. Опция -args
codegen
принимает время компиляции постоянный объект искателя.
Задайте функцию точки входа myknnsearch2
, который берет обоих исчерпывающая модель искателя и данные о запросе как входные параметры вместо того, чтобы загрузить модель в функции.
type myknnsearch2.m % Display contents of myknnsearch2.m file
function idx = myknnsearch2(Mdl,Y) %#codegen idx = knnsearch(Mdl,Y); end
Чтобы сгенерировать код, который берет объект модели, а также данные о запросе, назовите объект модели как время компиляции постоянным при помощи coder.Constant
и включайте постоянный свернутый объект модели в значение -args
codegen
.
codegen myknnsearch2 -args {coder.Constant(Mdl),coder.typeof(Y,[Inf,4],[1,0])}
Рабочий процесс генерации кода с постоянным свернутым объектом модели следует за общим рабочим процессом генерации кода. Для получения дополнительной информации смотрите Общий Рабочий процесс Генерации кода.
Проверьте, что myknnsearch2
и файл MEX возвращают те же результаты.
myIdx2 = myknnsearch2(Mdl,Y); myIdx2_mex = myknnsearch2_mex(Mdl,Y); verifyMEX2 = isequal(Idx,myIdx2,myIdx2_mex)
verifyMEX2 = logical
1
Задайте функцию точки входа myknnsearch3
, который берет объект модели, данные о запросе и аргументы пары "имя-значение". Можно допускать дополнительные аргументы значения имени путем определения varargin
как входного параметра. Для получения дополнительной информации смотрите Генерацию кода для Списков аргументов Переменной длины (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
, потому что имя аргумента пары "имя-значение" должно быть постоянным временем компиляции.
codegen myknnsearch3 -args {coder.Constant(Mdl),coder.typeof(Y,[Inf,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 = logical
1
ExhaustiveSearcher
| KDTreeSearcher
| codegen
| knnsearch
| loadCompactModel
| rangesearch
| saveCompactModel