Можно использовать MATLAB® Coder™, чтобы сгенерировать MEX-функцию из кода MATLAB. MEX-функция является исполняемым файлом MATLAB. Это - сгенерированный код, который может быть назван из MATLAB. При работе в среде MATLAB используйте MEX-функции, чтобы ускорить в вычислительном отношении интенсивные фрагменты кода MATLAB. Сгенерируйте MEX-функцию из своего кода MATLAB при помощи приложения MATLAB Coder или при помощи codegen
в командной строке MATLAB.
В этом примере вы используете MATLAB Coder
команда codegen
, чтобы сгенерировать MEX-функцию для функции MATLAB. Вы сначала генерируете MEX-функцию, которая может принять только входные параметры, которые зафиксировали, предписанный размер. Вы затем генерируете другую MEX-функцию, которая может принять входные параметры многих различных размеров.
Скопируйте учебные файлы от папки
до локальной рабочей папки. Здесь, 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
, test_2d.m
, build_mex_fixed.m
и файлы build_mex_variable.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))]);
test_2d.m
скрипта MATLAB является модификацией test.m
для точек в двумерном Евклидово пространстве. Содержимое test_2d.m
показывают позже в примере, когда вы используете его, чтобы протестировать MEX-функцию на входные параметры переменного размера.
build_mex_fixed.m
скриптов сборки и build_mex_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 постоянно проверяет ваш код, когда вы вводите его. Это сообщает о проблемах и рекомендует модификациям максимизировать производительность и поддерживаемость. Инструмент Готовности Генерации кода экранирует код 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));
Индикатор сообщения Анализатора кода становится зеленым снова, указывая, что он больше не обнаруживает проблемы генерации кода.
Для получения дополнительной информации об использовании Анализатора кода смотрите Контрольный код для Ошибок и Предупреждений (MATLAB).
Сохраните файл.
Чтобы запустить Инструмент Готовности Генерации кода, вызовите функцию coder.screener
из командной строки MATLAB:
coder.screener('euclidean')
Инструмент не обнаруживает проблем генерации кода для euclidean
. Для получения дополнительной информации смотрите Инструмент Готовности Генерации кода.
Анализатор кода и Инструмент Готовности Генерации кода не могут обнаружить все проблемы генерации кода. После устранения ошибок или предупреждений, что эти инструменты обнаруживают, сгенерируйте код при помощи 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
.
build_mex_fixed.m
скрипта сборки содержит команды, которые вы используете, чтобы сгенерировать и подтвердить MEX-функцию для euclidean.m
. Чтобы подтвердить MEX-функцию, вы запускаете тестовый скрипт test
с вызовами функции MATLAB euclidean
, замененный вызовами сгенерированной MEX-функции.
% Load the test data load euclidean_data.mat % Generate code for euclidean.m with codegen. Use the test data as example input. Validate MEX by using test.m. codegen -report euclidean.m -args {x, cb} -test test
По умолчанию codegen
генерирует MEX-функцию под названием euclidean_mex
в текущей папке.
Опция -report
сообщает, что codegen
, чтобы сгенерировать генерацию кода сообщает, что можно использовать, чтобы отладить проблемы генерации кода и проверить, что код MATLAB подходит для генерации кода.
Опция -args
задает демонстрационные входные параметры к функции точки входа euclidean
. Генератор кода использует эту информацию, чтобы определить класс, размер и сложность входных параметров.
Вы используете опцию -test
, чтобы запустить тестовый файл test.m
. Эта опция заменяет вызовы euclidean
в тестовом файле с вызовами euclidean_mex
.
Для получения дополнительной информации об опциях генерации кода смотрите codegen
.
Запустите скрипт сборки build_mex_fixed.m
.
Генератор кода производит MEX-функцию euclidean_mex
в текущей рабочей папке.
Вывод:
Code generation successful: View report.
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
Чтобы просмотреть отчет генерации кода в Средстве просмотра Отчета, нажмите View report .
Если генератор кода обнаруживает ошибки или предупреждения во время генерации кода, отчет описывает проблемы и обеспечивает ссылки на проблематичный код MATLAB. См. Отчеты Генерации кода.
Используйте скрипт сборки, чтобы сгенерировать код в командной строке. Скрипт сборки автоматизирует серию команд MATLAB, которые вы неоднократно выполняете в командной строке, экономя вам время и устранение входных ошибок.
MEX-функция, которую вы сгенерировали для euclidean.m
, может принять только входные параметры, которые имеют тот же размер как демонстрационные входные параметры, которые вы задали во время генерации кода. Однако входные массивы к соответствующей функции MATLAB могут иметь любой размер. В этой части примера вы генерируете MEX-функцию от euclidean.m
, который принимает входные параметры переменного размера.
Предположим, что вы хотите, чтобы размерности x
и cb
в сгенерированной MEX-функции имели эти свойства:
Первая размерность и x
и cb
может отличаться по размеру до 3
.
Второе измерение x
фиксируется и имеет значение 1
.
Второе измерение cb
может отличаться по размеру до 216
.
Чтобы задать эти входные свойства, вы используете функцию coder.typeof
. coder.typeof(A,B,1)
задает вход переменного размера с тем же самым и сложностью как A
и верхние границы, данные соответствующим элементом вектора размера B
. Используйте скрипт сборки build_mex_variable.m
, который использует coder.typeof
, чтобы задать свойства входных параметров переменного размера в сгенерированной MEX-функции.
% 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 euclidean.m -args {eg_x,eg_cb}
Можно проверить, что новая MEX-функция euclidean_mex
принимает входные параметры размерностей, отличающихся от тех из x
и cb
. test_2d.m
тестового скрипта создает входные массивы x2d
и cb2d
, которые являются двумерными версиями x
и cb
, соответственно. Это затем вызывает функцию MATLAB euclidean
при помощи этих входных параметров.
% Load the test data load euclidean_data.mat % Create 2-D versions of x and cb x2d=x(1:2,:); cb2d=cb(1:2,1:6:216); % Determine closest and farthest points and corresponding distances [y_min,y_max,idx,distance] = euclidean(x2d,cb2d); % 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))]);
Выполнение test_2d.m
производит вывод:
Coordinates of the closest point are: 0.8 0.8 Index of the closest point is 29 Distance to the closest point is 0.078672 Coordinates of the farthest point are: 0 0 Index of the farthest point is 1 Distance to the farthest point is 1.1357
Чтобы запустить тестовый скрипт test_2d.m
с вызовами euclidean
, замененного вызовами euclidean_mex
, используйте coder.runTest
.
coder.runTest('test_2d','euclidean')
из x
и cb
.Цель | Больше информации |
---|---|
Узнайте о поддержке генерации кода встроенных функций MATLAB и функций тулбокса, классов и Системных объектов | Функции и Объекты, Поддержанные для Генерации кода C/C++ — Список Категорий Функции и Объекты, Поддержанные для Генерации кода C/C++ — Алфавитный список |
Оптимизируйте скорость выполнения или использование памяти сгенерированного кода | |
Узнайте об отчете генерации кода | |
Смотрите времена выполнения и покрытие кода для сгенерированных MEX-функций в профилировщике MATLAB |