[クイズ] 移動平均の効率的な求め方
2009年 10月 27日
移動平均とは、その名の通り移動させながら平均化する処理手法。(下図参照)
データに含まれる微細な変動(≒ノイズ)を除去したりするのによく使う。
株価の変化傾向を見やすくするためにも使われてる。
1.最初の処理
■■■■■□□□□□
└─┬─┘
ave
2.次の処理
□■■■■■□□□□
└─┬─┘
ave
…
3.最後の処理
□□□□□■■■■■
└─┬─┘
ave
こういう平均処理を求めるプログラムを組むとき、
───────────────────────
sum := 0;
i_end := i_stt + avecnt -1;
for i := i_stt to i_end do
sum := sum + data[i];
ave := sum / avecnt;
───────────────────────
ってな感じで、毎回for文をぶん回すかな?
平均処理データが5つだから、for文で処理してもアッちゅー間に終わるだろうが、
そのデータ数が数千・数万になったら、どーする気かね?チミは。 ん~?
以下のようにすると効率的。
これなら移動平均処理するデータ数がいくらになっても、処理負荷が増えたりしない。
───────────────────────上のようにやるだけで処理負荷がデータ数に左右されなくなるからオモシロい。スマートだ。
sum := sum + data[i_end];
ave := sum / avecnt;
sum := sum - data[i_stt]; // 次の移動平均処理への準備
───────────────────────
プログラムって、いくらその内容を工夫しても、
プログラムを使う側(=ユーザ)にソレは伝わらないのよね。
さすがに、今回のような実行時のCPU負荷に大きく効いてくるものなら、
ユーザも気づくし、ユーザにとってもうれしいに違いないんだけれども、
でもそうでないものって、使う側にとってはどうでもいいんだよね。
けど、こういうところに面白みを見つけられるかどうかで、
プログラムを組む仕事を楽しめるかが決まってくると思うんだなぁ。
こういうコダワリを理解できない人は、
「それは、マスタ一ベ一ション(=自己満足)ですよ!」
というかもしれない。
おっしゃる通り!
だって、そのコダワリが気持ちいい(=オモシロい)んだから。