• ベストアンサー

リアルタイムでの平均のとり方

例えば、1 3 4 5 6 7 4 2 1 と順次入ってくるインプットに対して、 3つずつの平均を計算していくプログラムはどのように組むとよいでしょうか? この場合、1の平均、1 3の平均、1 3 4の平均、3 4 5の平均となります。 Matlabでプログラムを作成しますが、考え方だけでも教えて頂けますと幸いです。

質問者が選んだベストアンサー

  • ベストアンサー
回答No.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) } }

ok_pumpkin
質問者

お礼

ありがとうございます! キュー知らなかったので、使えそうです!

全文を見る
すると、全ての回答が全文表示されます。

その他の回答 (2)

  • maiko0318
  • ベストアンサー率21% (1483/6970)
回答No.2

>10とか20とかの平均で可変して試そうと思っています。 工夫してみてくださいw。 考えることが重要なのですよ。

全文を見る
すると、全ての回答が全文表示されます。
  • maiko0318
  • ベストアンサー率21% (1483/6970)
回答No.1

1個前の値=-1 2個前の値=-1 無限ループ |数字入力を促すメッセージ |数字取り込み | |入力値=-1なら終了 | |合計=入力値;個数=1 | |1個前の値!=-1なら1個前の値を合計に加算;個数を+1 |2個前の値!=-1なら2個前の値を合計に加算;個数を+1 | |合計/個数を表示 | |1個前の値を2個前の値にセット |入力値を1個前の値にセット

ok_pumpkin
質問者

お礼

早速教えていただきましてありがとうございます。参考になりました。 |1個前の値を2個前の値にセット あたりの処理ですが、3つの平均だけだなく、10とか20とかの平均で可変して試そうと思っています。 1つずつずらす方法以外に方略はありますでしょうか? よろしくお願い致します。

全文を見る
すると、全ての回答が全文表示されます。

関連するQ&A

  • リアルタイムでForループを表示

    Excel2010でVBAを使っています。 一つのループの計算のために10秒くらいかかるForループを10000回繰り返すプログラムを作った場合、 計算が終了するまでに30分程度時間がかかります。 計算途中にどこまで計算が進んだか分かるようにするため ダイアログにリアルタイムで変数iを表示できるようなプログラムを書きたいのですが どのようにすれば良いですか? Matlabだと「;」をつけないといった方法があるのですが VBAでやり方を教えてください。

  • Linuxでリアルタイム制御するには

    PCからAD/DAボードを介して小型のロボットをリアルタイム制御したいと思っています.これまではWindowsPCにMATLABをいれて,MATLABでプログラムを作って制御していたのですが,LinuxでMATLABを使わずにリアルタイム制御したいと思っています. そこで質問ですが,Linuxでリアルタイム制御するには,どのようなOSが必要なのでしょうか?Ubuntuで大丈夫でしょうか?また,PCにはOSの他に何を入れる必要があるのでしょうか?(これまではWindowsPCにMATLABとそのToolBoxを入れるだけでリアルタイム制御していたので,それ以外のやり方について全くの無知です.) アドバイス頂ければ幸いです.よろしくお願い致します.

  • matlabで、平均値を求める方法を教えて下さい。

    matlabで、複数のファイルにある数値の平均値を求める方法を教えてください。 sample1.nc, sample4.nc, sample7.nc の3つのファイルがあり、 それぞれに3つのデータが含まれています。 sample1.ncには data1,data2,data3 sample4.ncには data4,data5,data6 sample7.ncには data7,data8,data9 以上の計9個のdataがあります。 ここで例えばdataにはある人の身長が書かれているとします。 data1=147cm,data2=150cm,data3=140cm,・・・ など。 この場合に、data1からdata9の9個の数値(身長)の平均値を matlabを用いて求めるプログラムを教えてください。

  • 単純移動平均の計算について

    単純移動平均の計算について教えてください。 「3日間の移動平均線を求めたい場合は、求めたい日を含めて3日間の価格を合計し3で割る。その翌日の移動平均は、翌日を含めた3日間の合計を3で割るというように、ただ単純に平均値を計算する。」 というルールで計算してグラフを作成してみましたが、どうもインフォシークファイナンス等のチャートと見比べると違っているのです。 インフォシークの場合、チャートの上をマウスで移動するとチャートの左側の値が変わっていきますが、「日付アリ・終値なし」の日にも移動平均が計算されて入っているようなのです。 私は、終値がなければ計算しない、というルールでロジックを作成していたのですが、本当に正しい計算方法はインフォシークのようなやり方なのでしょうか?またその場合、ルールを教えていただけると助かります。

  • 平均の計算なのですが…

    プログラミング初心者の者です。 質問なのですが、int型の配列num[10]にあらかじめ10個の整数を入れておき、その平均、分算を計算して表示するプログラムを作成する、というもので、平均、分散は次の式を使って計算するというものです。 average=1/N*Σ(i=0,N-1)*num[i] variance=1/N*Σ(i=0,N-1)*(num[i]-average)2乗 平均のプログラミングが分かれば、分散の方は分かると思うので、上の式を使った命令文の書き方を誰か教えて下さりますでしょうか。お願いします。

  • 平均

    エクセル2000 で平均を出しています。 アベレッジ関数で出しましたが, 1,2,3,0という4つの数の平均を出すとき 0は含まないで計算させたいときはどうしたらいいでしょうか? コントロールで1,2,3を選択してというやり方はわかりますが, その0が1,2,0.3という並び方もあるんです。 オートフィルで関数をコピーしたいので, 0がある場合は0を省きそのほかを平均するという関数の入れ方を教えてください。

  • 実効値と平均値

    悩んでます。 実効値は交流の電力計算のときに用いる・というのはわかるのですが、平均値を計算で使うというのはどのような時なのでしょうか? 具体的に言うと、MIN値が0でMAX値がVの矩形波(DUTY50%)での電力計算ではどちらの値を使うべきか?ということです。 この場合、実効値と平均値では値が違いますよね?平均値で計算してもいいような気がしますが・・・・ 教えてください。

  • 平均値+平均値は…?

    一年生の時の評定平均を3.5、二年生の時が4、三年生の時が3.5とします。このそれぞれの平均値を足すと、三年間の評定平均を出すことが出来るのでしょうか? 平均値+平均値は正しい計算なんですか?

  • 平均値?

    85%の確率で150万手に入る。 15%の確率で0。 この場合の理論平均値?の計算方法は 150万×85%×100=127.5万 0万 ×15%×100=0万 127.5万+0万=127.5万 であってますか?

  • 【JAVA】配列の要素の平均について

    JAVAで質問となります。 以下のプラグラムを教えていただきたいです。 ____________________ n 個の要素で構成される int 型の配列を引数として受け取り,配列内の全要素の平均値を返すメソッドを作成してください. また,コマンドライン入力に整数値を入力すると,作成したメソッドを使用して,入力した整数値の平均値を求め,結果を標準出力に出力するプログラムを作成してください. このプログラムを作成する際は,以下の要件を満たすように作成してください:  【メソッド】 配列内の全要素の平均値を求めるメソッドは,以下の仕様とする: メソッド名:calcAverage 引数:配列 - int 型の配列 戻り値:平均値 - double 型 内容:引数として受け取った配列のすべての要素の平均値を計算する.  【入力】 整数値のデータは,コマンドライン入力に入力する. その際,各整数値は,半角スペースで区切る.  【出力】 コマンドライン入力に1つ以上の整数値が入力された場合は,それらの平均値を出力する. コマンドライン入力に何も入力されなかった場合は,何も出力しない. 平均値の出力は,全体を左詰めで小数点以下2桁まで出力する. 行の先頭には空白を入れず,行の左端から出力する.