2009-07-31 15 views
1

私はいくつかのタスクのためにROOTスクリプトを書くのにC++を使っています。ある時点では、私は多くのものが非常に似ていて1つか2つが違う2倍の配列を持っています。私はそれらの痛みの親指を除いてすべての数を平均したいと思う。どのように私はそれにアプローチすべきですか?例えば、考えることができます:C++で配列内の異なる番号を選択する方法は?

x = [2.3, 2.4, 2.11, 10.5, 1.9, 2.2, 11.2, 2.1] 

私は、異種のもの、何とか10.511.2以外のすべての数値を平均します。このアルゴリズムは数千回繰り返され、2倍の配列には2000個のエントリがあるため、最適化(可読性を維持しながら)が望まれます。ありがとうございます!

チェックアウト: http://tinypic.com/r/111p0ya/3 パルスのy値の「異なる」数字。

波形のグラウンド値を決定するためのポイント。私は、最も負の値を地面と比較しており、サンプルの最初のN点を平均化するよりも、接地のためのより良い方法を得ることを望んでいました。

+1

あなたの仕事のために 'dissimilar'の厳密な定義を与えてください。 –

+0

これらの数字は何を表していますか?エラーの原因は何ですか?配布に関する情報。これらの情報を追加することができれば、答えるのが簡単になります。 –

+0

外れ値はあなたが探している用語です。 – Eric

答えて

1

...

私はそんなにベースラインでそれらを使用したことがない

騒音が、頑強でなければならない。

BTW:このデータのソースは何ですか。ピークはパーティクル検出器のパルスのように見えますが、高いレベルのバックグラウンドジッタは、DAQハードウェアのかなり小さな調整によって実際に改善できることを示唆しています。これは難しいソフトウェアの問題を解決しようとするよりも優れています。

最後に、非常に基本的なハードウェアに制限されていない限り(なぜ、どのようにROOTを実行していますか?)、わずか数千ものスペクトルがあれば、かなり遅いアルゴリズムが可能です。それとも、イベントごとに2,000のスペクトルがあり、高いイベントレートですか?

+0

私は分析の後半でTSpectrumを使用しました。今日の早い段階で波形の用途を探ることを考えました。良い提案。 信号は浜松PMTとクレージーベースです。 LabVIEWを使用してDAQをTektronixスコープに設定 - >波形をテキストに出力解析は、テキストファイルの転送後にROOTを使用して行います。 ROOTスクリプトは、脈拍と脈拍の高さを表示します。 1回の波形キャプチャ(2000サンプルポイント)には約1時間かかります。分析はほんの数分の1のオーダーにすぎないので、私は空き時間があります、私はちょっと待っています。 j – physicsmichael

+0

はい、2.7波形/秒が遅いDAQです。 =)セットアップには多くの欠陥がありますが、それは仕事を完了させています。 – physicsmichael

+0

私は経験があるハードウェアチェーンではありません。静止画:垂直スケールがVoltsの場合、ピークはかなり小さくなります。より多くの利益を得ることができますか(より多くのHVで最高ですが、範囲内でさえもうまくいくかもしれません)。 – dmckee

0

すぐに中央値を取ってから中央値から遠く離れていない平均値を取ることがあります。

あなたのプロジェクトに依存しています。

0

外れ値の可能性を判断するには、Interquartile Range (IQR)を計算し、最も近い四分位数から1.5 * IQR離れた値は異常値です。

これは、多くの統計システム(Rなど)が自動的に異常値を検出するための基本的な方法です。

0

統計的に意味があり、それに近づく良い方法(Dark Eru、Daniel White)は、計算が繰り返されるほど計算が激しいので、後で修正することができるような回避策が見つかったと思いますそれを接地しないでください)。

ありがとうございます。私は時間があり、彼らの利益が減速の価値があるかどうかを見たいと思ったら、それらを調べます。ここで

+0

あなたが使用する予定の方法について私たちに啓発心? –

0

は、私が前に使ってきた迅速かつ汚い方法です(非常に少数の外れ値が先頭にある場合にはうまく機能し、そしてあなたが外れ値を構成するもののための非常に複雑な条件を持っていません)

アルゴリズムO(N)である。唯一本当に高価な部分は部門です。

本当の利点は、あなたがそれを数分間で稼働させることができることです。あなたは、ピークの不特定多数の下から背景を抽出するためのサポートを持っているTSpectrumクラスを見て検討するかもしれないROOTを使用していることを考えると

avgX = Array[0] // initialize array with the first point 
N = length(Array) 
percentDeviation = 0.3 // percent deviation acceptable for non-outliers 
count = 1 
foreach x in Array[1..N-1] 
    if  x < avgX + avgX*percentDeviation 
     and x > avgX - avgX*percentDeviation 
      count++ 
      sumX =+ x 
      avgX = sumX/count 
    endif 
endfor 

return avgX 
1

可能であれば、並べ替えられたリストを維持します。平均を計算するたびに、リストの先頭と末尾を簡単に切り取ることができます。

これは中央値に基づいて異常値を取り除くのに似ています(つまり、データを2回通過する必要があります。中央値を見つけるには1回、浮動小数点データの並べ替えとほとんど同じ速度です。平均を計算する)が、並べ替えられたリストを維持するコストで平均を計算する際のオーバーヘッドが少なくて済みます。どちらが最速かは、あなたの状況に完全に依存します。それは、もちろん、あなたが本当に望むものは、とにかく中央値です!

離散データ(たとえば、バイト= 256の可能な値)がある場合は、データを1回パスして256個のヒストグラム 'ビン'を使用して、各ビンに入る値を数えれば簡単に見つけることができます中央値/近似値/外れ値を外します。これは、データの精度の一部を失い、ソートされたリストがデータに適している場合は、それを維持することができれば、私の好ましい選択肢になります。

+0

並べ替えは悪い考えではありません。これらの値をヒストグラム化すると、ガウスピークに非常に簡単にフィットすることができます。その平均値は、後の基準値になりますが、あまりにも関与する可能性があります。 – physicsmichael

関連する問題