exponenta event banner

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

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

Можно также сгенерировать код при помощи приложения MATLAB Coder. Для примера на этом рабочем процессе смотрите, Генерируют код С при помощи Приложения 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 содержит две части данных: одна точка в 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))]);
  • 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 постоянно проверяет ваш код, когда вы вводите его. Это сообщает о проблемах и рекомендует модификациям максимизировать производительность и поддерживаемость. Инструмент Готовности Генерации кода экранирует код MATLAB на функции и функции, которые не поддерживаются для генерации кода.

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

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

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

    function [y,idx,distance] = euclidean(x,cb) %#codegen
    Директива %#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));

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

    Для получения дополнительной информации об использовании Анализатора кода смотрите Контрольный код для Ошибок и Предупреждений (MATLAB).

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

  5. Чтобы запустить Инструмент Готовности Генерации кода, вызовите функцию 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.

Проверяйте на проблемы во время выполнения

Вы генерируете 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.

Сгенерируйте код С

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 в код С.

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

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

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

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

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

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

    Code generation successful: View report.
    Генератор кода производит автономную статическую библиотеку euclidean C в 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 и верхние границы, данные соответствующим элементом вектора размера 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++ (Embedded Coder)

Смотрите также

|