Для создания функции MEX из кода MATLAB можно использовать MATLAB ® Coder™. Функция MEX является исполняемым файлом MATLAB. Это генерируемый код, который может быть вызван изнутри MATLAB. Работая в среде MATLAB, используйте функции MEX для ускорения интенсивных вычислений в коде MATLAB. Создайте функцию MEX из кода MATLAB с помощью приложения MATLAB Coder или codegen в командной строке MATLAB.
В данном учебном пособии используется кодер MATLAB
codegen для создания функции MEX для функции MATLAB. Сначала создается функция MEX, которая может принимать только те входные данные, которые имеют фиксированный, предварительно назначенный размер. Затем создается другая функция MEX, которая может принимать входы различных размеров.
Копирование файлов учебного пособия из папки в локальную рабочую папку. Здесь, matlabroot\help\toolbox\coder\examples\euclidean является папкой установки MATLAB, например, matlabrootC:\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 содержит две части данных: одна точка в трёхмерном евклидовом пространстве и множество других точек в трёхмерном евклидовом пространстве. Более конкретно:
x является 3около-1 вектор столбца, представляющий точку в трехмерном евклидовом пространстве.
cb является 3около-216 массив. Каждый столбец в cb представляет точку в трехмерном евклидовом пространстве.
Файл MATLAB euclidean.m содержит функцию euclidean который реализует алгоритм ядра в этом примере. Функция принимает x и cb в качестве входных данных. Вычисляет евклидово расстояние между x и каждая точка в cb и возвращает эти величины:
Вектор столбца y_min, что равно столбцу в cb которая представляет точку, ближайшую к x.
Вектор столбца y_max, что равно столбцу в cb которая представляет точку, наиболее удаленную от x.
Двумерный вектор idx который содержит индексы столбцов векторов y_min и y_max в cb.
Двумерный вектор 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))]);
Сценарий MATLAB test_2d.m является модификацией test.m для точек в двумерном евклидовом пространстве. Содержание test_2d.m показаны ниже в учебном пособии при использовании его для тестирования функции MEX на входы переменного размера.
Сценарии построения build_mex_fixed.m и build_mex_variable.m содержат команды для создания статических библиотек C из кода MATLAB, которые принимают входные данные фиксированного и переменного размера соответственно. Содержимое этих сценариев будет показано далее в учебном пособии при создании кода C.
Совет
Код можно создать из функций MATLAB с помощью кодера MATLAB. Создание кода из сценариев 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 + +, имеют определенные ограничения по генерации кода. Эти ограничения и связанные примечания по использованию перечислены в разделах «Расширенные возможности» соответствующих справочных страниц. Дополнительные сведения см. в разделе Функции и объекты, поддерживаемые для генерации кода C/C + +.
Открытый euclidean.m в редакторе MATLAB. Индикатор сообщения Code Analyzer в правом верхнем углу редактора MATLAB имеет зеленый цвет. Анализатор не обнаружил ошибок, предупреждений или возможностей для улучшения кода.
После объявления функции добавьте %#codegen директива:
function [y,idx,distance] = euclidean(x,cb) %#codegen
%#codegen директива предлагает анализатору кода определять предупреждения и ошибки, специфичные для генерации кода.Индикатор сообщения Code Analyzer становится красным, что указывает на наличие проблем с генерацией кода.

Для просмотра предупреждающих сообщений переместите курсор на подчеркнутые фрагменты кода. Предупреждения указывают на то, что для создания кода требуются переменные 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. Дополнительные сведения см. в разделе Средство готовности к созданию кода.
Средство готовности к созданию кода не поддерживается в MATLAB Online™.
Примечание
Анализатор кода и средство готовности к созданию кода могут обнаружить не все проблемы с созданием кода. После устранения ошибок или предупреждений, обнаруженных этими инструментами, создайте код с помощью кодера MATLAB, чтобы определить, есть ли у кода MATLAB другие проблемы с соответствием требованиям.
Теперь вы готовы к компиляции кода с помощью приложения MATLAB Coder. Здесь компиляция относится к генерации кода C/C + + из кода MATLAB.
Примечание
Компиляция кода MATLAB относится к генерации кода C/C + + из кода MATLAB. В других контекстах термин компиляция может относиться к действию компилятора C/C + +.
Поскольку C использует статическую типизацию, генератор кода должен определить класс, размер и сложность всех переменных в файлах MATLAB во время генерации кода, также известное как время компиляции. Поэтому при создании кода для файлов необходимо указать свойства всех входных аргументов для функций точки входа. Функция точки входа - это функция 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Чтобы просмотреть отчет о создании кода в средстве просмотра отчетов, щелкните Просмотр отчета.
Если генератор кода обнаруживает ошибки или предупреждения во время генерации кода, отчет описывает проблемы и предоставляет ссылки на проблемный код 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++ MEX | |
Создание и редактирование типов ввода в интерактивном режиме | Создание и редактирование типов ввода с помощью редактора типов кодеров |
Оптимизация скорости выполнения или использования памяти генерируемого кода | |
Подробнее об отчете по созданию кода | |
Просмотр времени выполнения и покрытия кода для сгенерированных функций MEX в профилировщике MATLAB |