TLC でのデータ処理
行列パラメーター
MATLAB®、Simulink®、およびコード ジェネレーターでは、配列 (1 次元、2 次元、...) のストレージに列優先の順序を使用します。メモリ上の配列の次の要素にアクセスする場合は、その配列の最初のインデックスをインクリメントします。たとえば、次のそれぞれの要素の組 A(i)
と A(i+1)
、B(i,j)
と B(i+1,j)
、C(i,j,k)
と C(i+1,j,k)
はメモリにその順番で格納されます。MATLAB データの内部表現形式の詳細については、MATLAB データを参照してください。
コード ジェネレーターの行列パラメーター
Simulink およびコード ジェネレーターの内部データ ストレージ形式と MATLAB の内部データ ストレージ形式では、複素数配列のストレージのみが異なります。MATLAB では、実数部と虚数部は個別の配列に格納されます。Simulink とコード ジェネレーターでは、実数部と虚数部は "インターリーブ" された形式で格納され、メモリ中の数字は実数、虚数、実数、虚数というように交互に格納されます。この表現形式を使用することにより、Simulink ライン上の小信号や Mux ブロックおよびその他の "バーチャル" な信号操作ブロックについても効率的な実装が可能になります (つまり、それらの入力を実際にコピーせずに単に参照します)。
コンパイルされたモデル ファイル
は、MATLAB 構文の文字列として行列を表し、暗黙的なストレージ形式はありません。これにより、model
.rtw.rtw
ファイルから文字列をコピーして MATLAB コードに貼り付け、MATLAB に認識させることができます。
TLC では、Simulink ブロックの行列パラメーターをスカラーまたは 1 次元配列の変数として宣言します。
real_T scalar; real_T mat[ nRows * nCols ];
ここで、real_T
は Simulink でサポートされる任意のデータ型にすることができ、モデル ファイルで与えられる変数の型と一致します。
たとえば、Look-Up Table (2-D) ブロックの 3 行 3 列の行列、
1 2 3 4 5 6 7 8 9
は、
に以下のように格納されます。model
.rtw
Parameter { Name "OutputValues" Value Matrix(3,3) [[1.0, 2.0, 3.0]; [4.0, 5.0, 6.0]; [7.0, 8.0, 9.0];] String "t" StringType "Variable" ASTNode { IsNonTerminal 0 Op SL_NOT_INLINED ModelParameterIdx 3 } }
これは、
で次のように定義されます。model
.h
typedef struct Parameters_tag { real_T s1_Look_Up_Table_2_D_Table[9]; /* Variable:s1_Look_Up_Table_2_D_Table * External Mode Tunable:yes * Referenced by block: * <S1>/Look-Up Table (2-D */ [ ... other parameter definitions ... ] } Parameters;
ファイルは行列パラメーターの実際のストレージを宣言します。形式が列優先であることがわかります。つまり、列を下に読み取ってから、行を横に読み取ります。model
.h
Parameters model_P = { /* 3 x 3 matrix s1_Look_Up_Table_2_D_Table */ { 1.0, 4.0, 7.0, 2.0, 5.0, 8.0, 3.0, 6.0, 9.0 }, [ ... other parameter declarations ...] };
TLC では、行列パラメーターに LibBlockMatrixParameter
と LibBlockMatrixParameterAddr
でアクセスします。
LibBlockMatrixParameter(OutputValues, "", "", 0, "", "", 1)
は、"
を返します (model
_P.s1_Look_Up_Table_2_D_Table[nRows
]""[0+
から自動的に最適化されます)。nRows
*1]"
LibBlockMatrixParameterAddr(OutputValues, "", "", 0, "", "", 1)
は、インラインと非インラインの両方のブロックの TLC コードについて、"&
を返します。model
_P.s1_Look_Up_Table_2_D_Table[nRows
]"
行列パラメーターも他の TLC パラメーターと同じように扱われます。それらのパラメーターのうち、コード生成時に TLC ライブラリ関数から明示的にアクセスされたものだけがパラメーター構造体に配置されます。そのため、この例の場合、LibBlockParameter
または LibBlockParameterAddr
で明示的にアクセスしない限り s1_Look_Up_Table_2_D_Table
は宣言されません。