Main Content

このページの内容は最新ではありません。最新版の英語を参照するには、ここをクリックします。

MATLAB Function ブロックの可変サイズ配列での動的メモリ割り当ての使用

この例では、MATLAB Function ブロックの可変サイズ配列に対して動的メモリ割り当てを使用する方法を説明します。動的メモリ割り当てでは、スタックでメモリが静的に割り当てられるのではなく、実行時に必要に応じてヒープでメモリが割り当てられます。動的メモリ割り当ては次のような場合に便利です。

  • 配列の上限がわからない。

  • 大きい配列に対してスタックでメモリを割り当てたくない。

動的メモリ割り当ては、MATLAB Function ブロックにローカルな配列に対してのみ使用できます。

以下に対しては、動的メモリ割り当てを使用できません。

  • パラメーター。パラメーターは固定サイズでなければなりません。

  • MATLAB System ブロックに関連付けられた System object の離散状態プロパティ。

動的メモリ割り当て用にモデルを構成

MATLAB Function ブロックの可変サイズ配列に対して動的メモリ割り当てが使用されるようモデルを構成しているか確認します。[コンフィギュレーション パラメーター] ウィンドウの [シミュレーション ターゲット]、[詳細設定パラメーター] カテゴリで、以下を確認します。

  • [MATLAB 関数での動的メモリ割り当て] が選択されている。

  • [MATLAB 関数での動的メモリ割り当てしきい値] パラメーターに既定値 65536 が設定されている。

モデルの作成

制限なしの可変サイズ配列を使用する MATLAB Function ブロックをもつこの Simulink® モデルを作成します。

This image shows the model you created. A MATLAB Function block uses a constant block as an input and an Outport as an output.

  1. Simulink モデル mymodel を作成します。

  2. MATLAB Function ブロックをモデルに追加します。

  3. MATLAB Function ブロックで、以下のコードを追加します。

    function s = myfcn(n)
    Z = rand(1,n);
    s = sum(Z);
    end
  4. MATLAB Function ブロックの左に Constant ブロックを追加します。

  5. MATLAB Function ブロックの右に Outport ブロックを追加します。

  6. ブロックを結線します。

動的メモリ割り当てを使用したモデルのシミュレート

  1. モデルをシミュレートします。

  2. MATLAB Function エディターで、MATLAB® 関数レポートを開くために、[関数レポート] をクリックします。

    [変数] タブには、Z が 1 行 :? 列の配列であることが示されています。コロン (:) は、2 番目の次元が可変サイズであることを示します。疑問符 (?) は、2 番目の次元が制限なしであることを示します。

シミュレーションでは、Z の 2 つ目の次元に上限がないため、Z に動的メモリ割り当てを使用しなければなりません。

制限付き配列に対する動的メモリ割り当ての使用

配列が制限なしの場合、コード ジェネレーターでは動的メモリ割り当てを使用しなければなりません。配列が制限付きの場合、コード ジェネレーターでは、配列サイズ (バイト単位) が動的メモリ割り当てしきい値以上になった場合にのみ動的メモリ割り当てが使用されます。このしきい値の既定の値は 65536 です。

動的メモリには実行時のパフォーマンス コストがあります。その使用を制御することで、実行時の速度を改善できます。

Z をしきい値を超えるサイズの制限付き可変サイズ配列にする場合、コード ジェネレーターでは Z に動的メモリ割り当てが使用されます。以下に例を示します。

  1. mymodel で、myfcn を変更して Z の上限が 500 になるようにします。

    function s = myfcn(n)
    assert(n < 500);
    Z = rand(1,n);
    s = sum(Z);
    end

  2. モデルをシミュレートします。

    MATLAB Function レポートには、Z が 1 行 500 列の配列であることが示されています。これは上限が 500 の可変サイズです。

  3. 動的メモリ割り当てを 4000 以下の値に下げます。この値は Z のサイズ (バイト単位) です。[コンフィギュレーション パラメーター] ウィンドウの [シミュレーション ターゲット]、[詳細設定パラメーター] カテゴリで、[MATLAB 関数での動的メモリ割り当てしきい値] パラメーターを 4000 に設定します。

  4. モデルをシミュレートします。

    Z のサイズが動的メモリ割り当てしきい値の 4000 であるため、コード ジェネレーターでは動的メモリ割り当てが使用されます。

動的メモリ割り当てを使用する C コードの生成

Simulink Coder™ をお持ちの場合は、このモデルの C コードを生成できます。次に、コード ジェネレーターでの動的に割り当てられた配列の表し方を確認できます。

  1. 固定ステップ ソルバーを使用するようモデルを構成します。[コンフィギュレーション パラメーター] ダイアログ ボックスの [ソルバー] ペインの [ソルバー オプション] で、次のようにします。

    • [タイプ] には [固定ステップ] を選択します。

    • [ソルバー] には [離散 (連続状態なし)] を選択します。

  2. コード生成レポートを作成および使用するようにモデルを構成します。[コンフィギュレーション パラメーター] ダイアログ ボックスの [コード生成]、[レポート] ペインで、[コード生成レポートを作成][レポートを自動的に開く] を選択します。

  3. MATLAB Function ブロックのコードを編集して、次のコードのようにします。

    function s = myfcn(n)
    Z = rand(1,n);
    s = sum(Z);
    end

    Z は制限のない可変サイズ配列です。

  4. モデルを作成します。

  5. コード生成レポートで、mymodel.c を開きます。emxArray 型の emxArray_real_T_mymodel_T および emxArray ユーティリティ関数 (mymodel_emxInit_real_T など) が示されているため、コード ジェネレーターで Z に動的メモリ割り当てが使用されていることが分かります。コード ジェネレーターでは、メモリが動的に割り当てられている変数に emxArray 型が使用されます。生成されたコードでは、emxArray ユーティリティ関数を使用して emxArray を管理します。

Embedded Coder® がある場合は、emxArray 型とユーティリティ関数の識別子をカスタマイズできます。Identifier Format Control (Embedded Coder)を参照してください。

参考

関連するトピック