C/C++ и MATLAB® обрабатывают переменные по-другому. Некоторые из этих различий, которые влияют на рабочий процесс генерации кода:
Исходный код C/C++ включает описания типа для всех переменных. Компилятор C/C++ использует эти объявления, чтобы определить типы всех переменных во время компиляции. Код MATLAB не включает явные описания типа. Механизм выполнения MATLAB определяет типы переменных во время выполнения.
На C/C++ память для массивов может быть или статически объявлена во время компиляции (массивы фиксированного размера), или динамически выделена во время выполнения (массивы переменного размера). Все массивы MATLAB используют динамически выделенную память и имеют переменный размер.
Чтобы позволить генерацию кода C/C++ с определенными типами, необходимо задать свойства (класс, размер и сложность) всех входных переменных к функциям точки входа MATLAB во время генерации кода MEX или C/C++. 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 i0; int i1; double d0; int i2; for (i0 = 0; i0 < 5; i0++) { for (i1 = 0; i1 < 5; i1++) { d0 = 0.0; for (i2 = 0; i2 < 5; i2++) { d0 += a[i0 + 5 * i2] * b[i2 + 5 * i1]; } y[i0 + 5 * i1] = d0; } } }
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
и верхние границы, данные соответствующим элементом вектора размера 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
во время выполнения.