Общий рабочий процесс генерации кода для функций Statistics and Machine Learning Toolbox™, которые не являются объектными функциями моделей машинного обучения, совпадает с рабочим процессом, описанным в MATLAB® Coder™. Для получения дополнительной информации смотрите Начало работы с MATLAB Coder (MATLAB Coder). Чтобы изучить, как сгенерировать код для объектных функций моделей машинного обучения, смотрите Введение в Генерацию кода.
Этот пример кратко объясняет общий рабочий процесс генерации кода, как получено в итоге в этой блок-схеме:
Функция точки входа, также известная как или первичную функцию верхнего уровня, является функцией, которую вы задаете для генерации кода. Поскольку вы не можете вызвать функцию в верхнем уровне с помощью codegen
, необходимо задать функцию точки входа, которая вызывает включенные генерацией кода функции, и сгенерируйте код C/C++ для функции точки входа при помощи codegen
. Все функции в функции точки входа должны поддержать генерацию кода.
Добавьте %#codegen
директива компилятора (или прагма) к функции точки входа после функциональной подписи, чтобы указать, что вы намереваетесь сгенерировать код для алгоритма MATLAB. Добавление этой директивы дает Анализатору кода MATLAB команду помогать вам диагностировать и зафиксировать нарушения, которые вызвали бы ошибки во время генерации кода. Смотрите Контрольный код с Анализатором кода (MATLAB Coder).
Например, чтобы сгенерировать код, который оценивает межквартильный размах набора данных с помощью iqr
, задайте эту функцию.
function r = iqrCodeGen(x) %#codegen %IQRCODEGEN Estimate interquartile range % iqrCodeGen returns the interquartile range of the data x, % a single- or double-precision vector. r = iqr(x); end
varargin
как входной параметр. Для получения дополнительной информации смотрите Генерацию кода для Списков аргументов Переменной длины (MATLAB Coder) и Задайте Аргументы Переменного Размера для Генерации кода.Чтобы сгенерировать код C/C++, у вас должен быть доступ к компилятору, который сконфигурирован правильно. MATLAB Coder определяет местоположение и использует поддерживаемый, установленный компилятор. Просмотреть и изменить компилятор C по умолчанию, введите:
mex -setup
codegen
После подготовки вашего компилятора сгенерируйте код для функции точки входа при помощи codegen
или приложение MATLAB Coder. Чтобы изучить, как сгенерировать код с помощью приложения MATLAB Coder, смотрите, Генерируют MEX-функции при помощи Приложения MATLAB Coder (MATLAB Coder).
Чтобы сгенерировать код в командной строке, используйте codegen
. Поскольку C и C++ являются статически типизированными языками, необходимо определить свойства всех переменных в функции точки входа во время компиляции. Задайте типы данных и размеры всех входных параметров функции точки входа, когда вы вызовете codegen
при помощи -args
опция.
Чтобы задать тип данных и точный размер входного массива, передайте выражение MATLAB, которое представляет множество значений с определенным размером типа данных и массива. Например, чтобы указать, что сгенерированный код от iqrCodeGen.m
должен принять числовой вектор-столбец с двойной точностью с 100 элементами, введите:
testX = randn(100,1); codegen iqrCodeGen -args {testX} -report
-report
флаг генерирует отчет генерации кода. См. Отчеты Генерации кода (MATLAB Coder).
Чтобы указать, что по крайней мере одна из размерностей может иметь любую длину, используйте -args
опция с coder.typeof
можно следующим образом.
-args {coder.typeof(example_value, size_vector, variable_dims)}
example_value
, size_vector
, и variable_dims
задайте свойства входного массива, который может принять сгенерированный код.
Входной массив имеет совпадающий тип данных как значения в качестве примера в example_value
.
size_vector
размер массивов входного массива если соответствующий variable_dims
значением является false
.
size_vector
верхняя граница размера массивов если соответствующий variable_dims
значением является true
.
variable_dims
задает, имеет ли каждая размерность массива переменный размер или фиксированный размер. Значение true
(логическая единица) означает, что соответствующая размерность имеет переменный размер; значение false
(логический ноль) означает, что соответствующая размерность имеет фиксированный размер.
Определение входа переменного размера удобно, когда у вас есть данные с неизвестным количеством наблюдений во время компиляции. Например, чтобы указать, что сгенерированный код от iqrCodeGen.m
может принять числовой вектор-столбец с двойной точностью любой длины, введите:
testX = coder.typeof(0,[Inf,1],[1,0]); codegen iqrCodeGen -args {testX} -report
0 для
example_value
значение подразумевает, что типом данных является double
потому что double
тип числовых данных по умолчанию MATLAB. [Inf,1]
для size_vector
значение и [1,0]
для variable_dims
значение подразумевает, что размер первой размерности является переменным и неограниченным, и размер второго измерения фиксируется, чтобы быть 1.
Чтобы задать символьный массив, такой как поддерживаемые аргументы пары "имя-значение", задают символьный массив как постоянное использование coder.Constant
. Например, предположите тот 'Name'
допустимый аргумент пары "имя-значение" для iqrCodeGen.m
, и соответствующее значение value
isnumeric. Затем войдите:
codegen iqrCodeGen -args {testX,coder.Constant('Name'),value} -report
Для получения дополнительной информации смотрите, Генерируют код С в Командной строке (MATLAB Coder) и Specify Properties Входных параметров функции Точки входа (MATLAB Coder).
MATLAB Coder может сгенерировать код для этих типов:
MEX (Исполняемый файл MATLAB) функция
Автономный код C/C++
Автономный код C/C++ скомпилирован к статической библиотеке
Автономный код C/C++ скомпилирован к динамически подключаемой библиотеке
Автономный код C/C++ скомпилирован к исполняемому файлу
Можно задать тип сборки с помощью -config
опция codegen
. Для получения дополнительной информации об установке опций генерации кода смотрите, Конфигурируют Настройки Сборки (MATLAB Coder).
По умолчанию, codegen
генерирует MEX-функцию. MEX-функция является программой C/C++, которая является исполняемым файлом из MATLAB. Можно использовать MEX-функцию, чтобы ускорить алгоритмы MATLAB и протестировать сгенерированный код на функциональность и проблемы во время выполнения. Для получения дополнительной информации смотрите Ускорение алгоритма MATLAB (MATLAB Coder) и Почему Тестовые MEX-функции в MATLAB? (MATLAB Coder).
Можно использовать -report
отметьте, чтобы представить отчет генерации кода. Этот отчет помогает вам отладить проблемы генерации кода и просмотреть сгенерированный код C/C++. Для получения дополнительной информации см. Отчеты Генерации кода (MATLAB Coder).
Протестируйте MEX-функцию, чтобы проверить, что сгенерированный код обеспечивает ту же функциональность как оригинальный код MATLAB. Чтобы выполнить этот тест, запустите MEX-функцию с помощью тех же входных параметров, что вы раньше запускали оригинальный код MATLAB, и затем сравнивали результаты. Выполнение MEX-функции в MATLAB прежде, чем сгенерировать автономный код также позволяет вам обнаружить и зафиксировать ошибки времени выполнения, которые намного более трудно диагностировать в сгенерированном автономном коде. Для получения дополнительной информации смотрите Почему Тестовые MEX-функции в MATLAB? (MATLAB Coder).
Передайте некоторые данные, чтобы проверить ли iqr
, iqrCodeGen
, и iqrCodeGen_mex
возвратите тот же межквартильный размах.
testX = randn(100,1); r = iqr(testX); r_entrypoint = iqrCodeGen(testX); r_mex = iqrCodeGen_mex(testX);
Сравните выходные параметры при помощи isequal
.
isequal(r,r_entrypoint,r_mex)
isequal
возвращает логическую единицу, (TRUE), если все входные параметры равны.
Можно также проверить MEX-функцию с помощью тестового файла и coder.runTest
. Для получения дополнительной информации см. Код Тестирования, Сгенерированный из кода MATLAB (MATLAB Coder).