exponenta event banner

Создание кода C в командной строке

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

Можно также создать код с помощью приложения Кодер MATLAB. Учебное пособие по этому рабочему процессу см. в разделе Создание кода C с помощью приложения кодера MATLAB.

Файлы учебных пособий

Копирование файлов учебного пособия из папки matlabroot\help\toolbox\coder\examples\euclidean в локальную рабочую папку. Здесь, matlabroot является папкой установки MATLAB, например, 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около-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))]);
  • Сценарии построения build_lib_fixed.m и build_lib_variable.m содержат команды для создания статических библиотек C из кода MATLAB, которые принимают входные данные фиксированного и переменного размера соответственно. Содержимое этих сценариев будет показано далее в учебном пособии при создании кода C.

Совет

Код можно создать из функций MATLAB с помощью кодера MATLAB. Создание кода из сценариев MATLAB не поддерживается.

Используйте тестовые сценарии, чтобы отделить этапы предварительной и последующей обработки от функции, реализующей основной алгоритм. Эта практика позволяет легко повторно использовать алгоритм. Создается код для функции MATLAB, реализующей основной алгоритм. Код для тестового сценария не создается.

Создание кода C для функции 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 для функций и функций, которые не поддерживаются для генерации кода.

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

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

  2. После объявления функции добавьте %#codegen директива:

    function [y,idx,distance] = euclidean(x,cb) %#codegen
    %#codegen директива предлагает анализатору кода определять предупреждения и ошибки, специфичные для генерации кода.

    Индикатор сообщения Code Analyzer становится красным, что указывает на наличие проблем с генерацией кода.

  3. Для просмотра предупреждающих сообщений переместите курсор на подчеркнутые фрагменты кода. Предупреждения указывают на то, что для создания кода требуются переменные 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));

    Индикатор сообщения анализатора кода снова становится зеленым, что указывает на то, что он больше не обнаруживает проблем с генерацией кода.

    Дополнительные сведения об использовании анализатора кода см. в разделе Проверка кода на наличие ошибок и предупреждений.

  4. Сохраните файл.

  5. Для запуска инструмента готовности к генерации кода вызовите 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.

Проверка наличия проблем во время выполнения

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

Рекомендуется выполнить этот шаг, поскольку можно обнаружить и исправить ошибки времени выполнения, которые труднее диагностировать в сгенерированном коде C. По умолчанию функция MEX включает проверку целостности памяти. Эти проверки выполняют проверку границ массива и размеров. Проверки выявляют нарушения целостности памяти в коде, сгенерированном для функций MATLAB. Дополнительные сведения см. в разделе Контрольные проверки времени выполнения.

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

  1. Создание файла 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
    Эти выходные данные соответствуют выходным данным, сгенерированным исходной функцией MATLAB, и проверяют функцию MEX. Теперь вы готовы создать автономный код C для euclidean.

Примечание

Перед созданием автономного кода C/C + + из кода MATLAB создайте функцию MEX. Запустите созданную функцию MEX и убедитесь, что она имеет то же поведение во время выполнения, что и функция MATLAB. Если сгенерированная функция MEX дает ответы, отличные от MATLAB, или создает ошибку, необходимо устранить эти проблемы, прежде чем переходить к автономному созданию кода. В противном случае создаваемый автономный код может быть ненадежным и иметь неопределенное поведение.

Создать код C

Сценарий построения 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 в код C.

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

  • -config:lib опция инструктирует codegen создание статической библиотеки C вместо создания функции MEX по умолчанию.

  • -args опция инструктирует codegen для создания кода для euclidean.m использование класса, размера и сложности входных параметров выборки x и cb.

Вместо создания статической библиотеки C можно создать функцию MEX или другие типы сборки C/C + +, используя подходящие опции с помощью codegen команда. Дополнительные сведения о различных параметрах генерации кода см. в разделе codegen.

  1. Запустите сценарий построения.

    MATLAB обрабатывает файл построения и выводит сообщение:

    Code generation successful: View report.
    Генератор кода создает автономную статическую библиотеку C euclidean в work\codegen\lib\euclidean. Здесь, work - папка, содержащая файлы учебного пособия.

  2. Чтобы просмотреть отчет о создании кода в средстве просмотра отчетов, щелкните Просмотр отчета.

    Если генератор кода обнаруживает ошибки или предупреждения во время генерации кода, отчет описывает проблемы и предоставляет ссылки на проблемный код MATLAB. См. раздел Отчеты по созданию кода.

Совет

Используйте сценарий построения для создания кода в командной строке. Сценарий построения автоматизирует серию команд MATLAB, которые выполняются неоднократно в командной строке, экономя время и устраняя ошибки ввода.

Сравнение сгенерированного кода C с исходным кодом 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 + + (встроенный кодер).

Создать код C для входов переменного размера

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

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

  • Первое измерение обоих x и cb может варьироваться по размеру до 3.

  • Второе измерение x является фиксированным и имеет значение 1.

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

Чтобы задать эти входные свойства, используйте coder.typeof функция. coder.typeof(A,B,1) задает вход переменного размера с тем же классом и сложностью, что и A и верхние границы, заданные соответствующим элементом вектора размера 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

Использование основного примера C в приложении

Создание пакета файлов в сжатый файл

Код пакета для других сред разработки

Оптимизация скорости выполнения или использования памяти генерируемого кода

Стратегии оптимизации

Интеграция пользовательского кода C/C + + в созданный код

Код C/C + + вызова из кода MATLAB

Подробнее об отчете по созданию кода

Отчеты о создании кода

Интерактивная трассировка между кодом MATLAB и сгенерированным кодом C/C + + (встроенный кодер )

См. также

|