Сгенерируйте код С от символьных выражений Используя приложение MATLAB Coder

В этом примере показано, как использовать приложение MATLAB® Coder™, чтобы сгенерировать статическую библиотеку C от символьных выражений. Во-первых, вы работаете с символьными выражениями в Symbolic Math Toolbox™ и преобразуете символьные выражения в развертываемую функцию MATLAB с помощью matlabFunction. Затем вы генерируете код С от функции MATLAB. Сгенерированный код C принимает входные параметры, которые имеют фиксированный, предписанный размер, но можно также задать входные параметры переменного размера во время генерации кода.

Этот пример выполняет шаги, описанные в, Генерируют код С при помощи Приложения MATLAB Coder (MATLAB Coder), но обновляет шаги, чтобы сгенерировать функцию MATLAB от символьного выражения. В качестве альтернативы можно сгенерировать код С от функции MATLAB в командной строке MATLAB при помощи codegen (MATLAB Coder) команда. Для примера на этом рабочем процессе смотрите, Генерируют код С в Командной строке (MATLAB Coder).

Обратите внимание на то, что приложение MATLAB Coder не поддерживается в MATLAB Online™. Чтобы сгенерировать код C/C++ в MATLAB Online, используйте codegen (MATLAB Coder) команда.

Сгенерируйте развертываемую функцию MATLAB от символьного выражения

Этот пример решает для собственных значений гамильтониана модели:

H=(q-12-δ2ΩΩδ2+q+12),

где q, Ω, и δ параметры гамильтониана.

Создайте символьные переменные q\omega, и delta представлять параметры гамильтониана. Создайте символьную матрицу для гамильтониана.

syms q Omega delta
H = [(q-1)^2 - delta/2, Omega; Omega, (q+1)^2 + delta/2]
H = 

(q-12-δ2ΩΩδ2+q+12)[(q - 1) ^2 - дельта/2, Омега; Омега, дельта/2 + (q + 1) ^2]

Найдите два собственных значения гамильтониана.

E = eig(H)
E = 

(q2-4Ω2+δ2+8δq+16q22+1q2+4Ω2+δ2+8δq+16q22+1)[q^2 - sqrt (4*Omega^sym (2) + delta^sym (2) + 8*delta*q + 16*q^2)/2 + 1; q^2 + sqrt (4*Omega^sym (2) + delta^sym (2) + 8*delta*q + 16*q^2)/2 + 1]

Затем преобразуйте эти два собственных значения E(1) и E(2) к файлу функции MATLAB при помощи matlabFunction. Запишите получившуюся функцию, которая возвращает два элемента E1 и E2, к файлу myEigenvalues.m. Задайте порядок входных параметров как [q Omega delta].

matlabFunction(E(1),E(2),'File','myEigenvalues', ...
    'Vars',[q Omega delta],'Outputs',{'E1','E2'});

Конвертированная функция в файле myEigenvalues.m может использоваться без Symbolic Math Toolbox. ФАЙЛ MATLAB myEigenvalues.m содержит функциональный myEigenvalues это реализует основной алгоритм в этом примере. Функция берет q\omega, и delta как входные параметры, все из которых должны быть или тем же размером или скаляром. Это затем вычисляет эти два собственных значения в зависимости от этих входных параметров.

type myEigenvalues
function [E1,E2] = myEigenvalues(q,Omega,delta)
%MYEIGENVALUES
%    [E1,E2] = MYEIGENVALUES(Q,OMEGA,DELTA)

%    This function was generated by the Symbolic Math Toolbox version 8.7.
%    25-Apr-2021 12:42:52

t2 = Omega.^2;
t3 = delta.^2;
t4 = q.^2;
t6 = delta.*q.*8.0;
t5 = t2.*4.0;
t7 = t4.*1.6e+1;
t8 = t3+t5+t6+t7;
t9 = sqrt(t8);
t10 = t9./2.0;
E1 = t4-t10+1.0;
if nargout > 1
    E2 = t4+t10+1.0;
end

Запустите тестовый скрипт MATLAB

Чтобы вычислить собственные значения для набора входных параметров, создайте и запустите тестовый скрипт myTest.m в MATLAB. Тестовый скрипт задает входные параметры со следующими размерами:

  • qGrid 128- 256 матрица, которая представляет точки в двумерном (q,Ω) пробел.

  • OmegaGrid 128- 256 матрица, которая представляет точки в двумерном (q,Ω) пробел.

  • delta скаляр.

Скрипт затем вызывает функциональный myEigenvalues.m вычислить собственные значения. Выход отображает график собственных значений для этих входных значений. Ниже содержимое скрипта myTest.m.

q = linspace(-2,2,256);
Omega = linspace(0,2,128);
delta = 1;

[qGrid,OmegaGrid] = meshgrid(q,Omega);
[E1,E2] = myEigenvalues(qGrid,OmegaGrid,delta);

surf(q,Omega,E1)
hold on;
surf(q,Omega,E2)
shading interp

Figure contains an axes. The axes contains 2 objects of type surface.

Сгенерируйте код С от функции MATLAB

Чтобы сделать ваш код MATLAB подходящим для генерации кода, используйте Анализатор кода и Инструмент Готовности Генерации кода. Анализатор кода в редакторе MATLAB постоянно проверяет ваш код, когда вы вводите его. Это сообщает о проблемах и рекомендует модификациям улучшать производительность и поддерживаемость. Инструмент Готовности Генерации кода экранирует код MATLAB на функции и функции, которые не поддерживаются для генерации кода.

Сделайте код MATLAB подходящим для генерации кода

  • Открытый myEigenvalues.m в редакторе MATLAB. После объявления функции добавьте %#codegen директива:

  • Индикатор сообщения Анализатора кода в правом верхнем углу редактора MATLAB является зеленым. Анализатор не обнаружил ошибки, предупреждения или возможности для улучшения кода. Для получения дополнительной информации об использовании Анализатора кода смотрите Проверку кода для Ошибок и Предупреждений.

  • Сохраните файл. Вы теперь готовы скомпилировать свой код при помощи приложения MATLAB Coder. Здесь, компиляция относится к генерации кода C/C++ из вашего кода MATLAB.

Открытое приложение MATLAB Coder и выбирает Source Files

  • На вкладке Apps панели инструментов MATLAB, под Генерацией кода, кликают по значку приложения MATLAB Coder. Приложение открывает страницу Select Source Files.

  • На странице Select Source Files введите или выберите имя функции точки входа myEigenvalues. Функцией точки входа является функция MATLAB верхнего уровня, от которой вы генерируете код. Приложение создает проект с именем по умолчанию myEigenvalues.prj в текущей папке.

  • Нажмите Далее, чтобы перейти к Входному Define шагу Типов. Выполнение приложения Анализатор кода, который вы уже запустили на предыдущем шаге и Инструменте Готовности Генерации кода на функции точки входа. Если приложение идентифицирует проблемы, оно открывает страницу Review Code Generation Readiness, где можно рассмотреть и устранить проблемы. В этом примере, потому что приложение не обнаруживает проблемы, оно открывает страницу Define Input Types. Для получения дополнительной информации смотрите Инструмент Готовности Генерации кода (MATLAB Coder).

Обратите внимание на то, что Анализатор кода и Инструмент Готовности Генерации кода не могут обнаружить все проблемы генерации кода. После устранения ошибок или предупреждений, что эти два инструмента обнаруживают, сгенерируйте код с MATLAB Coder, чтобы определить, имеет ли ваш код MATLAB другие проблемы соответствия.

Определенные встроенные функции MATLAB и функции тулбокса, классы и Системные объекты, которые поддерживаются для генерации кода C/C++, имеют определенные ограничения генерации кода. Эти ограничения и связанные указания по применению перечислены в Расширенных разделах Возможностей их соответствующих страниц с описанием. Для получения дополнительной информации смотрите Функции и Объекты, Поддержанные для Генерации кода C/C++ (MATLAB Coder).

Определите входные типы

Поскольку C использует статический контроль типов, генератор кода должен определить класс, размер и сложность всех переменных в файлах MATLAB во время генерации кода, также известное как время компиляции. Поэтому необходимо задать свойства всех входных параметров функции точки входа. Чтобы задать входные свойства, вы можете:

  • Дайте приложению команду автоматически определять входные свойства путем обеспечения скрипта, который вызывает функции точки входа с демонстрационными входными параметрами.

  • Задайте свойства непосредственно.

В этом примере, чтобы задать свойства входных параметров q\delta, и Omega, задайте тестовый файл myTest.m для генератора кода, чтобы использовать, чтобы задать типы автоматически:

  • Введите или выберите тестовый файл myTest.m в подсказке MATLAB.

  • Нажмите Autodefine Input Types. Тестовый файл, myTest.m, вызывает функцию точки входа, myEigenvalues, с ожидаемыми входными типами. Приложение решает что вход q double(128 x 256), вход Omega double(128 x 256), и вход delta double(1 x 1).

  • Нажмите Далее, чтобы перейти к Проверке на шаг Проблем Во время выполнения.

Проверяйте на проблемы во время выполнения

Проверка на шаг Проблем Во время выполнения генерирует MEX-функцию от ваших функций точки входа, запускает MEX-функцию и сообщает о проблемах. MEX-функция является сгенерированным кодом, который может быть назван из MATLAB. Выполнение этого шага является лучшой практикой, потому что можно обнаружить и зафиксировать ошибки времени выполнения, которые более трудно диагностировать в сгенерированном коде C. По умолчанию MEX-функция включает проверки целостности памяти. Эти проверки выполняют границы массивов и проверку размерности. Проверки обнаруживают нарушения целостности памяти в коде, сгенерированном для функций MATLAB. Для получения дополнительной информации смотрите Проверки на этапе выполнения Управления (MATLAB Coder).

Чтобы преобразовать код MATLAB в эффективный исходный код C/C++, генератор кода вводит оптимизацию, которая, в определенных ситуациях, заставляет сгенерированный код вести себя по-другому, чем код первоисточника. Смотрите Различия Между Сгенерированным кодом и кодом MATLAB (MATLAB Coder).

  • Чтобы открыть диалоговое окно Check for Run-Time Issues (если диалоговое окно автоматически не появляется), кликните по Проверке на стрелу Проблем.

  • В диалоговом окне Check for Run-Time Issues задайте тестовый файл или введите код, который вызывает функцию точки входа с входными параметрами в качестве примера. В данном примере используйте тестовый файл myTest то, что вы раньше задавали входные типы.

  • Нажмите Check for Issues. Приложение генерирует MEX-функцию, которая может быть запущена в MATLAB. Этот шаг запускает тестовый скрипт myTest заменяя вызовы myEigenvalues с вызовами сгенерированной MEX-функции, которая является [E1,E2] = myEigenvalues_mex(qGrid,OmegaGrid,delta). Сгенерированный файл MEX myEigenvalues_mex расположен в папке work\codegen\lib\myEigenvalues (на платформах Microsoft® Windows®) или work/codegen/lib/myEigenvalues (на Linux® или платформах Mac), где work местоположение myEigenvalues.m и myTest.m. Если приложение обнаруживает проблемы во время генерации MEX-функции или выполнения, это предоставляет предупреждающие сообщения и сообщения об ошибке. Кликните по этим сообщениям, чтобы перейти к проблематичному коду и устранить проблему. В этом примере приложение не обнаруживает проблемы.

  • По умолчанию приложение собирает количества выполнения линии. Эти количества помогают вам видеть как хорошо тестовый файл myTest.m осуществленный myEigenvalues функция. Чтобы просмотреть количества выполнения линии, нажмите количества выполнения линии View MATLAB. Редактор приложения отображает панель, на которую наносят цветную маркировку, слева от кода. Чтобы расширить выделение цвета по коду и видеть количества выполнения линии, установите свой курсор на панель. Конкретный оттенок зеленого цвета указывает, что код только выполняет один вызов, чтобы вычислить собственные значения.

  • Нажмите Далее, чтобы перейти к Сгенерировать шагу Кода.

Сгенерируйте код С

  • Чтобы открыть диалоговое окно Generate (если диалоговое окно автоматически не появляется), нажмите стрелу Generate.

  • В диалоговом окне Generate, типе Сборки набора к Static Library(.lib) и Язык к C. Используйте значения по умолчанию для других настроек конфигурации сборки проекта. Вместо того, чтобы генерировать статическую библиотеку C, можно принять решение сгенерировать MEX-функцию или другие типы сборки C/C++. Различные настройки проекта доступны для MEX и типов сборки C/C++. Когда вы переключаетесь между MEX и генерацией кода C/C++, проверяете настройки, которые вы выбираете.

  • Нажмите Generate. MATLAB Coder генерирует автономную статическую библиотеку C, myEigenvalues, в папке work\codegen\lib\myEigenvalues. Папка work местоположение myEigenvalues.m и myTest.m. Приложение MATLAB Coder указывает, когда генерация кода успешно выполнилась. Это отображает исходные файлы MATLAB и сгенерированные выходные файлы на левой стороне страницы. На вкладке Variables это отображает информацию об исходных переменных MATLAB. На вкладке Target Build Log это отображает журнал сборки, включая предупреждения компилятора C/C++ и ошибки. По умолчанию окно кода отображает файл исходного кода C, myEigenvalues.c. Чтобы просмотреть различный файл, кликните по желаемому имени файла в панели Файлов исходного кода или Выходных файлов.

  • Нажмите View Report, чтобы просмотреть отчет в Средстве просмотра Отчета. Если генератор кода обнаруживает ошибки или предупреждения во время генерации кода, отчет описывает проблемы и обеспечивает ссылки на проблематичный код MATLAB. Для получения дополнительной информации см. Отчеты Генерации кода (MATLAB Coder).

  • Нажмите Далее, чтобы открыть страницу Finish Workflow.

Рассмотрите страницу рабочего процесса конца

Страница Finish Workflow указывает, что генерация кода успешно выполнилась. Это предоставляет сводные данные проекта и ссылки на сгенерированный выход.

Сравните сгенерированный код C с оригинальным кодом MATLAB

Чтобы сравнить ваш сгенерированный код C с оригинальным кодом MATLAB, откройте файл C, myEigenvalues.c, и myEigenvalues.m файл в редакторе MATLAB.

Важная информация о сгенерированном коде C:

  • Функциональная подпись:

void myEigenvalues(const double q[32768], const double Omega[32768], double
                   delta, double E1[32768], double E2[32768])
  • const double q[32768] и const double Omega[32768] соответствует входу q и Omega в вашем коде MATLAB. Размер q 32768, который соответствует общему размеру (128 x 256) из входа в качестве примера, который вы использовали, когда вы сгенерировали код C/C++ из своего кода MATLAB. То же самое применяется к входу Omega. В этом случае сгенерированный код использует одномерные массивы, чтобы представлять двумерные массивы в коде MATLAB.

  • Генератор кода сохраняет ваше имя функции и комментарии. Когда возможно, генератор кода сохраняет ваши имена переменных. Обратите внимание на то, что, если переменная в вашем коде MATLAB установлена в постоянное значение, это не появляется как переменная в сгенерированном коде C. Вместо этого сгенерированный код C содержит значение переменной как литерал.

Сгенерируйте код С для входных параметров Переменного Размера

Функция C, которую вы сгенерировали для myEigenvalues.m может принять только входные параметры, которые имеют тот же размер как демонстрационные входные параметры, которые вы задали во время генерации кода. Однако входные массивы к соответствующей функции MATLAB могут иметь любой размер. В этой части примера вы генерируете код С от myEigenvalues.m это принимает входные параметры переменного размера.

Предположим, что вы хотите размерности q\omega, и delta в сгенерированном коде C, чтобы иметь эти свойства:

  • Первая размерность обоих q и delta может отличаться по размеру до 100.

  • Второе измерение q и delta может отличаться по размеру до 400.

  • Omega скаляр размера 1- 1.

Чтобы задать эти входные свойства с помощью MATLAB Coder, выполните эти шаги:

  • На Входном Define шаге Типов задайте тестовый файл myTest.m и нажмите Autodefine Input Types как прежде. Тестовый файл вызывает функцию точки входа, myEigenvalues.m, с ожидаемыми входными типами. Приложение решает что вход q double(128 x 256), вход Omega double(128 x 256), и вход delta double(1 x 1). Эти типы задают входные параметры фиксированного размера.

  • Кликните по входным техническим требованиям типа, чтобы отредактировать их. Можно задать переменный размер, до заданного предела, при помощи : префикс. Например, :100 указывает, что соответствующая размерность может отличаться по размеру до 100. Измените тип для q к double(:100 x :400), для Omega к double(1 x 1), и для delta к double(:100 x :400).

Можно теперь сгенерировать код путем выполнения тех же шагов как прежде. Функциональная подпись для сгенерированного кода C в myEigenvalues.c теперь чтения:

void myEigenvalues(const emxArray_real_T *q, double Omega, const emxArray_real_T
                   *delta, emxArray_real_T *E1, emxArray_real_T *E2)

Аргументы в сгенерированном коде соответствуют этим аргументам в исходной функции MATLAB:

  • emxArray_real_T*qq входной параметр

  • OmegaOmega входной параметр

  • emxArray_real_T*deltadelta входной параметр

  • emxArray_real_T*E1E1 выходной аргумент

  • emxArray_real_T*E2E2 выходной аргумент

Код С теперь состоит из структуры данных, названной emxArray_real_T представлять массив, размер которого неизвестен и неограничен во время компиляции. Для получения дополнительной информации смотрите Использование C Массивы в Сгенерированных Функциональных Интерфейсах (MATLAB Coder).