Введите спецификацию типа для генерации кода

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}
    Сгенерированный исходный файл C 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}
    Сгенерированный исходный файл C 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}
    Подпись сгенерированной функции C:

    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 во время выполнения.

Смотрите также

|

Похожие темы