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')

コードの生成

ビルドと検査プロセス用に一時フォルダー (システムの一時フォルダー内) を作成します。

currentDir = pwd;
[~,cgDir] = rtwdemodir();

モデルを作成します。

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 29.642s

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

cfile = fullfile(cgDir,'rtwdemo_VectorOptimization_grt_rtw',...
    'rtwdemo_VectorOptimization.c');
rtwdemodbtype(cfile,'/* Model step', '/* Model initialize', 1, 0);
/* Model step function */
void rtwdemo_VectorOptimization_step(void)
{
  real_T rtb_Sum3;
  real_T rtb_tmp1;
  real_T rtb_tmp2;
  int32_T i;
  for (i = 0; i < 10; i++) {
    /* Gain: '<Root>/G2' incorporates:
     *  UnitDelay: '<Root>/X2'
     */
    rtb_tmp2 = 0.3 * rtwdemo_VectorOptimization_DW.X2_DSTATE[i];

    /* Gain: '<Root>/G1' incorporates:
     *  UnitDelay: '<Root>/X1'
     */
    rtb_tmp1 = 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 = ((rtwdemo_VectorOptimization_U.In2[i] - 0.4 *
                 rtwdemo_VectorOptimization_DW.X3_DSTATE[i]) - rtb_tmp2) -
      rtb_tmp1;

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

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

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

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

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

bdclose(model)
rtwdemoclean;
cd(currentDir)

関連するトピック