Сгенерируйте код С в командной строке

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

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

Учебные файлы

Скопируйте файлы учебника из папки 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-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, которая реализует основной алгоритм. Вы не генерируете код для тестового скрипта.

Сгенерируйте код С для функции 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 постоянно проверяет ваш код при его вводе. Он сообщает о проблемах и рекомендует изменения для максимизации эффективности и поддерживаемости. Code Generation Readiness Tool отображает код MATLAB для функций и функций, которые не поддерживаются для генерации кода.

Определенные встроенные функции MATLAB и функции тулбокса, классы и системные объекты, поддерживаемые для генерации кода C/C + +, имеют определенные ограничения на генерацию кода. Эти ограничения и связанные с ними указания по применению перечислены в Extended Capabilities разделах соответствующих страниц с описанием. Для получения дополнительной информации смотрите Функции и Объекты, Поддерживаемые для Генерации кода C/C + +.

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

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

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

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

  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. Для получения дополнительной информации смотрите Генерация Кода 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.

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

  1. Запустите скрипт сборки.

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

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

  2. Чтобы просмотреть отчет генерации кода в средстве просмотра, нажмите View report .

    Если генератор кода обнаруживает ошибки или предупреждения во время генерации кода, отчет описывает проблемы и предоставляет ссылки на проблемный код 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 + + (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 Main в приложении

Упаковать сгенерированные файлы в сжатый файл

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

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

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

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

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

Узнайте об отчете генерации кода

Отчеты генерации кода

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

См. также

|