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

Рабочий процесс генерации общего кода для функций 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).

См. также

(MATLAB Coder)

Похожие темы