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

Общий рабочий процесс генерации кода для функций Statistics and Machine Learning Toolbox™, которые не являются объектными функциями моделей машинного обучения, совпадает с рабочим процессом, описанным в MATLAB® Coder™. Для получения дополнительной информации смотрите Начало работы с MATLAB Coder (MATLAB Coder). Чтобы изучить, как сгенерировать код для объектных функций моделей машинного обучения, смотрите Введение в Генерацию кода.

Этот пример кратко объясняет общий рабочий процесс генерации кода, как получено в итоге в этой блок-схеме:

Задайте функцию точки входа

Функция точки входа, также известная как или первичную функцию верхнего уровня, является функцией, которую вы задаете для генерации кода. Поскольку вы не можете вызвать функцию при использовании верхнего уровня codegen (MATLAB Coder), необходимо задать функцию точки входа, которая вызывает включенные генерацией кода функции, и сгенерируйте код 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. Чтобы изучить, как сгенерировать код с помощью приложения 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

    -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 (логическая единица) означает, что соответствующая размерность имеет переменный размер; значение 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.

    Примечание

    Спецификация переменных входных параметров размера может влиять на эффективность. Для получения дополнительной информации смотрите Выделение Управляющей памяти для Массивов Переменного Размера (MATLAB Coder).

  • Чтобы задать символьный массив, такой как поддерживаемые аргументы пары "имя-значение", задают символьный массив как постоянное использование coder.Constant (MATLAB Coder). Например, предположите тот '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). Для получения дополнительной информации об установке опций генерации кода смотрите, Конфигурируют Настройки Сборки (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 Coder). Для получения дополнительной информации см. Код Тестирования, Сгенерированный из кода MATLAB (MATLAB Coder).

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

(MATLAB Coder)

Похожие темы