В этом примере вы используете приложение MATLAB® Coder™, чтобы сгенерировать статическую библиотеку C для функции MATLAB. Вы сначала генерируете код С, который может принять только входные параметры, которые зафиксировали предписанный размер. Вы затем генерируете код С, который может принять входные параметры многих различных размеров.
Можно также сгенерировать код в командной строке MATLAB при помощи команды codegen
. Для примера на этом рабочем процессе смотрите, Генерируют код С в Командной строке.
Скопируйте учебные файлы от папки
до локальной рабочей папки. Здесь, matlabroot\help\toolbox\coder\examples\euclidean
является папкой установки MATLAB, например, matlabroot
C:\Program Files\MATLAB\R2019a
. Чтобы скопировать эти файлы в вашу текущую папку, запустите эту команду MATLAB:
copyfile(fullfile(matlabroot,'help','toolbox','coder','examples','euclidean'))
euclidean_data.mat
, euclidean.m
и файлы test.m
.
Файл данных MATLAB euclidean_data.mat
содержит две части данных: одна точка в 3D Евклидово пространстве и наборе нескольких других точек в 3D Евклидово пространстве. Более в частности:
x
является 3
-by-1
вектор-столбец, который представляет точку в 3D Евклидово пространстве.
cb
является 3
-by-216
массив. Каждый столбец в cb
представляет точку в 3D Евклидово пространстве.
euclidean.m
файла MATLAB содержит функциональный euclidean
, который реализует основной алгоритм в этом примере. Функция берет x
и cb
как входные параметры. Это вычисляет Евклидово расстояние между x
и каждой точкой в cb
и возвращает эти количества:
y_min
вектор-столбца, который равен столбцу в cb
, который представляет точку, которая является самой близкой к x
.
y_max
вектор-столбца, который равен столбцу в cb
, который представляет точку, которая является самой дальней от x
.
2-мерный векторный idx
, который содержит индексы столбца векторов y_min
и y_max
в cb
.
2-мерный векторный distance
, который содержит расчетные наименьшие и самые большие расстояния до x
.
function [y_min,y_max,idx,distance] = euclidean(x,cb) % Initialize minimum distance as distance to first element of cb % Initialize maximum distance as distance to first element of cb idx(1)=1; idx(2)=1; distance(1)=norm(x-cb(:,1)); distance(2)=norm(x-cb(:,1)); % Find the vector in cb with minimum distance to x % Find the vector in cb with maximum distance to x for index=2:size(cb,2) d=norm(x-cb(:,index)); if d < distance(1) distance(1)=d; idx(1)=index; end if d > distance(2) distance(2)=d; idx(2)=index; end end % Output the minimum and maximum distance vectors y_min=cb(:,idx(1)); y_max=cb(:,idx(2)); end
test.m
скрипта MATLAB загружает файл данных euclidean_data.mat
в рабочую область. Это затем вызывает функциональный euclidean
, чтобы вычислить y_min
, y_max
, idx
и distance
. Скрипт затем отображает расчетные количества в командной строке.
Загрузка euclidean_data.mat
является шагом предварительной обработки, который выполняется прежде, чем вызвать основной алгоритм. Отображение результатов является шагом последующей обработки.
% Load test data load euclidean_data.mat % Determine closest and farthest points and corresponding distances [y_min,y_max,idx,distance] = euclidean(x,cb); % Display output for the closest point disp('Coordinates of the closest point are: '); disp(num2str(y_min')); disp(['Index of the closest point is ', num2str(idx(1))]); disp(['Distance to the closest point is ', num2str(distance(1))]); disp(newline); % Display output for the farthest point disp('Coordinates of the farthest point are: '); disp(num2str(y_max')); disp(['Index of the farthest point is ', num2str(idx(2))]); disp(['Distance to the farthest point is ', num2str(distance(2))]);
Можно сгенерировать код от функций MATLAB при помощи MATLAB Coder. Генерация кода из скриптов MATLAB не поддержана.
Используйте тестовые скрипты, чтобы отделиться пред - и шаги последующей обработки от функции, реализующей основной алгоритм. Эта практика позволяет вам легко снова использовать свой алгоритм. Вы генерируете код для функции MATLAB, которая реализует основной алгоритм. Вы не генерируете код для тестового скрипта.
Запустите тестовый скрипт test.m
в MATLAB. Вывод отображает y
, idx
и distance
.
Coordinates of the closest point are: 0.8 0.8 0.4 Index of the closest point is 171 Distance to the closest point is 0.080374 Coordinates of the farthest point are: 0 0 1 Index of the farthest point is 6 Distance to the farthest point is 1.2923
Анализатор кода в редакторе MATLAB постоянно проверяет ваш код, когда вы вводите его. Это сообщает о проблемах и рекомендует модификациям максимизировать производительность и поддерживаемость.
Откройте euclidean.m
в редакторе MATLAB. Индикатор сообщения Анализатора кода в правом верхнем углу редактора MATLAB является зеленым. Анализатор не обнаружил ошибки, предупреждения или возможности для улучшения кода.
После объявления функции добавьте директиву %#codegen
:
function [y,idx,distance] = euclidean(x,cb) %#codegen
%#codegen
запрашивает Анализатор кода идентифицировать предупреждения и ошибки, характерные для генерации кода.Индикатор сообщения Анализатора кода становится красным, указывая, что он обнаружил проблемы генерации кода.
Чтобы просмотреть предупреждающие сообщения, переместите свой курсор в подчеркнутые фрагменты кода. Предупреждения указывают, что генерация кода требует, чтобы переменные idx
и distance
были полностью заданы прежде, чем преобразовать их в нижний индекс. Эти предупреждения появляются, потому что генератор кода должен определить размеры этих переменных в их первом выступлении в коде. Чтобы устранить эту проблему, используйте функцию ones
, чтобы одновременно выделить и инициализировать эти массивы.
% Initialize minimum distance as distance to first element of cb % Initialize maximum distance as distance to first element of cb idx = ones(1,2); distance = ones(1,2)*norm(x-cb(:,1));
Индикатор сообщения Анализатора кода становится зеленым снова, указывая, что он больше не обнаруживает проблемы генерации кода.
Для получения дополнительной информации об использовании Анализатора кода смотрите Контрольный код для Ошибок и Предупреждений (MATLAB).
Сохраните файл.
Вы теперь готовы скомпилировать свой код при помощи приложения MATLAB Coder. Здесь, compilation относится к генерации кода C/C++ из вашего кода MATLAB.
Компиляция кода MATLAB относится к генерации кода C/C++ из кода MATLAB. В других контекстах термин компиляция мог отнестись к действию компилятора C/C++.
На вкладке Apps панели инструментов MATLAB, под Code Generation, кликают по значку приложения MATLAB Coder. Приложение открывает страницу Select Source Files.
На странице Select Source Files введите или выберите имя функции точки входа euclidean
. entry-point function является функция MATLAB верхнего уровня, от которой вы генерируете код. Приложение создает проект с именем по умолчанию euclidean.prj
в текущей папке.
Нажмите Next, чтобы перейти к шагу Define Input Types. Выполнение приложения Анализатор кода (что вы уже запустились на предыдущем шаге), и Инструмент Готовности Генерации кода на функции точки входа. Инструмент Готовности Генерации кода экранирует код MATLAB на функции и функции, которые не поддерживаются для генерации кода. Если приложение идентифицирует проблемы, оно открывает страницу Review Code Generation Readiness, где можно рассмотреть и устранить проблемы. В этом примере, потому что приложение не обнаруживает проблемы, оно открывает страницу Define Input Types. Для получения дополнительной информации смотрите Инструмент Готовности Генерации кода.
Анализатор кода и Инструмент Готовности Генерации кода не могут обнаружить все проблемы генерации кода. После устранения ошибок или предупреждений, что эти два инструмента обнаруживают, сгенерируйте код с MATLAB Coder, чтобы определить, имеет ли ваш код MATLAB другие проблемы соответствия.
Определенные встроенные функции MATLAB и функции тулбокса, классы и Системные объекты, которые поддерживаются для генерации кода C/C++, имеют определенные ограничения генерации кода. Эти ограничения и связанные указания по применению перечислены в разделах Extended Capabilities их соответствующих страниц с описанием. Для получения дополнительной информации смотрите Функции и Объекты, Поддержанные для Генерации кода C/C++ — Список Категорий.
Поскольку C использует статический контроль типов, генератор кода должен определить класс, размер и сложность всех переменных в файлах MATLAB во время генерации кода, также известное как время компиляции. Поэтому необходимо задать свойства всех входных параметров функции точки входа. Чтобы задать входные свойства, вы можете:
Дайте приложению команду автоматически определять входные свойства путем обеспечения скрипта, который вызывает функции точки входа с демонстрационными входными параметрами.
Задайте свойства непосредственно.
В этом примере, чтобы задать свойства входных параметров x
и cb
, задают тестовый файл test.m
, который генератор кода может использовать, чтобы задать типы автоматически:
Введите или выберите тестовый файл test.m
.
Нажмите Autodefine Input Types.
Тестовый файл, test.m
, вызывает функцию точки входа, euclidean
, с ожидаемыми входными типами. Приложение решает, что входом x
является double(3x1)
, и входом cb
является double(3x216)
.
Нажмите Next, чтобы перейти к шагу the Check for Run-Time Issues.
Шаг Check for Run-Time Issues генерирует файл MEX от ваших функций точки входа, запускает MEX-функцию и сообщает о проблемах. MEX-функция является сгенерированным кодом, который может быть назван из MATLAB. Это - лучшая практика выполнить этот шаг, потому что можно обнаружить и зафиксировать ошибки времени выполнения, которые более трудно диагностировать в сгенерированном коде C. По умолчанию MEX-функция включает проверки целостности памяти. Эти проверки выполняют границы массивов и проверку размерности. Проверки обнаруживают нарушения целостности памяти в коде, сгенерированном для функций MATLAB. Для получения дополнительной информации смотрите Проверки на этапе выполнения Управления.
Чтобы преобразовать код MATLAB в эффективный исходный код C/C++, генератор кода вводит оптимизацию, которая, в определенных ситуациях, заставляет сгенерированный код вести себя по-другому, чем код первоисточника. Смотрите Различия Между Сгенерированным кодом и кодом MATLAB.
Чтобы открыть диалоговое окно Check for Run-Time Issues, кликните по стрелке Check for Issues.
В диалоговом окне Check for Run-Time Issues задайте тестовый файл или введите код, который вызывает функцию точки входа с входными параметрами в качестве примера. В данном примере используйте тестовый файл test
, что вы раньше задавали входные типы.
Нажмите Check for Issues.
Приложение генерирует MEX-функцию. Это запускает тестовый скрипт test
, заменяющий вызовы euclidean
с вызовами сгенерированного MEX. Если приложение обнаруживает проблемы во время генерации MEX-функции или выполнения, это предоставляет предупреждающие сообщения и сообщения об ошибке. Кликните по этим сообщениям, чтобы перейти к проблематичному коду и устранить проблему. В этом примере приложение не обнаруживает проблемы.
По умолчанию приложение собирает количества выполнения строки. Эти количества помогают вам, чтобы видеть, как хорошо тестовый файл test.m
осуществил функцию euclidean
. Чтобы просмотреть количества выполнения строки, нажмите View MATLAB line execution counts. Редактор приложения отображает панель, на которую наносят цветную маркировку, слева от кода. Чтобы расширить выделение цвета по коду и видеть количества выполнения строки, установите свой курсор на панель.
Конкретный оттенок зеленого цвета указывает, что выполнение строки значит этот код падения определенной области значений. В этом случае for
- цикл выполняется 215 раз. Для получения информации о том, как интерпретировать количества выполнения строки и выключить набор количеств, видит, Собираются и Счета Выполнения Строки Представления для Вашего кода MATLAB.
Нажмите Next, чтобы перейти к шагу Generate Code.
Чтобы открыть диалоговое окно Generate, кликните по стрелке Generate.
В диалоговом окне Generate, набор Build type к Static Library (.lib)
и Language к C. Используйте значения по умолчанию для других настроек конфигурации сборки проекта.
Вместо того, чтобы генерировать статическую библиотеку C, можно принять решение сгенерировать MEX-функцию или другие типы сборки C/C++. Различные настройки проекта доступны для MEX и типов сборки C/C++. Когда вы переключаетесь между MEX и генерацией кода C/C++, проверяете настройки, которые вы выбираете.
Нажмите Generate.
MATLAB Coder генерирует автономную статическую библиотеку euclidean
C в
. work\codegen\lib\euclidean
является папкой, которая содержит ваши учебные файлы. Приложение MATLAB Coder указывает на ту генерацию кода, за которой следуют. Это отображает исходные файлы MATLAB и сгенерированные выходные файлы на левой стороне страницы. На вкладке Variables это отображает информацию об исходных переменных MATLAB. На вкладке Target Build Log это отображает журнал сборки, включая предупреждения компилятора C/C++ и ошибки. По умолчанию, в окне кода, отображения приложения файл исходного кода C, work
euclidean.c
. Чтобы просмотреть различный файл, в Source Code или панели Output Files, кликают по имени файла.
Нажмите View Report, чтобы просмотреть отчет в Средстве просмотра Отчета. Если генератор кода обнаруживает ошибки или предупреждения во время генерации кода, отчет описывает проблемы и обеспечивает ссылки на проблематичный код MATLAB. Для получения дополнительной информации см. Отчеты Генерации кода.
Нажмите Next, чтобы открыть страницу Finish Workflow.
Страница Finish Workflow указывает на ту генерацию кода, за которой следуют. Это предоставляет сводные данные проекта и ссылки на сгенерированный вывод.
Чтобы сравнить ваш сгенерированный код C с оригинальным кодом MATLAB, откройте файл C, euclidean.c
и файл euclidean.m
в редакторе MATLAB.
Важная информация о сгенерированном коде C:
Функциональная подпись:
void euclidean(const double x[3], const double cb[648], double y_min[3], double y_max[3], double idx[2], double distance[2])
const double x[3]
соответствует входу x
в вашем коде MATLAB. Размером x
является 3
, который соответствует общему размеру (3 x 1) входа в качестве примера, который вы использовали когда вы сгенерированный код из вашего кода MATLAB.
const double cb[648]
соответствует входу cb
в вашем коде MATLAB. Размером cb
является 648
, который соответствует общему размеру (3 x 216) входа в качестве примера, который вы использовали когда вы сгенерированный код из вашего кода MATLAB. В этом случае сгенерированный код использует одномерный массив, чтобы представлять двумерный массив в коде MATLAB.
Сгенерированный код имеет четыре дополнительных входных параметра: массивы y_min
, y_max
, idx
и distance
. Эти массивы используются, чтобы возвратить выходные значения. Они соответствуют выходным аргументам y_min
, y_max
, idx
и distance
в оригинальном коде MATLAB.
Генератор кода сохраняет ваше имя функции и комментарии. Когда возможно, генератор кода сохраняет ваши имена переменных.
Если переменная в вашем коде MATLAB установлена в постоянное значение, это не появляется как переменная в сгенерированном коде C. Вместо этого сгенерированный код C содержит фактическое значение переменной.
С Embedded Coder® вы можете в интерактивном режиме проследить между кодом MATLAB и сгенерировали код C/C++. Смотрите В интерактивном режиме Трассировку Между кодом MATLAB и Сгенерированным Кодом C/C++ (Embedded Coder).
Функция C, которую вы сгенерировали для euclidean.m
, может принять только входные параметры, которые имеют тот же размер как демонстрационные входные параметры, которые вы задали во время генерации кода. Однако входные массивы к соответствующей функции MATLAB могут иметь любой размер. В этой части примера вы генерируете код С от euclidean.m
, который принимает входные параметры переменного размера.
Предположим, что вы хотите, чтобы размерности x
и cb
в сгенерированном коде C имели эти свойства:
Первая размерность и x
и cb
может отличаться по размеру до 3
.
Второе измерение x
фиксируется и имеет значение 1
.
Второе измерение cb
может отличаться по размеру до 216
.
Задавать эти входные свойства:
На шаге Define Input Types введите тестовый файл test.m
и нажмите Autodefine Input Types как прежде. Тестовый файл вызывает функцию точки входа, euclidean.m
, с ожидаемыми входными типами. Приложение решает, что входом x
является double(3x1)
, и входом cb
является double(3x216)
. Эти типы задают входные параметры фиксированного размера.
Кликните по входным спецификациям типа и отредактируйте их. Можно задать переменный размер, до заданного предела, при помощи префикса :
. Например, :3
подразумевает, что соответствующая размерность может отличаться по размеру до 3
. Измените типы на double(:3 x 1)
для x
и double(:3 x :216)
для cb
.
Можно теперь сгенерировать код путем выполнения тех же шагов как прежде. Функциональная подпись для сгенерированного кода C в euclidean.c
теперь читает:
void euclidean(const double x_data[], const int x_size[1], const double cb_data[], const int cb_size[2], double y_min_data[], int y_min_size[1], double y_max_data[], int y_max_size[1], double idx[2], double distance[2])
x_data
, cb_data
, y_min_data
и y_max_data
соответствуют входным параметрам x
и cb
и выходные аргументы y_min
и y_max
в исходной функции MATLAB. Функция C теперь принимает четыре дополнительных входных параметра x_size
, cb_size
, y_min_size
и y_max_size
, которые задают размеры x_data
, cb_data
, y_min_data
и y_max_data
во время выполнения.Цель | Больше информации |
---|---|
Узнайте о поддержке генерации кода встроенных функций MATLAB и функций тулбокса, классов и Системных объектов | Функции и Объекты, Поддержанные для Генерации кода C/C++ — Список Категорий Функции и Объекты, Поддержанные для Генерации кода C/C++ — Алфавитный список |
Сгенерируйте и измените пример C основная функция и используйте ее, чтобы создать исполняемую программу C | |
Пакет сгенерировал файлы в сжатый файл | |
Оптимизируйте скорость выполнения или использование памяти сгенерированного кода | |
Интегрируйте свой пользовательский код C/C++ в сгенерированный код | |
Узнайте об отчете генерации кода | В интерактивном режиме Проследите Между кодом MATLAB и Сгенерированным Кодом C/C++ (Embedded Coder) |