从数组中选择比其余数字大得多的数字

时间:2012-05-08 07:00:48

标签: matlab math numbers

假设有一个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感兴趣。

我正在尝试编写一个函数来提取感兴趣的数字。问题是我无法定义一个阈值来确定什么是“更大”,我不能告诉它获得x最大数字,因为这两个都会根据函数调用的内容而有所不同对

我有点卡住了。有没有人有任何想法如何攻击这个?

3 个答案:

答案 0 :(得分:3)

只是将所有数字都大于平均数并不会一直削减它。例如,如果您只有一个更大的数字,但更多的数字彼此接近。一个大数字不会很大地改变平均值,这会导致数字过多:

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)允许您使用“数字必须多大”的含义。

答案 1 :(得分:3)

如果是我,我会使用更多的统计洞察力,这将为代码提供最大的灵活性。

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)) )

答案 2 :(得分:0)

一个简单的解决方案是使用find和基于平均值(或其倍数)的阈值:

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