exponenta event banner

Спецификация типа ввода для создания кода

C/C + + и MATLAB ® по-разному обрабатывают переменные. Некоторые из этих различий, влияющих на поток операций создания кода:

  • Исходный код C/C + + включает объявления типов для всех переменных. Компилятор C/C + + использует эти объявления для определения типов всех переменных во время компиляции. Код MATLAB не включает явные объявления типов. Модуль выполнения MATLAB определяет типы переменных во время выполнения.

  • В C/C + + память для массивов может быть либо статически объявлена во время компиляции (массивы фиксированного размера), либо динамически выделена во время выполнения (массивы переменного размера). Все массивы MATLAB используют динамически выделяемую память и имеют переменный размер.

Для создания кода C/C + + с определенными типами необходимо указать свойства (класс, размер и сложность) всех входных переменных для функций точки входа MATLAB во время создания кода C/C + + или MEX. Функция точки входа - это функция MATLAB верхнего уровня, из которой создается код. Генератор кода использует эти входные свойства для определения свойств всех переменных в сгенерированном коде. Различные параметры типа ввода могут привести к тому, что один и тот же код MATLAB создаст различные версии сгенерированного кода.

При создании кода с помощью codegen , вы используете -args для указания типов ввода. При создании кода с помощью приложения MATLAB Coder™ типы ввода указываются на странице Определение типов ввода.

Чтобы увидеть, как спецификация типа ввода влияет на сгенерированный код, рассмотрим простую функцию 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около-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 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 в коде C 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 во время выполнения.

См. также

|

Связанные темы