C/C + + и MATLAB® указатели по-разному. Некоторые из этих различий, которые влияют на рабочий процесс генерации кода:
Исходный код C/C + + включает объявления типов для всех переменных. Компилятор C/C + + использует эти объявления, чтобы определить типы всех переменных во время компиляции. Код MATLAB не содержит явных объявлений типов. Механизм выполнения MATLAB определяет типы переменных во время исполнения.
В C/C + + память для массивов может быть либо статически объявлена во время компиляции (массивы фиксированного размера), либо динамически выделена во время выполнения (массивы переменного размера). Все массивы MATLAB используют динамически выделенную память и имеют переменный размер.
Чтобы разрешить генерацию кода C/C + + с определенными типами, необходимо задать свойства (класс, размер и сложность) всех входных переменных в функции точки входа MATLAB во время генерации кода C/C + + или MEX. entry-point function является функцией MATLAB верхнего уровня, из которой вы генерируете код. Генератор кода использует эти входные свойства, чтобы определить свойства всех переменных в сгенерированном коде. Различные спецификации входного типа могут привести к тому, что один и тот же код MATLAB производит различные версии сгенерированного кода.
Если вы генерируете код при помощи codegen
команда, вы используете -args
опция для определения типов входа. Если вы генерируете код с помощью приложения MATLAB Coder™, вы задаете типы входа на странице Define Input Types.
Чтобы увидеть, как спецификация входного типа влияет на сгенерированный код, рассмотрите простую функцию MATLAB myMultiply
который умножает две величины a
и b
и возвращает значение продукта.
function y = myMultiply(a,b) y = a*b; end
Сгенерируйте статический код библиотеки C для трех различных спецификаций типов для входных параметров a
и b
. В каждом случае проверьте сгенерированный код.
Задайте a
и b
как действительные двойные скаляры. Чтобы сгенерировать код для этих входов, запустите следующие команды:
a = 1; codegen -config:lib myMultiply -args {a,a}
myMultiply.c
содержит функцию C:double myMultiply(double a, double b) { return a * b; }
Задайте a
и b
как действительный двойной 5
-by- 5
матрицы. Чтобы сгенерировать код для этих входов, запустите следующие команды:
a = zeros(5,5); codegen -config:lib myMultiply -args {a,a}
myMultiply.c
содержит функцию C:void myMultiply(const double a[25], const double b[25], double y[25]) { int i; int i1; double d; int i2; for (i = 0; i < 5; i++) { for (i1 = 0; i1 < 5; i1++) { d = 0.0; for (i2 = 0; i2 < 5; i2++) { d += a[i + 5 * i2] * b[i2 + 5 * i1]; } y[i + 5 * i1] = d; } } }
const double a[25]
и const double b[25]
соответствуют входам a
и b
в коде MATLAB. Размер одномерных массивов a
и b
в коде С 25
, что равно общему количеству элементов в примерах входных массивов, которые вы использовали при вызове codegen
функция.Функция C имеет еще один аргумент: одномерный массив y
размера 25
. Он использует этот массив, чтобы вернуть выход функции.
Можно также сгенерировать код, который имеет те же измерения массива, что и код MATLAB. См. «Генерация кода, который использует N-мерное индексирование».
Наконец, вы генерируете код для myMultiply
который может принимать входные массивы разных размеров. Чтобы задать входы переменного размера, можно использовать coder.typeof
функция. coder.typeof(A,B,1)
задает вход переменного размера с тем же классом и сложностью, что и A
и верхние границы, заданные соответствующим элементом вектора size B
.
Задайте a
и b
как действительные двойные массивы переменного размера с максимальным размером 10
по любой размерности. Чтобы сгенерировать код, запустите следующие команды:
a = coder.typeof(1,[10 10],1); codegen -config:lib myMultiply -args {a,a}
void myMultiply(const double a_data[], const int a_size[2], const double b_data[], const int b_size[2], double y_data[], int y_size[2])
a_data
, b_data
, и y_data
соответствуют входным параметрам x
и b
и выходной аргумент y
в исходной функции MATLAB. Функция C теперь принимает три дополнительных аргумента, a_size
, b_size
, и y_size
, которые определяют размеры a_data
, b_data
, и y_data
во время исполнения.