MATLAB® Coder™ преобразовывает и оптимизирует динамически вводимый код MATLAB в статически вводимый код C/C + +. Статически типизированные языки требуют явного объявления типов переменных, и эти типы определяются во время компиляции. Некоторые изменения и оптимизации, выполненные генератором кода, позволяют использовать типы данных MATLAB и функции в сгенерированном коде. Для получения дополнительной информации о типах данных и функциях, поддерживаемых для генерации кода, смотрите Определения данных и Функции языка MATLAB, поддерживаемые для генерации кода C/C + +.
Эти изменения и оптимизация заставляют сгенерированный код выглядеть по-другому, чем код MATLAB. Сгенерированный код может не сопоставиться один в один с вашим кодом MATLAB из-за любого из следующих:
Примечание
В зависимости от вашего исходного кода эти случаи могут происходить несколько по-другому, чем то, как они показаны здесь.
MATLAB Coder генерирует автономный код C/C + + и код MEX из кода MATLAB. Одна функция в коде MATLAB может быть переведена в несколько функций в сгенерированном коде. Две или более функции в коде MATLAB могут также стать одним телом функции в сгенерированном коде. Этот процесс называется инкрустацией функции. По умолчанию генератор кода использует внутреннюю эвристику, чтобы определить, входить ли ваши функции в строку или нет. Для получения дополнительной информации смотрите coder.inline
и Control Inlining для точной настройки эффективности и читаемости сгенерированного кода.
Выходы функции MATLAB могут стать возвращаемыми значениями на C или могут стать входными входами pass-by-reference. Один скаляр выхода в коде MATLAB рассматривается как возврат значение в сгенерированном коде.
Функция addOne
имеет переменный вход x
и выходную переменную y
. В данном примере x
имеет тип double
.
function y = addOne(x) y = x + 1; end
Код, сгенерированный для фрагмента, показан здесь:
double addOne(double x) { return x + 1.0; }
Вход в функцию addOne
, x
, рассматривается как переменная pass-by-value в сгенерированном коде. Выход функции MATLAB возвращается по значению в сгенерированном коде.
Для массивов выходы могут передаваться по ссылкам. Фрагмент кода, показанный здесь, использует double
входной x
и выходной y
массива.
function y = addMat(x) z = [1:100]; y = z + x; end
Выходная переменная y
преобразуется в переменную массива pass-by-reference в сгенерированном коде, показанном здесь:
void addMat(double x, double y[100]) { int i; for (i = 0; i < 100; i++) { y[i] = ((double)i + 1.0) + x; } }
Для функций точки входа, которые имеют несколько выходных переменных, выходы могут быть переданы за ссылкой в сгенерированном коде. Этот фрагмент кода имеет два double
скалярные выходы, y
и z
, с double
скалярный входной x
.
function [z,y] = splitOne(x) y = x + 1; z = x + 2; end
Переменные выходы y
и z
преобразуются в переменные pass-by-reference в сгенерированном коде:
void splitOne(double x, double *z, double *y) { *y = x + 1.0; *z = x + 2.0; }
Для получения дополнительной информации о поведении передачи аргументов функций точки входа в сгенерированном коде, смотрите Развертывание Сгенерированного кода.
Постоянные значения в коде могут не сохраняться в сгенерированном коде. Эти значения могут быть удалены, чтобы оптимизировать сгенерированный код. Постоянное складывание удаляет расчеты, которые могли присутствовать в коде MATLAB, и заменяет расчеты на результат. Для получения дополнительной информации см. Раздел «Постоянное складывание».
Рассмотрим этот фрагмент кода:
function y = removeConst x = ones(10); y = x + 1; end
Генератор кода удаляет постоянную матрицу x
для сохранения памяти и присвоений в результате постоянного значения. Сгенерированный код выглядит как этот код:
void removeConst(double y[100]) { int i; for (i = 0; i < 100; i++) { y[i] = 2.0; } }
Неиспользованные входы или постоянные входы в функции, не являющиеся входными, в коде MATLAB удаляются из тел функций в сгенерированном коде.
Специализация функции генератором кода может изменить функцию на версию, где тип входа, размер, сложность или значение могут быть настроены для конкретного вызова функции. Это делается для создания эффективного кода С за счет дублирования кода. Для получения дополнительной информации смотрите Специализированные функции или Классы.
В предыдущем образце для доступа к матрице требуются дополнительные строки кода на C/C + +. A 10
-by- 10
матрица представлена как массив 100 double
элементы в сгенерированном коде. A for
цикл используется для доступа ко всем элементам массива в этом случае. C/C + + не поддерживают многие матричные операции, поэтому генератор кода преобразует матрицы и операции над матрицами в массивы и такие методы, как for
циклы для доступа к этим массивам.
Сгенерированный код может использовать стандартные библиотеки C для выполнения математических операций или других функций в коде MATLAB. Список поддерживаемых языковых функций см. в разделе Функции языка MATLAB, поддерживаемые для генерации кода C/C + +.
Для генерации кода массив может быть фиксированного размера или переменного размера. Массивы переменного размера могут появиться в разных форматах сгенерированного кода. Код может быть сгенерирован для массива фиксированного размера, если генератор кода может определить размер массива. Генерация кода также действительна для массива фиксированного размера с верхней границей. Динамически выделенные массивы также генерируются в определенных случаях. Смотрите Генерацию кода для массивов переменного размера.
Генерация кода для массивов с фиксированным размером и переменным размером может привести к следующим объявлениям переменных в сгенерированном коде:
double x[10]; // Fixed-size array double y_data[20]; int y_size[2]; // y_data and y_size denote an upper-bounded array emxArrayReal_T *z; // Dynamically allocated array
Если ваш код MATLAB содержит локальные переменные, которые занимают много памяти, то в сгенерированном коде они могут быть объявлены как локальные переменные, статические локальные переменные или как переменные в struct
который передается в функцию точки входа в сгенерированном коде. Вы можете управлять этим преобразованием, управляя памятью, которая выделена для сгенерированного кода. См. Раздел «Использование пространства стека управления»
Чтобы реализовать массивы ячеек в сгенерированном коде, генератор кода может преобразовать их как struct
, статический массив или динамический массив. Для получения дополнительной информации смотрите Генерация кода для массивов ячеек.
Генератор кода может выдать две функции домашнего хозяйства, инициализировать и завершить, если они необходимы. Эти функции можно найти на вкладке Generated Code в отчете генерации кода. Функция initialize инициализирует состояние, в котором работают сгенерированные функции точки входа C/C + +. Функция terminate освобождает выделенную память и выполняет другие операции очистки. Для получения дополнительной информации смотрите Использование сгенерированных функций инициализации и завершения работы