Рабочий процесс генерации общего кода для функций Statistics and Machine Learning Toolbox™, которые не являются объектными функциями моделей машинного обучения, аналогичен рабочему процессу, описанному в MATLAB® Coder™. Для получения дополнительной информации смотрите Запуск с MATLAB Coder (MATLAB Coder). Чтобы узнать, как сгенерировать код для объектных функций моделей машинного обучения, смотрите Введение в Генерацию кода.
Этот пример кратко объясняет общую генерацию кода рабочего процесса как обобщено в этом графике потока:
Функция точки входа, также известная как функция верхнего уровня или первичная функция, является функцией, которую вы задаете для генерации кода. Потому что вы не можете вызвать какую-либо функцию на верхнем уровне, используя codegen
(MATLAB Coder), необходимо задать функцию точки входа, которая вызывает функции с поддержкой генерации кода, и сгенерировать код C/C + + для функции точки входа при помощиcodegen
. Все функции в функции точки входа должны поддерживать генерацию кода.
Добавьте %#codegen
директива компилятора (или прагма) к функции точки входа после сигнатуры функции, чтобы указать, что вы намерены сгенерировать код для алгоритма MATLAB. Добавление этой директивы предписывает анализатору кода MATLAB помочь вам диагностировать и исправить нарушения, которые могут привести к ошибкам во время генерации кода. Смотрите проверку кода with the Анализатор Кода (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. Чтобы узнать, как сгенерировать код с помощью приложения MATLAB Coder, смотрите Сгенерируйте MEX-функции путем использования приложения MATLAB Coder (MATLAB COder).
Чтобы сгенерировать код в командной строке, используйте codegen
(MATLAB Coder). Поскольку C и C++ являются статически типизированными языками, вы должны определить свойства всех переменных в функции точки входа во время компиляции. Задайте типы данных и размеры всех входов функции точки входа при вызове codegen
при помощи -args
опция.
Чтобы задать тип данных и точный размер входного массива, передайте выражение MATLAB, которое представляет множество значений с определенным типом данных и размером массива. Например, чтобы указать, что сгенерированный код из iqrCodeGen.m
необходимо принять числовой вектор-столбец двойной точности со 100 элементами, введите:
testX = randn(100,1); codegen iqrCodeGen -args {testX} -report
The -report
флаг генерирует отчет генерации кода. См. отчеты генерации кода (MATLAB Coder).
Чтобы указать, что хотя бы один из размерностей может иметь любую длину, используйте -args
опция с coder.typeof
(MATLAB Coder) следующим образом.
-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
(логический 1) означает, что соответствующая размерность имеет переменный размер; значение false
(логический 0) означает, что соответствующая размерность имеет фиксированный размер.
Указание входа переменного размера удобно, когда у вас есть данные с неизвестным количеством наблюдений во время компиляции. Например, чтобы указать, что сгенерированный код из 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.
Примечание
Спецификация входов переменного размера может повлиять на эффективность. Для получения дополнительной информации смотрите Управление Выделением Памяти для Массивов Переменного Размера (MATLAB Coder).
Чтобы задать символьный массив, такой как поддерживаемые аргументы пары "имя-значение", задайте символьный массив как константу, используя coder.Constant
(MATLAB Coder). Например, предположим, что 'Name'
является допустимым аргументом пары "имя-значение" для iqrCodeGen.m
и соответствующее значение value
является числовым. Затем введите:
codegen iqrCodeGen -args {testX,coder.Constant('Name'),value} -report
Для получения дополнительной информации смотрите Генерация кода С в командной строке (MATLAB Coder) и Задайте свойства входных параметров функции точки входа (MATLAB Coder).
MATLAB Coder может сгенерировать код для следующих типов:
Функция MEX (MATLAB Executable)
Автономный код C/C + +
Автономный код C/C + + скомпилирован в статическую библиотеку
Автономный код C/C + + скомпилирован в динамически связанную библиотеку
Автономный код C/C + + скомпилирован в исполняемый файл
Тип сборки можно задать с помощью -config
опция codegen
(MATLAB Coder). Для получения дополнительной информации об установке опций генерации кода смотрите Configure Build Settings (MATLAB Coder).
По умолчанию, codegen
генерирует MEX-функцию. Функция MEX является программой на C/C + +, которая исполняется из MATLAB. Можно использовать MEX-функцию, чтобы ускорить алгоритмы MATLAB и протестировать сгенерированный код на функциональность и проблемы времени выполнения. Для получения дополнительной информации смотрите Алгоритм MATLAB Acceleration (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
возвращает логический 1 (true), если все входы равны.
Можно также проверить MEX-функцию с помощью тестового файла и coder.runTest
(MATLAB Coder). Для получения дополнительной информации смотрите Проверку кода, сгенерированного из кода MATLAB (MATLAB Coder).
codegen
(MATLAB Coder)