exponenta event banner

Создание кода C из символьных выражений с помощью приложения кодера MATLAB

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

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

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

Создание развертываемой функции 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 - delta/2, Omega; Omega, delta/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 может использоваться без панели символьных математических инструментов. Файл 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.

Создание кода C из функции MATLAB

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

Сделать код MATLAB подходящим для создания кода

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

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

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

Откройте приложение кодера MATLAB и выберите исходные файлы

  • На вкладке Приложения панели инструментов MATLAB в разделе Создание кода щелкните значок приложения Кодер MATLAB. Приложение открывает страницу Выбор исходных файлов.

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

  • Нажмите кнопку Далее (Next), чтобы перейти к шагу Определить типы ввода (Define Input Types). Приложение запускает анализатор кода, который уже был запущен на предыдущем шаге, и инструмент готовности к генерации кода в функции начальной точки. Если приложение выявляет проблемы, открывается страница «Проверка готовности к созданию кода», на которой можно просмотреть и устранить проблемы. В этом примере, поскольку приложение не обнаруживает проблем, открывается страница Определение типов ввода. Для получения дополнительной информации см. Инструмент готовности к созданию кода (кодер MATLAB).

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

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

Определение типов ввода

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

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

  • Укажите свойства непосредственно.

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

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

  • Щелкните Автоопределение входных типов.Тестовый файл, 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).

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

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

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

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

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

Создать код C

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

  • В диалоговом окне «Создание» задайте для параметра «Тип построения» значение Static Library(.lib) и язык C. Используйте значения по умолчанию для других параметров конфигурации построения проекта. Вместо создания статической библиотеки C можно создать функцию MEX или другие типы сборки C/C + +. Для типов сборки MEX и C/C + + доступны различные параметры проекта. При переключении между генерацией кода MEX и C/C + + проверьте выбранные параметры.

  • Щелкните Создать (Generate). Кодер MATLAB создает автономную статическую библиотеку C, myEigenvalues, в папке work\codegen\lib\myEigenvalues. Папка work - местоположение myEigenvalues.m и myTest.m. Приложение MATLAB Coder указывает, когда удалось создать код. Он отображает исходные файлы MATLAB и созданные выходные файлы в левой части страницы. На вкладке Переменные (Variables) отображается информация об исходных переменных MATLAB. На вкладке Target Build Log отображается журнал сборки, включая предупреждения и ошибки компилятора C/C + +. По умолчанию в окне кода отображается файл исходного кода C,myEigenvalues.c. Чтобы просмотреть другой файл, щелкните нужное имя файла на панели Исходный код (Source Code) или Выходные файлы (Output Files).

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

  • Нажмите кнопку Далее, чтобы открыть страницу Завершить рабочий процесс.

Просмотреть страницу завершения рабочего процесса

Страница «Завершить рабочий процесс» показывает, что создание кода успешно завершено. Он содержит сводку проекта и ссылки на сгенерированные выходные данные.

Сравнение сгенерированного кода 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 для входов переменного размера

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

Предположим, что вам нужны размеры q, Omega, и delta в сгенерированном коде C, чтобы иметь следующие свойства:

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

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

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

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

  • На шаге «Определение типов ввода» укажите тестовый файл. myTest.m и щелкните Автоопределить типы ввода, как раньше. Тестовый файл вызывает функцию точки входа, 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*q- q входной аргумент

  • Omega- Omega входной аргумент

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

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

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

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