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