Этот пример показывает, как использовать MATLAB® Coder™, чтобы сгенерировать код С для файла MATLAB. Пример объясняет, как изменить код MATLAB, используемый Автоматизированным примером Соответствия Функции так, чтобы это поддерживалось для генерации кода. Пример подсвечивает некоторые общие требования для генерации кода, а также некоторые определенные меры, которые необходимо принять, чтобы подготовить код MATLAB. Если код MATLAB готов к генерации кода, вы используете команду codegen
, чтобы сгенерировать C-MEX-ФУНКЦИЮ. Наконец, чтобы проверить результаты, пример показывает вам, как запустить сгенерированную C-MEX-ФУНКЦИЮ в MATLAB и сравнить его вывод с выводом кода MATLAB.
Этот пример требует лицензии MATLAB Coder.
Чтобы запустить этот пример, у вас должен быть доступ к компилятору C, и необходимо сконфигурировать его с помощью 'mex - настройка' команда. Для получения дополнительной информации смотрите Подготовку Вашего компилятора C.
Сгенерированный код может запуститься в среде MATLAB как файл MEX на C, или вне среды MATLAB как независимый исполняемый файл или совместно использованная утилита, которая будет соединена с другим независимым исполняемым файлом. Для получения дополнительной информации об установке опций генерации кода, смотрите - опция config команды codegen
.
Исполняемые файлы MEX
Этот пример генерирует исполняемый файл MEX, который будет запущен в среде MATLAB.
Генерация исполняемого файла C-MEX, чтобы запуститься в MATLAB может также быть большим первым шагом в рабочем процессе, который в конечном счете приводит к автономному коду. Входные параметры и выходные параметры файла MEX доступны для контроля в среде MATLAB, где визуализация и другие виды инструментов для верификации и анализа легко доступны. У вас также есть выбор рабочих отдельных команд или как сгенерированный код C, или через движок MATLAB. Чтобы запуститься через MATLAB, объявите соответствующие команды как extrinsic
, что означает, что сгенерированный код повторно войдет в среду MATLAB, когда это должно будет запустить ту конкретную команду. Это полезно в случаях, где или изолированная команда еще не сделала, чтобы генерация кода поддержала, или если вы хотите встроить определенные команды, которые не генерируют код (такой как команда plot).
Независимые исполняемые файлы
Если развертывание кода к другому приложению будет целью, то независимый исполняемый файл будет требоваться. Первый шаг должен сконфигурировать MATLAB Coder соответственно. Например, один способ сказать его, вы хотите независимый исполняемый файл, состоит в том, чтобы создать проект MATLAB Coder с помощью IDE MATLAB Coder и сконфигурировать тот проект сгенерировать модуль или исполняемый файл. Можно сделать настолько использующий C/C++ статическую библиотеку или исполнимые опции C/C++ от виджета типа Сборки на странице Generate. Этот IDE доступен путем навигации можно следующим образом:
- Щелкните вкладка APPS - Прокручивают вниз к диалоговому окну MATLAB Coder - In MATLAB Coder Project, нажимают ОК
Можно также задать использование объекта конфигурации
a=coder.config('exe')
и передайте тот объект команде кодера на командной строке MATLAB. Когда вы создаете независимый исполняемый файл, необходимо записать собственный main.c (или main.cpp). Обратите внимание на то, что, когда вы создаете независимый исполняемый файл, нет никаких готовых утилит для того, чтобы импортировать или экспортировать данные между исполняемым файлом и средой MATLAB. Одна из опций должна использовать printf/fprintf для файла (в вашем рукописном main.c) и затем импортировать данные в MATLAB с помощью 'загрузку - ASCII' с файлом.
MATLAB Coder требует, чтобы код MATLAB был в форме функции в порядке сгенерировать код С. Обратите внимание на то, что обычно не необходимо сгенерировать код С для всего рассматриваемого кода MATLAB. Часто желательно разделить код на первичный вычислительный фрагмент, от которого генерация кода C желаема, и обвязка или драйвер, который не должен генерировать код С - что код запустится в MATLAB. Обвязка может содержать визуализацию и другие средства для верификации, которые не являются на самом деле частью системы под тестом. Код для основного алгоритма этого примера находится в функции, вызванной visionRecovertformCodeGeneration_kernel.m
Если код был повторно спроектирован, как описано выше, необходимо проверять, что остальная часть кода использует возможности, которые поддерживаются MATLAB Coder. Для списка поддерживаемых команд см. документацию MATLAB Coder. Для списка поддерживаемых построений языка смотрите Функции языка MATLAB, Поддерживавшие для Генерации кода C/C++.
Может быть удобно ограничить визуализацию или некоторую другую возможность, которая не поддержана MATLAB Coder, существующим в функции, содержащей основной алгоритм, который мы надеемся скомпилировать. В этих случаях можно объявить эти 'внешние' элементы (использующий coder.extrinsic). Такая возможность только возможна, когда вы сгенерируете код С в файл MEX MATLAB, и те функции на самом деле запустятся в интерпретированном режиме MATLAB. При генерации кода для автономного использования или проигнорированы внешние функции, или они генерируют ошибку, в зависимости от того, решает ли механизм генерации кода, что они влияют на результаты. Таким образом код должен быть правильно спроектирован так, чтобы внешние функции существенно не влияли на рассматриваемый код, если независимый исполняемый файл в конечном счете желаем.
Исходный пример использует showMatchedFeatures и imshowpair стандартные программы для визуализации результатов. Эти стандартные программы извлечены к новой функции featureMatchingVisualization_extrinsic.m. Эта функция объявляется внешняя.
Файл ядра visionRecovertformCodeGeneration_kernel.m имеет два входных параметра. Первый вход является оригинальным изображением, и второй вход является изображением, искаженным попеременно и шкала.
% define original image original = imread('cameraman.tif'); % define distorted image by resizing and then rotating original image scale = 0.7; J = imresize(original, scale); theta = 30; distorted = imrotate(J, theta); % call the generated mex file [matchedOriginalLoc, matchedDistortedLoc,... thetaRecovered, ... scaleRecovered, recovered] = ... visionRecovertformCodeGeneration_kernel(original, distorted);
scaleRecovered = 0.701003 thetaRecovered = 30.235065
Теперь используйте функцию codegen, чтобы скомпилировать функцию visionRecovertformCodeGeneration_kernel в файл MEX. Можно задать '-отчет' опция, чтобы сгенерировать отчет компиляции, который показывает оригинальный код MATLAB и связанные файлы, которые были созданы во время генерации кода C. Можно хотеть создать временную директорию, где MATLAB Coder может создать новые файлы. Обратите внимание на то, что сгенерированный файл MEX имеет то же имя как исходный файл MATLAB с добавленным _mex, если вы не используете-o опцию, чтобы задать имя исполняемого файла.
MATLAB Coder требует, чтобы вы задали свойства всех входных параметров. Один простой способ сделать это должно задать входные свойства на примере в командной строке с помощью-args опции. Для получения дополнительной информации смотрите Входную Спецификацию. Поскольку входные параметры к visionRecovertformCodeGeneration_kernel.m являются парой изображений, мы задаем обоих входные параметры со следующими свойствами:
переменного размера во времени выполнения с верхней границей [1000 1000]
тип данных uint8
% Define the properties of input images imageTypeAndSize = coder.typeof(uint8(0), [1000 1000],[true true]); compileTimeInputs = {imageTypeAndSize, imageTypeAndSize}; codegen visionRecovertformCodeGeneration_kernel.m -report -args compileTimeInputs;
Code generation successful: To view the report, open('codegen/mex/visionRecovertformCodeGeneration_kernel/html/report.mldatx').
[matchedOriginalLocCG, matchedDistortedLocCG,... thetaRecoveredCG, scaleRecoveredCG, recoveredCG] = ... visionRecovertformCodeGeneration_kernel_mex(original, distorted);
scaleRecovered = 0.701003 thetaRecovered = 30.235065
clear visionRecovertformCodeGeneration_kernel_mex;
Восстановленная шкала и тета и для MATLAB и для CODEGEN, как показано выше, в разумном допуске. Кроме того, совпадающие точки идентичны, как показано ниже:
isequal(matchedOriginalLocCG, matchedOriginalLoc) isequal(matchedDistortedLocCG, matchedDistortedLoc)
ans = logical 1 ans = logical 1
Следующие функции помощника используются в этом примере.