Общий рабочий процесс генерации кода для функций 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 -setupcodegenПосле подготовки вашего компилятора сгенерируйте код для функции точки входа при помощи 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 является числовым. Затем войдите:
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).