在Matlab中删除向量中的极值?

时间:2013-03-12 23:22:35

标签: matlab

所以说,我有一个= [2 7 4 9 2 4 999]

我想从矩阵中移除999(这是一个明显的异常值)。

是否有常规方法来删除这样的值?我有一组向量,并非所有向量都有这样的极值。 prctile(a,99.5)将输出向量中最大的数字,无论它是多么极端(或非极端)。

3 个答案:

答案 0 :(得分:11)

有几种方法可以做到这一点,但首先你必须定义什么是“极端”?它是否高于某个阈值?高于某些标准偏差? 或者,如果您知道这些极端事件的确切n且其值大于其他事件,则可以使用sort并删除最后n个元素。等...

例如,a(a>threshold)=[]会处理类似定义的阈值,而a(a>mean(a)+n*std(a))=[]会处理丢弃n标准偏差高于a平均值的值。

一种完全不同的方法是使用a的中位数,如果向量与您提到的一样短,您想要查看中值,然后您可以将任何高于该值的某个因子的阈值阈值a(a>n*median(a))=[]

最后,评估处理这些峰值的方法的一种方法是采用数据的直方图,并从那里开始工作......

答案 1 :(得分:2)

我能想到两个:

  • 对矩阵进行排序,并从顶部和底部删除n个元素。
  • 计算平均值和标准偏差并丢弃所有落在外面的值: mean +/- (n * standard deviation)

在这两种情况下,n必须由用户选择。

答案 2 :(得分:1)

过滤你的信号。

%choose the value
N = 10;
filtered = filter(ones(1,N)/N, 1, signal);

找到噪音

noise = signal - filtered;

删除嘈杂的元素

THRESH = 50;
signal = signal(abs(noise) < THRESH);

它优于mean+-n*stddev方法,因为它会查找本地更改,因此它不会因缓慢变化的信号[1 2 3 ... 998 998]而失败。