- ベストアンサー
リアルタイムでの平均のとり方
例えば、1 3 4 5 6 7 4 2 1 と順次入ってくるインプットに対して、 3つずつの平均を計算していくプログラムはどのように組むとよいでしょうか? この場合、1の平均、1 3の平均、1 3 4の平均、3 4 5の平均となります。 Matlabでプログラムを作成しますが、考え方だけでも教えて頂けますと幸いです。
- みんなの回答 (3)
- 専門家の回答
質問者が選んだベストアンサー
自分だったら、合計を覚えておく変数とキューを用意し、インプットがあるごとに合計に足して、キューに追加。 キューのサイズが3を超えた時点で、キューの最初のデータを取り除き、その値を合計から消します。 例えばC++で書くとこんな感じ。 #include <cstdlib> #include <iostream> #include <queue> const size_t MAX_QUEUE_SIZE = 3; int main(void) { std::queue<int> q; int sum = 0; for (int i = 0; i < 10; i++) { int r = std::rand() % 100; // should use your inputs instead. sum += r; q.push(r); if (q.size() > MAX_QUEUE_SIZE) { int num = q.front(); q.pop(); sum -= num; } std::cout << "newest:" << r << std::endl; std::cout << "ave. of last " << q.size() << " numbers:"; std::cout << sum / q.size() << std::endl; } } 一応、キューのライブラリーはあるようですね。 http://www.mathworks.com/matlabcentral/fileexchange/28922-list--queue--stack/content/CQueue.m 自分が何個入力したかを覚えておく変数を用意するなら、 http://stackoverflow.com/questions/821637/create-a-buffer-matrix-for-continuous-measurements で circular buffer を確保した上で、3個以内で何個入れたかで割ってもいいかもしれませんね。 例えばgoで書くとこんな感じ。 package main import "fmt" import "math/rand" const maxData = 3 func sum(inputs []int) int { s := 0 for _, i := range inputs { s = s + i } return s } func main() { buf := make([]int, maxData, maxData) size := 0 for i := 0; i < 10; i++ { if size < maxData { size++ } r := rand.Int() % 100 // use your data source here. buf = append(buf[1:], r) fmt.Printf("%v\n", buf) s := sum(buf) a := s / size fmt.Printf("size:%v sum:%v ave:%v\n", size, s, a) } }
その他の回答 (2)
- maiko0318
- ベストアンサー率21% (1483/6969)
>10とか20とかの平均で可変して試そうと思っています。 工夫してみてくださいw。 考えることが重要なのですよ。
- maiko0318
- ベストアンサー率21% (1483/6969)
1個前の値=-1 2個前の値=-1 無限ループ |数字入力を促すメッセージ |数字取り込み | |入力値=-1なら終了 | |合計=入力値;個数=1 | |1個前の値!=-1なら1個前の値を合計に加算;個数を+1 |2個前の値!=-1なら2個前の値を合計に加算;個数を+1 | |合計/個数を表示 | |1個前の値を2個前の値にセット |入力値を1個前の値にセット
お礼
早速教えていただきましてありがとうございます。参考になりました。 |1個前の値を2個前の値にセット あたりの処理ですが、3つの平均だけだなく、10とか20とかの平均で可変して試そうと思っています。 1つずつずらす方法以外に方略はありますでしょうか? よろしくお願い致します。
お礼
ありがとうございます! キュー知らなかったので、使えそうです!