多次元配列の次元保持
生成コードにおける次元保持
コード ジェネレーターは、多次元モデル データの C/C++ コード内に 1 次元配列を生成します。たとえば、行列 matrixParam を考えてみましょう。
matrixParam =
1 2 3
4 5 6matrixParam を次のように定義します。/* 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];
}モデル コンフィギュレーション パラメーター [配列のレイアウト] を [行優先] に設定すると、生成されたコードで多次元配列の次元を保持できます。生成されたコードで配列の次元を保持すると、外部コードとの統合が強化されます。
たとえば、行優先の配列レイアウトでは、コード ジェネレーターは、生成されたコードで型定義の配列次元を次のように保持します。
/* 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
コード ジェネレーターが次元を保持する場合、生成されたコードは次のようになります。
real_T matrixParam[2][3] = { { 1.0, 2.0, 3.0 }, { 4.0, 5.0, 6.0 } } ;n 次元配列の場合、コード ジェネレーターが行優先コードを生成し、配列の次元を保持すると、インデックス順序は MATLAB と一致します。生成されたコード内の n 次元配列のデータ定義は、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];
}
}
}