Main Content

System object の定義に関するヒント

System object™ は、反復処理のために最適化されている特殊な MATLAB® オブジェクトです。System object は、オブジェクトを複数回実行する場合またはループでデータを処理する場合に使用します。独自の System object を定義するときには、System object が迅速に実行されるように次の推奨事項に従ってください。

一般

  • setupImpl メソッドで 1 回限りの計算をすべて定義し、結果をプライベート プロパティにキャッシュします。反復計算には stepImpl メソッドを使用します。

  • それぞれ 1 または 0 ではなく、true または false を使用してブール値を指定します。

  • メソッド内の変数が呼び出し間で値を維持する必要がなければ、そのメソッドでこれらの変数に対してローカル スコープを使用します。

入出力

  • 一部のメソッドは、stepImpl アルゴリズム入力を setupImplupdateImplvalidateInputsImplisInputDirectFeedThroughImplprocessInputSpecificationChangeImpl などのように、自身の入力として使用します。この入力は、入力順序は stepImpl と一致しなければなりませんが、入力数は一致する必要はありません。実装が System object への入力を全く必要としない場合は、それらをすべてオフのままにできます。

  • getNumInputsImpl メソッドおよび getNumOutputsImpl メソッドでは、オブジェクト プロパティからの戻り引数を設定する場合、そのオブジェクト プロパティに Nontunable 属性がなければなりません。

メソッド定義での入力定義としての ~ の使用

静的メソッドを除くすべてのメソッドでは、System object のハンドルを最初の入力引数として想定しています。System object のハンドルには任意の名前を使用できます。MATLAB エディターのメニューによって挿入されるコードは obj を使用します。

多くの例では、オブジェクト ハンドルを渡す代わりに「~」を使用して、オブジェクト ハンドルが関数で使用されていないことを示します。オブジェクト ハンドルの代わりに「~」を使用することによって、未使用の変数に関する警告が回避されます。

プロパティ

  • 変更しないプロパティの場合、Nontunable プロパティとして定義します。Tunable プロパティは Nontunable プロパティよりもアクセスに時間がかかります。

  • 可能な限り、public 属性の代わりに protected 属性または private 属性をプロパティに使用します。一部の public プロパティは protected および private プロパティよりもアクセスに時間がかかります。

  • プロパティが stepImpl メソッドで複数回アクセスされる場合、これらのプロパティをメソッド内のローカル変数としてキャッシュします。プロパティに複数回アクセスする典型的な例は、ループです。キャッシュされているローカル変数を使用する反復計算は、オブジェクトのプロパティにアクセスする必要のある計算よりもすばやく実行されます。メソッドの計算が完了したら、そのローカルにキャッシュした結果をその System object のプロパティに保存し直すことができます。よく使用する調整可能プロパティはプライベート プロパティにコピーしてください。このベスト プラクティスは updateImpl メソッドと outputImpl メソッドにも適用されます。

    たとえばこのコードでは、各ループ反復で k に複数回アクセスしますが、オブジェクトのプロパティに保存されるのは 1 回のみです。

    function y = stepImpl(obj,x) 
      k = obj.MyProp; 
      for p=1:100 
        y = k * x; 
        k = k + 0.1; 
      end 
      obj.MyProp = k; 
    end

  • プロパティの既定値はオブジェクトのすべてのインスタンスで共有されます。1 つのクラスの 2 つのインスタンスは、プロパティがいずれかのインスタンスによって上書きされていなければ、同じ既定値にアクセスできます。

テキストの比較

文字ベクトル比較または文字ベクトルベースの switch ステートメントを stepImpl メソッドで使用しないでください。代わりにメソッド ハンドルを setupImpl に作成します。このハンドルは、同じクラス定義ファイルにあるメソッドをポイントします。このハンドルを stepImpl のループで使用します。

この例では、メソッド ハンドルとキャッシュされているローカル変数をループで使用して、効率的なオブジェクトを実装する方法を示します。setupImpl で、文字ベクトルの比較に基づいて myMethod1 または myMethod2 を選択し、メソッド ハンドルを pMethodHandle プロパティに割り当てます。stepImpl にはループがあるため、pMethodHandle プロパティをローカル メソッド ハンドル myFun に割り当ててから、myFun をループ内で使用します。

classdef MyClass < matlab.System
  function setupImpl(obj)
    if strcmp(obj.Method, 'Method1')
      obj.pMethodHandle = @myMethod1;
    else
      obj.pMethodHandle = @myMethod2;
    end
  end
  function y = stepImpl(obj,x)
    myFun = obj.pMethodHandle;
      for p=1:1000
        y = myFun(obj,x)
      end
    end
  end
  function y = myMethod1(x)
    y = x+1;
  end
  function y = myMethod2(x)
    y = x-1;
  end
end

Simulink

Simulink に含める System object の場合、StrictDefaults 属性を追加します。この属性はすべての MutableImpl メソッドを既定で偽を返すように設定します。

コード生成

System object とコード生成の詳細については、MATLAB コード生成における System object (MATLAB Coder)を参照してください。