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

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 к Column-major или Row-major.
Включите эффективные упорядоченные по строкам алгоритмы для симуляции и генерации кода.Выберите параметр конфигурации модели 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).

Можно также использовать coder.ceval в блоке MATLAB Function. Смотрите Интерфейс с Упорядоченными по строкам Данными в блоке MATLAB function (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 для блоков Mux и других виртуальных блоков манипуляции сигнала. Например, сигналы активно не копируют свои входные параметры, только ссылки.

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

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

Непрерывный

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

  • Интегратор

  • Integrator Limited

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

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

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

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

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

  • Передайте Fcn

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

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

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

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

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

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

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

  • Matlab.system

Источники

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

Ограничения для упорядоченной по строкам генерации кода

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

Похожие темы