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

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

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

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

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

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

  • Главный массив столбца последователен со своими подматрицами компонента:

    • Главный столбцом 2D массив является простой конкатенацией 1D массивов.

    • Главный столбцом трехмерный массив является простой конкатенацией 2D массивов.

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

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

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

ДействиеРассмотреть
Сконфигурируйте размещение массивов модели для генерации кода.В диалоговом окне Configuration Parameters задайте Array layout (Simulink Coder) параметр как Column-major или Row-major.
Включите эффективные главные строкой алгоритмы для симуляции и генерации кода.В диалоговом окне Configuration Parameters включите Use algorithms optimized for row-major array layout (Simulink) параметр.
Интегрируйте внешние функции кода С в размещении главного массива строки со сгенерированным кодом.

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

  • SimStruct функционируют ssSetArrayLayoutForCodeGen.

  • Установка Array layout (Simulink) в блоке S-Function Builder.

  • Опция Legacy Code Tool convert2DMatrixToRowMajor в legacy_code. Используя convert2DMatrixToRowMajor влияет на эффективность кода.

Используйте блок C Caller, чтобы вызвать внешние функции C в Simulink. Задайте размещение массивов пользовательских функций C при помощи параметра конфигурации Default function array layout (Simulink).

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

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

Главное столбцом размещение

Например, 3х3 матрица в блоке Constant

    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 матрица в блоке Constant

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

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

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

Непрерывный

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

  • Интегратор

  • Integrator Limited

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

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

  • ПИД-регулятор

  • ПИД-регулятор (2DOF)

  • Пространство состояний

  • Передайте Fcn

  • Транспортная задержка

  • Переменная задержка

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

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

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

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

  • Уровень 2 S-функция MATLAB

  • Функция MATLAB

  • Matlab.system

Источники

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

Похожие темы