For Each Subsystem
入力信号またはマスク パラメーターの個々の要素またはサブ配列にアルゴリズムを適用
ライブラリ:
Simulink /
Ports & Subsystems
HDL Coder /
Ports & Subsystems
説明
For Each Subsystem ブロックは、シミュレーション タイム ステップ中に入力信号またはマスク パラメーター配列の各要素またはサブ配列で実行を繰り返すサブシステムを作成するための開始点として事前構成されている Subsystem ブロックです。
サブシステム内のブロックのセットは、元の信号またはマスク パラメーター配列の 1 つの要素またはサブ配列に適用されるアルゴリズムを表します。このサブシステム内では、状態をもつ各ブロックは、処理対象の各要素またはサブ配列ごとに独立した状態セットを維持します。したがって、このサブシステムの操作は動作の点で、元の入力信号またはマスク パラメーター配列の各要素についてサブシステムの内容をコピーし、そのコピーを使用して各要素を処理することに似ています。サブシステム内のブロック セットが要素またはサブ配列を処理するとき、サブシステムは結果を連結して出力信号を形成します。
サブシステムの構成
For Each Subsystem ブロックには、このサブシステムの制御ブロックとして機能する For Each ブロックが含まれます。For Each ブロックのパラメーターを指定して、サブシステム入力またはマスク パラメーターを要素またはサブ配列に分解する処理、および個別の結果を連結して出力信号にする処理を設定します。ブロック パラメーター [分割次元] および [分割幅] で、入力信号またはマスク パラメーター配列をスライスする次元と各スライスの幅をそれぞれ指定します。行ベクトルを分割するには、[分割次元] を 2
に指定します。列ベクトルを分割するには、[分割次元] を 1
に指定します。パラメーター [分割オフセット] を使用して、分割の間のギャップまたはオーバーラップを指定します。データのサブセットに対する処理を制限するには [反復回数] を指定します。このブロック パラメーターの詳細については、For Each を参照してください。
各反復に分割する入力信号を For Each Subsystem で指定するには、For Each ブロックのダイアログ ボックスの [入力分割] タブを使用します。分割する信号を指定するときは、[分割次元] パラメーター、[分割幅] パラメーター、[分割オフセット] パラメーターを指定します。
For Each Subsystem ブロックのマスク パラメーターは分割できます。分割は、システムの構造は変えずにパラメーターの値を変えて反復処理する場合に便利です。この場合、パラメーターごとにモデルを変更して追加の入力信号を分割する方法では煩雑になります。代わりに、For Each Subsystem にマスク パラメーターを追加します。詳細については、簡単なマスクの作成を参照してください。分割するマスク パラメーターを選択するには、For Each ブロックのダイアログ ボックスの [パラメーターの分割] タブを使用します。詳細については、以下の分割パラメーターの選択を参照してください。
結果を連結する次元を定義するには、[出力連結] タブで [連結の次元] を指定します。
サブ配列ごとにブロックによって生成された結果は、連結次元に沿って積み上げられます。既定では、次元 1 (y 軸) が使用され、結果が垂直に積み上げられることを意味します。ただし、連結の次元を 2 に指定すると、結果は水平方向 (x 軸) に連結されます。したがって、行ベクトルが処理されると、連結された結果は、最初のケースは行列になり、2 番目のケースは行ベクトルになります。
分割する入力信号またはサブシステムのマスク パラメーターを選択するときは、それらを各反復用に要素またはサブ配列に分解する方法を指定しなければなりません。[分割次元] パラメーターと [分割幅]、[分割オフセット] パラメーターで整数値を設定します。
例として、次の形式の入力信号行列 A
について考えてみます。
ラベル d1 と d2 は、それぞれ次元 1 と次元 2 を定義します。分割次元と分割幅の両方に対して既定の設定 1
、分割オフセットに 0
が保持されると、Simulink® は分割幅に等しい幅つまり 1 要素分の幅で分割次元 1 に対して直角にスライスします。
行列 A は、次の 3 つの行ベクトルに分解されます。
代わりに分割次元 2
を指定すると、Simulink は次元 2 に対して直角にスライスして、次の 3 つの列ベクトルを形成します。
[分割次元] を 2
に設定する以外に、[分割幅] を 2
および [分割オフセット] を -1
に設定すると、Simulink は 2 つのオーバーラップする 3 行 2 列の分割を処理に使用します。
[分割オフセット] パラメーターの使用例については、モデル slexForEachOverlapExample
を開いてください。
既定では、入力信号またはマスク パラメーターのすべての分割が処理されます。分割のサブセットを処理するには、処理する分割数を [反復回数] として入力します。上記の行列の例では、[分割オフセット] を 0
(既定の設定) に、[反復回数] を 2
に設定すると、入力行列 A
の最初の 2 行または 2 列のみが処理されます。
メモ
Simulink で 1 次元と見なされるのは信号だけです。マスク パラメーターは、方向に応じて行ベクトルか列ベクトルのどちらかになります。行ベクトルを分割するには、分割次元を 2 (列方向) に指定します。列ベクトルを分割するには、分割次元を 1 (行方向) に指定します。
コード再利用のサポート
特定のモデルの場合、For Each Subsystem ブロックは、Simulink Coder™ 生成コードでのコードの再利用を向上させます。スカラー アルゴリズムが同じである、2 つの再利用可能な Atomic Subsystem ブロックを格納したモデルが、信号の各要素に適用されるとします。これらのサブシステムの入力信号次元が異なる場合、Simulink Coder 生成コードには 2 つの異なる関数が含まれます。これら 2 つのサブシステムを入力の各要素を同じアルゴリズムで処理するように設定された 2 つの同じ For Each Subsystem ブロックに置き換えることができます。この場合、Simulink Coder 生成コードは、入力信号の要素数でパラメーター化される 1 つの関数で構成されます。モデルの For Each Subsystem ブロックの一意のインスタンスごとに 1 回呼び出されるので、この関数は 2 回呼び出されることになります。これらのケースのそれぞれに対して、入力信号の要素はそれぞれ異なる値をもちます。
マルチコア実行のサポート
ラピッド アクセラレータ モードでモデルのシミュレーションを行う場合、Simulink は For Each Subsystem のより高速なシミュレーションのため、マルチコア実行を使用します。Simulink は、対象となる各 For Each Subsystem について、ラピッド アクセラレータ モードで実行される最初の 2 タイム ステップを自動的にプロファイリングして、並列実行時間と逐次実行時間を比較します。続いて、Simulink は、そうすることによって実行時間の速度が増すようであれば、シミュレーション実行の後続のタイム ステップにおいて、並列のマルチコア実行に For Each Subsystem を指定します。入れ子にされた For Each Subsystem の場合、マルチコア実行は最上位サブシステムにのみ適用されます。連続状態または Function Caller ブロックを含む For Each Subsystem にはマルチコア実行は適用されません。
特定の For Each Subsystem についてマルチコア実行を抑止するには、サブシステム内の For Each ブロックの MultithreadedSim
パラメーターを 'off'
に設定します。
set_param(ForEachBlockName,'MultithreadedSim','off')
For Each Subsystem ブロック自身ではなく、サブシステム内の For Each ブロックのパラメーターであることに注意してください。モデル内のすべての For Each Subsystem についてマルチコア実行を抑止するには、モデルの MultithreadedSim
パラメーターを 'off'
に設定します。
set_param(ModelName,'MultithreadedSim','off')
マルチコア実行を再度有効にするには、関連する MultithreadedSim
パラメーターを既定値である 'auto'
に設定します。
例については、For Each Subsystem を使用したマルチスレッド シミュレーションを参照してください。
メモ
ラピッド アクセラレータ モードでモデルのシミュレーションを行うかモデルからコードを生成する場合に、For Each Subsystem でマスク パラメーターを分割するときは、分割されたパラメーターを参照する For Each Subsystem 内のすべての式が調整可能な式である必要があります。調整可能な式の制限 (Simulink Coder)を参照してください。
S-Function のサポート
For Each Subsystem ブロックは、C-MEX S-Function と Level-2 MATLAB® S-Function の両方をサポートします。ただし、S-Function が次の手法のいずれかを使用して複数の実行インスタンスをサポートすることが条件です。
C-MEX S-Function は
mdlSetWorkWidths
メソッドでssSupportsMultipleExecInstances(S, true)
を宣言しなければなりません。Level-2 MATLAB S-Function は、Setup メソッドで
block.SupportsMultipleExecInstances = true
を宣言しなければなりません。
これらの仕様を使用する場合:
DWork や Block I/O などの実行時データを、グローバル変数または永続変数を使用して、あるいは S-Function のユーザー データ内でキャッシュしないでください。
For Each Subsystem ブロックでは、
mdlStart
からmdlTerminate
までの S-Function の各実行メソッドは、S-Function によって処理される各要素に対して 1 回呼び出されます。したがって、mdlTerminate
に対する繰り返しの呼び出しで同じメモリを開放することのないように確認する必要があります。たとえば、mdlSetWorkWidths
内でランタイム パラメーターのメモリを割り当てる C-MEX S-Function について考えます。mdlTerminate
でこのメモリを開放する必要があるのは 1 回だけです。解決策として、mdlTerminate
をはじめて呼び出した後にポインターを空に設定します。
例
制限
For Each Subsystem ブロックの制限の詳細については、For Each Subsystem の制限を参照してください。
端子
入力
出力
ブロックの特性
拡張機能
バージョン履歴
R2010a で導入