Main Content

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 ブロックおよびその他の "バーチャル" な信号操作ブロックについても効率的な実装が可能になります (つまり、それらの入力を実際にコピーせずに単に参照します)。

コンパイルされたモデル ファイル model.rtw は、MATLAB 構文の文字列として行列を表し、暗黙的なストレージ形式はありません。これにより、.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 では、行列パラメーターに LibBlockMatrixParameterLibBlockMatrixParameterAddr でアクセスします。

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 は宣言されません。

関連するトピック