System object の定義に関するヒント
System object™ は、反復処理のために最適化されている特殊な MATLAB® オブジェクトです。System object は、オブジェクトを複数回実行する場合またはループでデータを処理する場合に使用します。独自の System object を定義するときには、System object が迅速に実行されるように次の推奨事項に従ってください。
一般
setupImpl
メソッドで 1 回限りの計算をすべて定義し、結果をプライベート プロパティにキャッシュします。反復計算にはstepImpl
メソッドを使用します。それぞれ
1
または0
ではなく、true
またはfalse
を使用してブール値を指定します。メソッド内の変数が呼び出し間で値を維持する必要がなければ、そのメソッドでこれらの変数に対してローカル スコープを使用します。
入出力
一部のメソッドは、
stepImpl
アルゴリズム入力をsetupImpl
、updateImpl
、validateInputsImpl
、isInputDirectFeedThroughImpl
、processInputSpecificationChangeImpl
などのように、自身の入力として使用します。この入力は、入力順序は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)を参照してください。