Main Content

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

ベクトル演算の最適化

この例では、Simulink® Coder™ を使用してベクトルからスカラーを生成するブロック出力を設定することにより、Mux、Sum、Gain および Bus などのブロックに対して生成コードを最適化する方法を示します。この最適化により、一時ローカル配列がローカル変数に置き換わりスタック メモリが削減されます。

モデル例

モデル rtwdemo_VectorOptimization では、Gain ブロック G1G2 の出力はベクトル信号 tmp1tmp2 です。これらのベクトルの幅は 10 です。

model = 'rtwdemo_VectorOptimization';
open_system(model);
set_param(model, 'SimulationCommand', 'update')

コードの生成

モデルをビルドします。

slbuild(model)
### Starting build procedure for: rtwdemo_VectorOptimization
### Successful completion of build procedure for: rtwdemo_VectorOptimization

Build Summary

Top model targets built:

Model                       Action                        Rebuild Reason                                    
============================================================================================================
rtwdemo_VectorOptimization  Code generated and compiled.  Code generation information file does not exist.  

1 of 1 models built (0 models already up to date)
Build duration: 0h 0m 9.8246s

最適化されたコードは rtwdemo_VectorOptimization.c にあります。信号 tmp1tmp2 はローカル変数 rtb_tmp1rtb_tmp2 です。

cfile = fullfile('rtwdemo_VectorOptimization_grt_rtw',...
    'rtwdemo_VectorOptimization.c');
coder.example.extractLines(cfile,'/* Model step', '/* Model initialize', 1, 0);
/* Model step function */
void rtwdemo_VectorOptimization_step(void)
{
  real_T rtb_Sum3_0;
  real_T rtb_tmp1_0;
  real_T rtb_tmp2_0;
  int32_T i;
  for (i = 0; i < 10; i++) {
    /* Gain: '<Root>/G2' incorporates:
     *  UnitDelay: '<Root>/X2'
     */
    rtb_tmp2_0 = 0.3 * rtwdemo_VectorOptimization_DW.X2_DSTATE[i];

    /* Gain: '<Root>/G1' incorporates:
     *  UnitDelay: '<Root>/X1'
     */
    rtb_tmp1_0 = 0.2 * rtwdemo_VectorOptimization_DW.X1_DSTATE[i];

    /* Sum: '<Root>/Sum3' incorporates:
     *  Gain: '<Root>/G3'
     *  Inport: '<Root>/In2'
     *  Sum: '<Root>/Sum1'
     *  Sum: '<Root>/Sum2'
     *  UnitDelay: '<Root>/X3'
     */
    rtb_Sum3_0 = ((rtwdemo_VectorOptimization_U.In2[i] - 0.4 *
                   rtwdemo_VectorOptimization_DW.X3_DSTATE[i]) - rtb_tmp2_0) -
      rtb_tmp1_0;

    /* Outport: '<Root>/Out2' */
    rtwdemo_VectorOptimization_Y.Out2[i] = rtb_Sum3_0;

    /* Update for UnitDelay: '<Root>/X3' */
    rtwdemo_VectorOptimization_DW.X3_DSTATE[i] = rtb_tmp2_0;

    /* Update for UnitDelay: '<Root>/X2' */
    rtwdemo_VectorOptimization_DW.X2_DSTATE[i] = rtb_tmp1_0;

    /* Update for UnitDelay: '<Root>/X1' */
    rtwdemo_VectorOptimization_DW.X1_DSTATE[i] = rtb_Sum3_0;
  }
}

モデルおよびコード生成レポートを閉じます。

bdclose(model)

関連するトピック