Main Content

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

Stateflow® チャートからのコード生成時に、行列の配列のレイアウトを指定できます。たとえば、以下の行列を考えます。

コード ジェネレーターは、既定で列優先のレイアウトを使用して行列を 1 次元配列に変換し、次の配置でメモリに保存します。

{1, 4, 2, 5, 3, 6}

行優先のレイアウトを選択すると、コード ジェネレーターは行列を 1 次元配列に変換し、次の配置でメモリに保存します。

{1, 2, 3, 4, 5, 6}

Embedded Coder® がある場合は、行列の多次元性を保持して、次の配置の 2 次元配列として保存できます。

{{1, 2, 3}, {4, 5, 6}}

詳細については、行列および配列のコード生成 (Simulink Coder)およびDimension Preservation of Multidimensional Arrays (Embedded Coder)を参照してください。

列優先の配列レイアウト

既定では、Simulink® モデルの [配列のレイアウト] コンフィギュレーション パラメーターは Column-Major です。モデルからのコード生成時に、コード ジェネレーターはすべての行列データを列優先のレイアウトの 1 次元配列にフラット化します。

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

このモデルのコードを生成するには、次を行います。

  1. [アプリ] タブで、[Simulink Coder] または [Embedded Coder] を選択します。

  2. [C コード] タブで、[ビルド] をクリックします。

ファイル 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. [コード生成][インターフェイス] ペインで、[配列のレイアウト] パラメーターを [Row-Major] に設定します。

  3. Simulink Coder を使用したコード生成 (Simulink Coder)またはEmbedded Coder を使用したコード生成 (Embedded Coder)の説明に従ってコードを生成します。

ファイル 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 の要素を参照します。インデックスが昇順で現れます。

行優先の配列レイアウトを有効にすると、カスタム コードの関数にチャート データとメッセージ データを引数として行優先の配列レイアウトで渡すことができます。また、カスタム コード変数の既定のレイアウトとして、行優先を使用することもできます。カスタム コード関数の既定の配列レイアウトとして行優先を実装するには、次を行います。

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

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

  3. [シミュレーション ターゲット] ペインの [詳細設定パラメーター] で、[カスタム コードのインポート] を選択します。

  4. [インポート設定] タブで、[既定の関数配列のレイアウト] パラメーターを Row-major に設定します。

また、個々の関数に行優先の配列レイアウトを指定することもできます。[シミュレーション ターゲット] ペインの [インポート設定] タブで、[関数による例外] をクリックします。[カスタム コード関数の配列のレイアウト] ウィンドウで、関数の追加や削除を行い、各関数の個々の配列レイアウトを指定できます。

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

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

多次元配列レイアウト

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

多次元配列のレイアウトを使用して前の例のコードを生成するには、次を行います。

  1. 行優先のレイアウトを有効にします。

  2. [アプリ] タブで、[Embedded Coder] を選択します。

  3. [C コード] タブで、[コード インターフェイス][既定のコード マッピング] を選択して、[コード マッピング] エディターと [プロパティ インスペクター] を開きます。

  4. [コード マッピング] エディターの [データの既定の設定] タブで、[Signals, states, and internal data] カテゴリを選択し、[ストレージ クラス]Localizable に設定します。コード マッピング エディターが空の場合は、Simulink モデルに移動します。

  5. [プロパティ インスペクター][コード] セクションで、[PreserveDimensions] を選択します。

  6. [C コード] タブで、[ビルド] をクリックします。

ファイル 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 チャート内の定数データとローカル データ

  • Stateflow チャート内のメッセージ データ

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

多次元レイアウトは、多次元配列データを含むバス信号では使用できません。

多次元レイアウトは、再利用可能なチャートまたは再利用可能な親サブシステム内のチャートでサポートされていません。

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

インポートされたバスの多次元配列の制限

カスタム コードで定義されたバスに多次元配列が含まれている場合、そのバスをインポートすることはできません。

多次元配列を含むバスをカスタム コードで使用するには、Stateflow でバスを定義し、そのバスをカスタム コードに渡します。

カスタム コードでバスを定義して渡す方法の詳細については、Stateflow チャートのカスタム構造体の統合を参照してください。

参考

モデル設定

関連するトピック