Сохранение размерности многомерных массивов

Сохранение размерности в сгенерированном коде

Генератор кода производит одномерные массивы в коде C/C++ для многомерных данных модели. Например, рассмотрите матричный matrixParam.

matrixParam = 
        1        2        3
        4        5        6
По умолчанию MATLAB® хранит данные в упорядоченном по столбцам формате. Генератор кода задает матричный matrixParam в сгенерированном коде как:
/* const_params.c */
matrixParam[6] = {1, 4, 2, 5, 3, 6};
Генератор кода инициализирует матричный matrixParam в сгенерированном коде как:
/* model.c */
extern const real_T matrixParam[6];

for(int i = 0; i < 6; i++) {
    ... = matrixParamValue[i];
}

Когда вы устанавливаете параметр конфигурации модели Array layout (Simulink Coder) к Row-major, можно сохранить размерности многомерных массивов в сгенерированном коде. Сохранение измерений массива в сгенерированном коде улучшает интеграцию с внешним кодом.

Например, в упорядоченном по строкам размещении массивов, генератор кода сохраняет измерения массива в определении типа в сгенерированном коде как:

/* const_params.c */
const real_T matrixParam[2][3] = {{1, 2, 3}, {4, 5, 6}};
Код для инициализации многомерных данных вкладывается как:
/* model.c */
extern const real_T matrixParam[2][3];

for(int i = 0; i < 2; i++) {
    for (int j = 0; j < 3; j++) {
         ... = matrixParam[i][j];
    }
}

Различие в сохранении размерности между MATLAB и C

Когда вы задаете многомерный массив в Окне Команды MATLAB, MATLAB хранит массив в упорядоченном по столбцам формате. Например:

>> matrixParam.Value = [1 2 3; 4 5 6];  % Data inilitialized in row-major

>> matrixParam.Value                    % Data displayed in row-major
ans =
     1     2     3
     4     5     6

>> matrixParam.Value(:)'                % Data stored in column-major
ans =
     1     4     2     5     3     6
Даже если данные инициализируются в упорядоченном по строкам формате в Окне Команды MATLAB, MATLAB сериализирует данные в памяти в упорядоченном по столбцам формате.

Когда генератор кода сохраняет размерности, сгенерированный код:

real_T matrixParam[2][3] = { { 1.0, 2.0, 3.0 }, { 4.0, 5.0, 6.0 } } ;
Для 2D массивов порядок индекса и определение данных сопоставимы с тем, что вы видите в Окне Команды MATLAB и сгенерированном коде.

Для n-D массивов, когда генератор кода производит упорядоченный по строкам код и сохраняет измерения массива, порядок индекса сопоставим с MATLAB. Определение данных n-D массивов в сгенерированном коде не сопоставимо с данными, отображенными в Окне Команды MATLAB. Например, рассмотрите тот matrixParam Simulink.Parameter:

>> matrixParam.Value = reshape(1:24,[4 3 2])      

>> matrixParam.Value                              
ans(:,:,1) =
     1     5     9
     2     6    10
     3     7    11
     4     8    12
ans(:,:,2) =
    13    17    21
    14    18    22
    15    19    23
    16    20    24

>> matrixParam.Value(:)'
ans =

  Columns 1 through 10

     1     2     3     4     5     6     7     8     9    10

  Columns 11 through 20

    11    12    13    14    15    16    17    18    19    20

  Columns 21 through 24

    21    22    23    24

В упорядоченном по строкам размещении массивов генератор кода сохраняет измерения массива во время определения типа в сгенерированном коде как:

/* const_params.c */
const real_T matrixParam[4][3][2] = { { { 1.0, 13.0 }, { 5.0, 17.0 }, { 9.0, 21.0 } },
  { { 2.0, 14.0 }, { 6.0, 18.0 }, { 10.0, 22.0 } }, { { 3.0, 15.0 }, { 7.0, 19.0
    }, { 11.0, 23.0 } }, { { 4.0, 16.0 }, { 8.0, 20.0 }, { 12.0, 24.0 } } };
Код для инициализации многомерных данных вкладывается как:
/* model.c */
extern const real_T matrixParam[4][3][2];

for (i = 0; i < 3; i++) {
    for (i_1 = 0; i_1 < 4; i_1++) {
      for (i_0 = 0; i_0 < 2; i_0++) {
        ... = ... + matrixParam[i_1][i][i_0];
      }
    }
  }

Похожие темы