cgsl_0201: 冗長の Unit Delay ブロックと Memory ブロック
ID: タイトル | cgsl_0201: 冗長の Unit Delay ブロックと Memory ブロック | ||
---|---|---|---|
説明 | コード生成のためにモデルを準備する場合、以下に従ってください。 | ||
A | 冗長の Unit Delay ブロックと Memory ブロックを削除する。 | ||
根拠 | A | 冗長の Unit Delay ブロックと Memory ブロックはグローバル メモリを余分に使用する。モデルから冗長性を除去すると、モデルの動作に影響することなくメモリ使用量を減らせる。 | |
最終更新 | R2013a | ||
例 | 推奨: 統合 Unit Delays void Reduced(void) { ConsolidatedState_2 = Matrix_UD_Test - (Cal_1 * DWork.UD_3_DSTATE + Cal_2 * DWork.UD_3_DSTATE); DWork.UD_3_DSTATE = ConsolidatedState_2; } | ||
非推奨: 冗長 Unit Delays void Redundant(void) { RedundantState = (Matrix_UD_Test - Cal_2 * DWork.UD_1B_DSTATE) - Cal_1 * DWork.UD_1A_DSTATE; DWork.UD_1B_DSTATE = RedundantState; DWork.UD_1A_DSTATE = RedundantState; } | |||
Unit Delay ブロックと Memory ブロックは、可換かつ配分的な代数プロパティを示します。ブロックが 1 つの駆動信号の計算式の一部である場合は、結果を変えずに、Unit Delay ブロックと Memory ブロックを計算式の新しい位置に移動できます。
前の例で一番上のパスの場合、ブロックの計算式は以下のようになります。
一番下のパスの場合、計算式は以下のようになります。
一方、計算式に第 2 の信号を加えた場合は、Unit Delay ブロックの位置が結果に影響します。次の例が示すように、上下のパス間の時間サンプルの歪みにより、Unit Delay ブロックの位置は結果に影響します。
ソースが 1 つで移動先が複数の場合、比較はさらに複雑になります。たとえば、次のモデルでは、2 つの Unit Delay ブロックを 1 つの Unit Delay にリファクタリングできます。
ブラック ボックスの視点からは、2 つのモデルは等価です。しかし、メモリと計算の視点からは、2 つのモデル間に差異があります。 { real_T rtb_Gain4; rtb_Gain4 = Cal_1 * Redundant; Y.Redundant_Gain = Cal_2 * rtb_Gain4; Y.Redundant_Int = DWork.Int_A; Y.Redundant_Int_UD = DWork.UD_A; Y.Redundant_Gain_UD = DWork.UD_B; DWork.Int_A = 0.01 * rtb_Gain4 + DWork.Int_A; DWork.UD_A = Y.Redundant_Int; DWork.UD_B = Y.Redundant_Gain; } { real_T rtb_Gain1; real_T rtb_UD_C; rtb_Gain1 = Cal_1 * Reduced; rtb_UD_C = DWork.UD_C; Y.Reduced_Gain_UD = Cal_2 * DWork.UD_C; Y.Reduced_Gain = Cal_2 * rtb_Gain1; Y.Reduced_Int = DWork.Int_B; Y.Reduced_Int_UD = DWork.Int_C; DWork.UD_C = rtb_Gain1; DWork.Int_B = 0.01 * rtb_Gain1 + DWork.Int_B; DWork.Int_C = 0.01 * rtb_UD_C + DWork.Int_C; } この場合は、最初のモデルの方が効率的です。最初のコード例では、3 つのグローバル変数、すなわち、Unit Delay ブロックから 2 つ (DWork.UD_A と DWork.UD_B)、離散時間積分器から 1 つ (DWork.Int_A) です。2 番目のコード例では、Unit Delay が生成するグローバル変数 1 つ (Dwork.UD_C) への削減を示していますが、冗長の Discrete Time Integrator ブロック (DWork.Int_B と DWork.Int_C) により、グローバル変数が 2 つあります。Discrete Time Integrator ブロックのパスによって、ローカル変数 1 つ (rtb_UD_C) と計算 2 つが追加で発生します。 それに対し、以下のリファクタリングしたモデル (2 番目) は効率的です。
{ real_T rtb_Gain4_f: real_T rtb_Int_D; rtb_Gain4_f = Cal_1 * U.Input; rtb_Int_D = DWork.Int_D; Y.R_Int_Out = DWork.UD_D; Y.R_Gain_Out = DWork.UD_E; DWork.Int_D = 0.01 * rtb_Gain4_f + DWork.Int_D; DWork.UD_D = rtb_Int_D; DWork.UD_E = Cal_2 * rtb_Gain4_f; } { real_T rtb_UD_F; rtb_UD_F = DWork.UD_F; Y.Gain_Out = Cal_2 * DWork.UD_F; Y.Int_Out = DWork.Int_E; DWork.UD_F = Cal_1 * U.Input; DWork.Int_E = 0.01 * rtb_UD_F + DWork.Int_E; } リファクタリングしたモデルのコードは、ルート信号の分岐に冗長の Unit Delay がないため、より効率的です。 |