Main Content

このページの翻訳は最新ではありません。ここをクリックして、英語の最新版を参照してください。

生成コード内の行列の配列レイアウトを選択

C をアクション言語として使用する Stateflow® チャートからコードを生成するときに、行列の配列のレイアウトを指定できます。たとえば、以下の行列を考えます。

既定では、コード ジェネレーターは、列優先のレイアウトを使用して、行列を 1 次元配列としてフラットにします。この配列は、以下の並びでメモリに保存されます。

{1, 4, 2, 5, 3, 6}
行優先のレイアウトを選択すると、コード ジェネレーターは行列をフラットにして、以下の並びでメモリに保存します。
{1, 2, 3, 4, 5, 6}
Embedded Coder® がある場合は、Stateflow ローカル データの多次元性を保持し、フラット化を回避し、以下の並びの 2 次元配列として行列を実装できます。
{{1, 2, 3}, {4, 5, 6}}
行優先および多次元の配列レイアウトを使用すると、外部コードとの統合が簡単になる場合があります。詳細については、行列および配列のコード生成 (Simulink Coder)Dimension Preservation of Multidimensional Arrays (Embedded Coder)を参照してください。

列優先の配列レイアウト

既定では、Simulink® モデルの [配列のレイアウト] コンフィギュレーション パラメーターは Column-Major です。Ctrl-B をクリックすると、コード ジェネレーターはすべての行列データを 1 次元配列にフラット化して、その内容を列優先のレイアウトで並べます。

たとえば、以下の Stateflow チャートには、サイズが [2 3] のローカル データ x が含まれています。ステート アクションにより、x 内の要素に、行と列の番号によってインデックスが付けられます。

コードを生成すると、ファイル sf_matrix_layout.c は、ローカル データ x を、以下のコード行を含む列優先のレイアウトで実装します。

...
sf_matrix_layout_DW.x[0] = 1.0;
sf_matrix_layout_DW.x[2] = 2.0;
sf_matrix_layout_DW.x[4] = 3.0;
sf_matrix_layout_DW.x[1] = 4.0;
sf_matrix_layout_DW.x[3] = 5.0;
sf_matrix_layout_DW.x[5] = 6.0;
...

生成されたコードは、1 つのインデックスのみを使用してx の要素を参照します。

行優先の配列レイアウト

行優先のレイアウトにより、特定のアルゴリズムのパフォーマンスが改善する場合があります。例については、行優先の配列レイアウトのための内挿アルゴリズム (Embedded Coder)を参照してください。

行優先の配列レイアウトを使用するコードを生成するには、次を行います。

  1. [モデル コンフィギュレーション パラメーター] ダイアログ ボックスを開きます。

  2. [コード生成][インターフェイス] ペインで、[配列のレイアウト] パラメーターを [行優先] に設定します。

  3. Ctrl+B キーを押します。

前の例に行優先のレイアウトを選択すると、ファイル sf_matrix_layout.c は次のコード行を使用してローカル データ x を実装します。

  ...
  sf_matrix_layout_DW.x[0] = 1.0;
  sf_matrix_layout_DW.x[1] = 2.0; 
  sf_matrix_layout_DW.x[2] = 3.0;
  sf_matrix_layout_DW.x[3] = 4.0;
  sf_matrix_layout_DW.x[4] = 5.0;
  sf_matrix_layout_DW.x[5] = 6.0;
  ...
生成されたコードは、1 つのインデックスのみを使用してx の要素を参照します。

C をアクション言語として使用するチャートの場合、配列レイアウトとして行優先を使用する多次元カスタム コード関数のデータおよびメッセージ入力を含めることができます。関数の入力に対する既定の配列レイアウトとして行優先を実装するには、[コンフィギュレーション パラメーター] ダイアログ ボックスを開きます。[シミュレーション ターゲット] ペインで、[カスタム コードのインポート] をクリックして、[既定の関数配列のレイアウト][行優先] に設定します。

C をアクション言語として使用するチャートでは、多次元のカスタム コード変数を使用できます。関数の既定の配列レイアウトとして行優先を実装するには、[コンフィギュレーション パラメーター] ダイアログ ボックスを開きます。[シミュレーション ターゲット] ペインで、[カスタム コードのインポート] をクリックします。[コード生成][インターフェイス] ペインの [データ交換インターフェイス] セクションで、[配列のレイアウト][行優先] に設定されていることを確認します。

また、行優先の配列レイアウトに対して、個別の関数を指定することもできます。[シミュレーション ターゲット] ペインで、[関数別に指定] をクリックします。このウィンドウで、関数の追加や削除を行い、個別の配列レイアウトを指定できます。

メモ

カスタムの C コードを使用するチャートで行優先の配列レイアウトを有効にする場合は、カスタム コードで定義されている関数のすべてのグローバル変数と引数は、スカラー、ベクトル、またはスカラーとベクトルの構造体でなければなりません。n 要素のベクトルのサイズは n と指定します。[n 1][1 n] としては指定しないでください。

変化検出演算子を使用するチャートで行優先の配列レイアウトを有効にすると、コード生成でエラーが発生します。変化検出演算子を使用するチャートでコードを生成する前に、列優先の配列レイアウトを有効にします。変化検出演算子を参照してください。

多次元配列レイアウト

Embedded Coder がある場合は、データを 1 次元配列としてフラットにすることなく Stateflow データの多次元性を保持するコードを生成できます。

前の例では、ファイル sf_matrix_layout.c は次のコード行を使用してローカル データ x を実装します。

  ...
  sf_matrix_layout_DW.x[0][0] = 1.0;  
  sf_matrix_layout_DW.x[0][1] = 2.0;
  sf_matrix_layout_DW.x[0][2] = 3.0;
  sf_matrix_layout_DW.x[1][0] = 4.0; 
  sf_matrix_layout_DW.x[1][1] = 5.0;
  sf_matrix_layout_DW.x[1][2] = 6.0;
  ...
生成されたコードは、2 つのインデックスを使用して、x の要素を参照します。

多次元配列レイアウトは以下で使用できます。

  • Stateflow チャート内の定数データとローカル データ

  • メッセージを含むチャート

  • Simulink® モデル内のパラメーターおよびルートレベルの入力端子と出力端子のデータ

多次元レイアウトは、多次元配列データを含むバス信号では使用できません。多次元レイアウトは、以下ではサポートされていません。

  • 再利用可能なチャートまたは再利用可能な親サブシステム内のチャート

詳細については、Preserve Dimensions of Multidimensional Arrays in Generated Code (Embedded Coder)を参照してください。

関連するトピック