Общий рабочий процесс генерации кода

Общий рабочий процесс генерации кода для функций 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
Для получения дополнительной информации см. Компилятор Значения по умолчанию Изменения (MATLAB).

Сгенерируйте код Используя 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 является числовым. Затем войдите:

    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).

Смотрите также

Похожие темы