2012-05-08 3 views
2

n個の要素の配列があり、n個の要素のうち残りの部分よりもはるかに大きい数があるとします。残りの部分よりはるかに大きい配列から番号を選択

だから、私が持っているかもしれません。この場合

16, 1, 1, 0, 5, 0, 32, 6, 54, 1, 2, 5, 3 

は、私が321654に興味があると思います。

それとも、私が持っているかもしれません。この場合

32, 105, 26, 5, 1, 82, 906, 58, 22, 88, 967, 1024, 1055 

は、私が10249069671055に興味があると思います。

興味のある番号を抽出する関数を作成しようとしています。問題は、「もっと大きい」ものを判断するためのしきい値を定義することができないことと、関数の呼び出しに応じてこれらの値が異なるため、最大の数値を得ることはできません。

私はちょっと固まっています。これを攻撃する方法は誰にもありますか?

+0

すべての数値の平均よりも大きい数値が必要なようです。 – Sjoerd

答えて

3

すべての数値を平均より大きく取っても、それは常にカットされません。たとえば、あなたがはるかに大きい1つの番号だけを持っているが、もっと近くにある数字がはるかに多い場合。一つの大きな数があまりにも多くの数字を取って、その結果、非常に多くの平均をシフトしません。

data = [ones(1,10) 2*ones(1,10) 10]; 
data(data>mean(data)) 

ans = 

     2  2  2  2  2  2  2  2  2  2 10 

あなたは数字の間の違いを見れば、この問題が解決されています

>> data = [16, 1, 1, 0, 5, 0, 32, 6, 54, 1, 2, 5, 3]; 
sorted_data = sort(data); 
dd = diff(sorted_data); 
mean_dd = mean(dd); 
ii = find(dd> 2*mean_dd,1,'first'); 
large_numbers = sorted_data(ii:end); 

large_numbers = 

    6 16 32 54 

スレッショルド値(この場合は2)を使用すると、数字がどれくらい大きいかという意味でプレイできます。

+0

これはまさに私が後にしていることです。ありがとう! – NOP

0

シンプルなソリューションを見つける使用し、平均値(またはその倍数)に基づいてtresholdすることです:

a = [16, 1, 1, 0, 5, 0, 32, 6, 54, 1, 2, 5, 3] 
find(a>mean(a)) 
2

それが私だったら、私は与えるだろうもう少し統計的洞察を、使用したいです将来的にはコードの柔軟性が最も高くなります。

x   = [1 2 3 2 2 1 4 6 15 83 2 4 22 81 0 8 7 7 7 3 1 2 3] 
EpicNumbers = x(x>(mean(x) + std(x))) 

標準偏差の数を増減して、しきい値を拡大または縮小することができます。

LessEpicNumbers = x(x>(mean(x) + 2*std(x))) 
MoreEpicNumbers = x(x>(mean(x) + 0.5*std(x))) 
関連する問題