В этом руководстве вы используете MATLAB® Coder™
codegen
команда для генерации статической библиотеки C для функции MATLAB. Сначала вы генерируете код С, который может принимать только входы с фиксированным предварительно присвоенным размером. Затем вы генерируете код С, который может принимать входы многих различных размеров.
Можно также сгенерировать код с помощью приложения MATLAB Coder. Для руководства по этому рабочему процессу смотрите Сгенерируйте код C при помощи приложения MATLAB Coder.
Скопируйте файлы учебника из папки
в локальную рабочую папку. Здесь, 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
, build_lib_fixed.m
, и build_lib_variable.m
файлы.
Файл данных MATLAB euclidean_data.mat
содержит две части данных: одну точку в трехмерном евклидовом пространстве и набор нескольких других точек в трехмерном евклидовом пространстве. Более конкретно:
x
является 3
-by- 1
Вектор-столбец, который представляет точку в трехмерном евклидовом пространстве.
cb
является 3
-by- 216
массив. Каждый столбец в cb
представляет точку в трехмерном евклидовом пространстве.
Файл MATLAB euclidean.m
содержит функцию 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
Скрипт MATLAB test.m
загружает файл данных 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))]);
Скрипты сборки build_lib_fixed.m
и build_lib_variable.m
содержат команды для генерации статических библиотек C из кода MATLAB, которые принимают входы фиксированного размера и переменного размера, соответственно. Содержимое этих скриптов показано позже в руководстве, когда вы генерируете код С
Совет
Можно сгенерировать код из функций 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 подходящим для генерации кода, вы используете анализатор кода и инструмент подготовки генерации кода. Анализатор кода в редакторе MATLAB постоянно проверяет ваш код при его вводе. Он сообщает о проблемах и рекомендует изменения для максимизации эффективности и поддерживаемости. Code Generation Readiness Tool отображает код MATLAB для функций и функций, которые не поддерживаются для генерации кода.
Определенные встроенные функции MATLAB и функции тулбокса, классы и системные объекты, поддерживаемые для генерации кода C/C + +, имеют определенные ограничения на генерацию кода. Эти ограничения и связанные с ними указания по применению перечислены в Extended Capabilities разделах соответствующих страниц с описанием. Для получения дополнительной информации смотрите Функции и Объекты, Поддерживаемые для Генерации кода C/C + +.
Откройте 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));
Индикатор сообщения анализатора кода снова становится зеленым, что указывает на то, что он не обнаруживает больше проблем генерации кода.
Дополнительные сведения об использовании анализатора кода см. в разделе Проверка кода на ошибки и предупреждения.
Сохраните файл.
Чтобы запустить Генерацию кода Инструмента готовности, вызовите coder.screener
функцию из командной строки MATLAB.
coder.screener('euclidean')
Инструмент не обнаруживает проблем генерации кода для euclidean
. Для получения дополнительной информации смотрите Генерация Кода Readiness Tool.
Инструмент готовности генерации кода не поддерживается в Online™ MATLAB.
Примечание
Анализатор кода и инструмент подготовки генерации кода могут обнаружить не все проблемы генерации кода. После устранения ошибок или предупреждений, которые эти инструменты обнаруживают, сгенерируйте код с помощью MATLAB Coder, чтобы определить, имеет ли ваш код MATLAB другие проблемы с податливостью.
Теперь вы готовы скомпилировать код с помощью приложения MATLAB Coder. Здесь compilation относится к генерации кода C/C + + из вашего кода MATLAB.
Примечание
Компиляция кода MATLAB относится к генерации кода C/C + + из кода MATLAB. В других контекстах термин компиляция может означать действие компилятора C/C + +.
Поскольку C использует статическое типирование, генератор кода должен определить класс, размер и сложность всех переменных в файлах MATLAB во время генерации кода, также известного как время компиляции. Поэтому, когда вы генерируете код для файлов, необходимо задать свойства всех входных параметров в функции точки входа. entry-point function является функцией MATLAB верхнего уровня, из которой вы генерируете код.
Когда вы генерируете код при помощи codegen
команда, используйте -args
опция для задания выборочных входных параметров для функций точки входа. Генератор кода использует эту информацию, чтобы определить свойства входных параметров.
На следующем шаге вы используете codegen
команда, чтобы сгенерировать файл MEX из функции точки входа euclidean
.
Вы генерируете MEX-функцию из функции точки входа. Существует MEX-функция сгенерированного кода, который можно вызвать из MATLAB. Вы запускаете MEX-функцию и проверяете, имеют ли сгенерированная MEX-функция и исходная функция MATLAB одинаковую функциональность.
Это лучшая практика выполнить этот шаг, потому что вы можете обнаружить и исправить ошибки времени выполнения, которые труднее диагностировать в сгенерированном коде C. По умолчанию MEX-функция включает проверку целостности памяти. Эти проверки выполняют ограничения массивов и проверку размерностей. Проверки обнаруживают нарушения целостности памяти в коде, сгенерированном для функций MATLAB. Для получения дополнительной информации см. раздел Проверки во время выполнения системы управления.
Чтобы преобразовать код MATLAB в эффективный исходный код C/C + +, генератор кода вводит оптимизации, которые в определенных ситуациях заставляют сгенерированный код вести себя по-другому, чем исходный исходный код. Смотрите Различия между сгенерированным кодом и кодом MATLAB.
Сгенерируйте файл MEX для euclidean.m
при помощи codegen
команда. Чтобы проверить MEX-функцию, запустите тестовый скрипт test
с вызовами функции MATLAB euclidean
заменяется вызовами сгенерированной MEX-функции.
codegen euclidean.m -args {x,cb} -test test
По умолчанию codegen
генерирует MEX-функцию с именем euclidean_mex
в текущей папке.
Вы используете -args
опция для задания выборочных входных параметров в функцию точки входа euclidean
. Генератор кода использует эту информацию, чтобы определить свойства входных параметров.
Вы используете -test
опция запуска тестового файла test.m
. Эта опция заменяет вызовы на euclidean
в тестовом файле с вызовами для euclidean_mex
.
Выходные выходы:
Running test file: 'test' with MEX function 'euclidean_mex'. 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
euclidean
.
Примечание
Перед генерацией автономного кода C/C + + из кода MATLAB сгенерируйте MEX-функцию. Запустите сгенерированную MEX-функцию и убедитесь, что она имеет то же поведение во время выполнения, что и ваша функция MATLAB. Если сгенерированная MEX-функция создает ответы, отличные от MATLAB, или вызывает ошибку, необходимо исправить эти проблемы, прежде чем переходить к автономной генерации кода. В противном случае автономный код, который вы генерируете, может оказаться ненадежным и иметь неопределенное поведение.
Скрипт сборки build_lib_fixed.m
содержит команды, которые вы используете для генерации кода для euclidean.m
.
% Load the test data load euclidean_data.mat % Generate code for euclidean.m with codegen. Use the test data as example input. codegen -report -config:lib euclidean.m -args {x, cb}
codegen
читает файл euclidean.m
и переводит код MATLAB в код С
The -report
инструкции по опциям codegen
чтобы сгенерировать отчет генерации кода, который можно использовать для отладки проблем генерации кода и проверить, что ваш код MATLAB подходит для генерации кода.
The -config:lib
инструкции по опциям codegen
чтобы сгенерировать статическую библиотеку C вместо генерации MEX-функции по умолчанию.
The -args
инструкции по опциям codegen
чтобы сгенерировать код для euclidean.m
использование класса, размера и сложности параметров выборки входа x
и cb
.
Вместо генерации статической библиотеки C можно выбрать генерацию MEX-функции или других типов сборки C/C + + с помощью подходящих опций с codegen
команда. Для получения дополнительной информации о различных опциях генерации кода см. codegen
.
Запустите скрипт сборки.
MATLAB обрабатывает файл сборки и выводит сообщение:
Code generation successful: View report.
euclidean
в work
\ codegen\lib\euclidean
. Здесь, work
- папка, содержащая ваши обучающие файлы.Чтобы просмотреть отчет генерации кода в средстве просмотра, нажмите View report .
Если генератор кода обнаруживает ошибки или предупреждения во время генерации кода, отчет описывает проблемы и предоставляет ссылки на проблемный код MATLAB. См. «Отчеты генерации кода».
Совет
Используйте скрипт сборки, чтобы сгенерировать код в командной строке. Скрипт сборки автоматизирует серию команд MATLAB, которые вы неоднократно выполняете в командной строке, экономя время и устраняя входные ошибки.
Чтобы сравнить ваш сгенерированный код 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
.
Чтобы задать эти входные свойства, используйте coder.typeof
функция. coder.typeof(A,B,1)
задает вход переменного размера с тем же классом и сложностью, что и A
и верхние границы, заданные соответствующим элементом вектора size B
. Используйте скрипт сборки build_lib_variable.m
который использует coder.typeof
для задания свойств входов переменного размера в сгенерированной библиотеке C.
% Load the test data load euclidean_data.mat % Use coder.typeof to specify variable-size inputs eg_x=coder.typeof(x,[3 1],1); eg_cb=coder.typeof(cb,[3 216],1); % Generate code for euclidean.m using coder.typeof to specify % upper bounds for the example inputs codegen -report -config:lib euclidean.m -args {eg_x,eg_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 + + в сгенерированный код | |
Узнайте об отчете генерации кода | Интерактивная трассировка между кодом MATLAB и сгенерированным кодом C/C + + (Embedded Coder ) |