ベクトル演算の最適化
この例では、Simulink® Coder™ を使用してベクトルからスカラーを生成するブロック出力を設定することにより、Mux、Sum、Gain および Bus などのブロックに対して生成コードを最適化する方法を示します。この最適化により、一時ローカル配列がローカル変数に置き換わりスタック メモリが削減されます。
モデル例
モデル rtwdemo_VectorOptimization では、Gain ブロック G1 と G2 の出力はベクトル信号 tmp1 と tmp2 です。これらのベクトルの幅は 10 です。
model = 'rtwdemo_VectorOptimization'; open_system(model); set_param(model, 'SimulationCommand', 'update')

コードの生成
モデルをビルドします。
slbuild(model)
### Searching for referenced models in model 'rtwdemo_VectorOptimization'. ### Total of 1 models to build. ### Starting build procedure for: rtwdemo_VectorOptimization ### Successful completion of build procedure for: rtwdemo_VectorOptimization Build Summary Top model targets: Model Build Reason Status Build Duration ============================================================================================================================= rtwdemo_VectorOptimization Information cache folder or artifacts were missing. Code generated and compiled. 0h 0m 6.1027s 1 of 1 models built (0 models already up to date) Build duration: 0h 0m 6.8891s
最適化されたコードは rtwdemo_VectorOptimization.c にあります。信号 tmp1 と tmp2 はローカル変数 rtb_tmp1 と rtb_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)