exponenta event banner

Создание кода C с помощью приложения кодера MATLAB

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

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

Приложение MATLAB Coder не поддерживается в MATLAB Online™. Для создания кода C/C + + в MATLAB Online используйте codegen команда.

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

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

  • Файл данных 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 с помощью кодера 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 постоянно проверяет код при его вводе. Он сообщает о проблемах и рекомендует изменения для максимизации производительности и ремонтопригодности.

  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. Сохраните файл.

    Теперь вы готовы к компиляции кода с помощью приложения MATLAB Coder. Здесь компиляция относится к генерации кода C/C + + из кода MATLAB.

Примечание

Компиляция кода MATLAB относится к генерации кода C/C + + из кода MATLAB. В других контекстах термин компиляция может относиться к действию компилятора C/C + +.

Откройте приложение кодера MATLAB и выберите исходные файлы

  1. На вкладке Приложения панели инструментов MATLAB в разделе Создание кода щелкните значок приложения Кодер MATLAB. Приложение открывает страницу Выбор исходных файлов.

  2. На странице «Выбор исходных файлов» введите или выберите имя функции точки входа. euclidean. Функция точки входа - это функция MATLAB верхнего уровня, из которой создается код. Приложение создает проект с именем по умолчанию euclidean.prj в текущей папке.

  3. Нажмите кнопку Далее (Next), чтобы перейти к шагу Определить типы ввода (Define Input Types). Приложение запускает Code Analyzer (который уже был запущен на предыдущем шаге) и Code Generation Readity Tool в функции начальной точки. Инструмент готовности к генерации кода отображает код MATLAB для функций и функций, которые не поддерживаются для генерации кода. Если приложение выявляет проблемы, открывается страница «Проверка готовности к созданию кода», на которой можно просмотреть и устранить проблемы. В этом примере, поскольку приложение не обнаруживает проблем, открывается страница Определение типов ввода. Дополнительные сведения см. в разделе Средство готовности к созданию кода.

    Примечание

    Анализатор кода и средство готовности к созданию кода могут обнаружить не все проблемы с созданием кода. После устранения ошибок или предупреждений, обнаруженных этими двумя инструментами, создайте код с помощью кодера MATLAB, чтобы определить, имеет ли код MATLAB другие проблемы с соответствием требованиям.

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

Определение типов ввода

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

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

  • Укажите свойства непосредственно.

В этом примере для определения свойств входных данных x и cb, укажите тестовый файл test.m что генератор кода может использовать для автоматического определения типов:

  1. Введите или выберите тестовый файл test.m.

  2. Щелкните Автоопределить типы ввода (Autodefine Input Types).

    тестовый файл, test.m, вызывает функцию начальной точки, euclidean, с ожидаемыми типами ввода. Приложение определяет, что входные данные x является double(3x1) и вход cb является double(3x216).

  3. Нажмите кнопку Далее, чтобы перейти к шагу Проверка ошибок времени выполнения.

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

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

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

  1. Чтобы открыть диалоговое окно Проверка на наличие проблем во время выполнения, щелкните стрелку Проверка на наличие проблем.

  2. В диалоговом окне Check for Run-Time Issues укажите тестовый файл или введите код, вызывающий функцию начальной точки с примерами входных данных. Для этого примера используйте тестовый файл test который использовался для определения типов ввода.

  3. Щелкните Проверить наличие проблем.

    Приложение генерирует функцию MEX. Он запускает тестовый сценарий test замена вызовов euclidean с вызовами сгенерированного MEX. Если приложение обнаруживает проблемы во время создания или выполнения функции MEX, оно выдает предупреждения и сообщения об ошибках. Щелкните эти сообщения, чтобы перейти к проблемному коду и устранить проблему. В этом примере приложение не обнаруживает проблем.

  4. По умолчанию приложение собирает счетчики выполнения строк. Эти подсчеты помогают увидеть, насколько хорошо работает тестовый файл test.m осуществил euclidean функция. Чтобы просмотреть счетчики выполнения строк, щелкните Просмотр счетчиков выполнения строк MATLAB. Редактор приложения отображает строку с цветовым кодированием слева от кода. Чтобы расширить цветовую подсветку над кодом и увидеть количество выполнения строк, наведите курсор на строку.

    Определенный оттенок зеленого означает, что число выполнения строки для этого кода находится в определенном диапазоне. В этом случае for-loop выполняется 215 раз. Сведения о том, как интерпретировать счетчики выполнения строк и отключать набор счетчиков, см. в разделе Сбор и просмотр счетчиков выполнения строк для кода MATLAB.

  5. Нажмите кнопку Далее, чтобы перейти к шагу Создать код.

Примечание

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

Создать код C

  1. Чтобы открыть диалоговое окно «Генерировать», щелкните стрелку «Генерировать».

  2. В диалоговом окне «Создание» задайте для параметра «Тип построения» значение Static Library (.lib) и язык C. Используйте значения по умолчанию для других параметров конфигурации построения проекта.

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

  3. Щелкните Создать (Generate).

    Кодер MATLAB создает автономную статическую библиотеку C euclidean в work\codegen\lib\euclidean. work - папка, содержащая файлы учебного пособия. Приложение MATLAB Coder указывает, что создание кода выполнено успешно. Он отображает исходные файлы MATLAB и созданные выходные файлы в левой части страницы. На вкладке Переменные (Variables) отображается информация об исходных переменных MATLAB. На вкладке Target Build Log отображается журнал сборки, включая предупреждения и ошибки компилятора C/C + +. По умолчанию в окне кода приложение отображает файл исходного кода C ,euclidean.c. Чтобы просмотреть другой файл, на панели Исходный код (Source Code) или Выходные файлы (Output Files) щелкните имя файла.

  4. Щелкните Показать отчет (View Report), чтобы просмотреть отчет в средстве просмотра отчетов. Если генератор кода обнаруживает ошибки или предупреждения во время генерации кода, отчет описывает проблемы и предоставляет ссылки на проблемный код MATLAB. Дополнительные сведения см. в разделе Отчеты по созданию кода.

  5. Нажмите кнопку Далее, чтобы открыть страницу Завершить рабочий процесс.

Просмотр страницы «Завершение рабочего процесса»

Страница «Завершение рабочего процесса» показывает, что создание кода выполнено успешно. Он содержит сводку проекта и ссылки на сгенерированные выходные данные.

Сравнение сгенерированного кода 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.

Чтобы задать эти входные свойства:

  1. На шаге Define Input Types введите тестовый файл. test.m и щелкните Автоопределить типы ввода, как раньше. Тестовый файл вызывает функцию точки входа, euclidean.m, с ожидаемыми типами ввода. Приложение определяет, что входные данные x является double(3x1) и вход cb является double(3x216). Эти типы определяют входные данные фиксированного размера.

  2. Щелкните спецификации типов ввода и отредактируйте их. Можно указать переменный размер вплоть до указанного предела с помощью : префикс. Например, :3 подразумевает, что соответствующий размер может изменяться в размере до 3. Изменение типов на double(:3 x 1) для x и double(:3 x :216) для 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 + + (встроенный кодер )