exponenta event banner

Генерация кода матриц и массивов

MATLAB ® хранит матричные данные и массивы (1-D, 2-D,...) в формате «основной столбец» в качестве вектора. Simulink ® и генератор кода могут хранить данные массива в формате «основной столбец» или «основная строка». Для массива, хранящегося в макете «основной столбец», элементы столбцов являются смежными в памяти. В макете основной строки элементы строк являются смежными. Макет массива также называется порядком, форматом и представлением. Порядок хранения элементов может иметь важное значение для интеграции, удобства использования и производительности. Определенные алгоритмы лучше работают с данными, хранящимися в определенном порядке.

Языки программирования и среды предполагают единую структуру массива для всех данных. MATLAB и Fortran по умолчанию используют компоновку «основной столбец», в то время как C и C++ используют компоновку «основная строка». С помощью Simulink Coder™ можно создать код C/C + +, использующий макет основной строки или макет основной строки.

Хранилище массива в памяти компьютера

Компьютерная память хранит данные в виде одномерных массивов. Например, при объявлении матрицы 3 на 3 программа сохраняет эту матрицу как одномерный массив с девятью элементами. По умолчанию MATLAB сохраняет эти элементы с макетом основного массива столбца. Элементы каждого столбца являются смежными в памяти.

Рассмотрим матрицу A:

A =
    1   2   3
    4   5   6
    7   8   9
A переводится в массив длиной 9 в следующем порядке:
A(1) = A(1,1) = 1; 
A(2) = A(2,1) = 4; 
A(3) = A(3,1) = 7; 
A(4) = A(1,2) = 2; 
A(5) = A(2,2) = 5;
и так далее.

В формате «основной столбец» доступ к следующему элементу массива в памяти осуществляется путем приращения первого индекса массива. Например, эти пары элементов последовательно сохраняются в памяти:

  • A(i) и A(i+1)

  • B(i,j) и B(i+1,j)

  • C(i,j,k) и C(i+1,j,k)

Матрица A представлен в памяти по умолчанию с такой компоновкой:

     1     4     7     2     5     8     3     6     9

В макете основного массива строк язык программирования хранит элементы строк непрерывно в памяти. В макете основной строки элементы массива хранятся как:

     1     2     3     4     5     6     7     8     9

N-мерные массивы можно хранить в формате «основной столбец» или «основная строка». В макете «основной столбец» элементы из первого (крайнего слева) измерения или индекса являются смежными в памяти. В макете основной строки элементы из последнего (крайнего правого) измерения или индекса являются смежными.

Дополнительные сведения о внутреннем представлении данных MATLAB см. в разделе Данные MATLAB.

Программное обеспечение для генерации кода по умолчанию использует основной формат столбца по нескольким причинам:

  • Мир обработки сигналов и массивов в основном состоит из основных столбцов: MATLAB, LAPack, Fortran90 и DSP библиотек.

  • Столбец эквивалентен каналу в обработке на основе кадра. В этом случае хранение данных по основным столбцам является более эффективным.

  • Массив «столбец-основной» самосогласован с подматрицами компонентов:

    • Массив 2-D с большим столбцом - это простая конкатенация 1-D массивов.

    • Массив 3-D с большим столбцом - это простая конкатенация 2-D массивов.

    • Шаг - это количество ячеек памяти для индексирования на следующий элемент в том же измерении. Шаг первого измерения - это один элемент. Шаг n-го размерного элемента является произведением размеров нижних размерностей.

    • Основные n-D массивы имеют шаг 1 для наивысшего измерения. Манипуляции с субматрицами обычно осуществляют доступ к разбросанному набору данных в памяти, что не позволяет эффективно индексировать.

C использует основной формат строки. MATLAB и Simulink по умолчанию используют основной формат столбца. Можно настроить программное обеспечение для создания кода с компоновкой основного массива строк. При интеграции внешнего кода C с сгенерированным кодом см. рекомендации, приведенные в этой таблице.

ДействиеРассмотреть
Настройте макет массива модели для создания кода.В диалоговом окне Параметры конфигурации (Configuration Parameters) задайте для параметра конфигурации модели Компоновка массива (Array layout) значение Column-major или Row-major.
Обеспечение эффективных основных алгоритмов строк для моделирования и генерации кода.Выберите параметр конфигурации модели Использовать алгоритмы, оптимизированные для компоновки основных массивов строк.
Интегрируйте внешние функции кода C в макет основного массива строк с сгенерированным кодом.

Создайте S-функции, интегрирующие функции внешнего кода с сгенерированным кодом с помощью:

  • Функция SimStruct ssSetArrayLayoutForCodeGen.

  • Параметр Set Array Layout в блоке S-Function Builder.

  • Параметр «Устаревший инструмент кода» convert2DMatrixToRowMajor в legacy_code. Используя convert2DMatrixToRowMajor воздействует на эффективность кода.

Блок C Caller используется для вызова внешних функций C в Simulink. Укажите макет массива пользовательских функций C с помощью параметра конфигурации модели Default function array layout.

Также можно использовать coder.ceval в функциональном блоке MATLAB. См. раздел Интерфейс с основными данными строк в функциональном блоке MATLAB.

Параметры матрицы генератора кода

Скомпилированный файл модели, model.rtw, представляет матрицы как векторы символов в синтаксисе MATLAB без подразумеваемого формата хранения. Этот формат позволяет копировать вектор символа из .rtw вставьте его в файл MATLAB и попросите MATLAB распознать его.

Основной макет столбца

Например, матрица 3 на 3 в блоке константы

    1   2   3
    4   5   6
    7   8   9
хранится в model.rtw как
Parameter {
      Identifier	      "Constant_Value"
      LogicalSrc	      P0
      Protected		      no
      Value		      [1.0, 4.0, 7.0, 2.0, 5.0, 8.0, 3.0, 6.0, 9.0]
      CGTypeIdx		      18
      ContainerCGTypeIdx      19
      ReferencedBy	      Matrix(1,4)
[[0, -1, 0, 0];]
      GraphicalRef	      Matrix(1,2)
[[0, 1];]
      BHMPrmIdx		      0
      GraphicalSource	      [0, 1]
      OwnerSysIdx	      [0, -1]
      VarGroupIdx	      [1, 0]
      WasAccessedAsVariable   1
    }

model_data.c объявляет фактическое хранилище для параметра матрицы. Можно видеть, что формат находится в основном формате столбца.

Parameters model_P = {
  /* Expression: [ [1,2,3] ; [4,5,6] ;[7,8,9]]
   * Referenced by: '<Root>/Constant  '
   */
  { 1.0, 4.0, 7.0, 2.0, 5.0, 8.0, 3.0, 6.0, 9.0 }
};

Макет основной строки

Например, матрица 3 на 3 в блоке константы

    1   2   3
    4   5   6
    7   8   9
хранится в model.rtw как
Parameter {
      Identifier	      "Constant_Value"
      LogicalSrc	      P0
      Protected		      no
      Value		      [1.0, 2.0, 3.0, 4.0, 5.0, 6.0, 7.0, 8.0, 9.0]
      CGTypeIdx		      18
      ContainerCGTypeIdx      19
      ReferencedBy	      Matrix(1,4)
[[0, -1, 0, 0];]
      GraphicalRef	      Matrix(1,2)
[[0, 1];]
      BHMPrmIdx		      0
      GraphicalSource	      [0, 1]
      OwnerSysIdx	      [0, -1]
      VarGroupIdx	      [1, 0]
      WasAccessedAsVariable   1
    }

model_data.h объявляет фактическое хранилище для параметра матрицы. Можно видеть, что формат находится в основном формате строки.

Parameters model_P = {
  /* Expression: [ [1,2,3] ; [4,5,6] ;[7,8,9]]
   * Referenced by: '<Root>/Constant  '
   */
  { 1.0, 2.0, 3.0, 4.0, 5.0, 6.0, 7.0, 8.0, 9.0 }
};

Внутреннее хранилище данных для массивов с комплексными номерами

Форматирование внутреннего хранилища данных Simulink и генератора кода отличается от форматирования внутреннего хранилища данных MATLAB только хранением массивов сложных чисел. В MATLAB реальная и мнимая части хранятся в отдельных массивах. В Simulink и генераторе кода детали хранятся в перемежающемся формате. Числа в памяти чередуются вещественные, мнимые, вещественные, мнимые и так далее. Это соглашение позволяет эффективно реализовывать небольшие сигналы на линиях Simulink, для блоков Mux и других виртуальных блоков манипулирования сигналами. Например, сигналы активно не копируют свои входы, только ссылки.

Неподдерживаемые блоки для генерации основного кода строки

Генератор кода не поддерживает эти блоки для генерации кода в макете основного массива строк.

Непрерывный

  • Производная

  • Интегратор

  • Интегратор Лимитед

  • Интегратор второго порядка

  • Интегратор, с ограниченной ответственностью второго порядка

  • PID-контроллер

  • PID-контроллер (2DOF)

  • Состояние - пространство

  • Перенос Fcn

  • Задержка транспортировки

  • Переменная задержка по времени

  • Переменная задержка транспортировки

  • Нулевой полюс

Пользовательские функции

  • Интерпретированная функция MATLAB

  • Level-2 S-функция MATLAB

  • Система MATLAB

Источники

  • Из электронной таблицы

Атрибуты сигнала

  • IC

Ограничения для генерации основного кода строки

  • Сигналы переменного размера не поддерживаются для генерации кода основной строки.

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