代码之家  ›  专栏  ›  技术社区  ›  physicsmichael

如何在C++中选择数组中不同的数字?

  •  1
  • physicsmichael  · 技术社区  · 15 年前

    我用C++编写了一些任务的根脚本。在某一点上,我有一个双精度数组,其中许多非常相似,一个或两个是不同的。我想平均所有的数字,除了那些拇指酸痛。我应该如何接近它?例如,让我们考虑:

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

    我想把所有的数字平均一下,除了 10.5 11.2 不同的。此算法将重复数千次,并且双精度数组有2000个条目,因此需要进行优化(同时保持可读性)。谢谢!

    退房: http://tinypic.com/r/111p0ya/3 脉冲Y值的“不同”数字。

    此点用于确定波形的接地值。我将最负值与地面进行比较,希望得到比平均样本中前n个点更好的接地方法。

    6 回复  |  直到 15 年前
        1
  •  1
  •   dmckee --- ex-moderator kitten    15 年前

    考虑到您使用的是根目录,您可以考虑查看 TSpectrum 支持从不确定数量的峰值下提取背景的类…

    我从来没有在基线噪声太大的情况下使用过它们,但是它们应该是健壮的。

    顺便问一下:这个数据的来源是什么?峰值看起来像是一个粒子探测器脉冲,但高水平的背景抖动表明,通过对DAQ硬件进行一些相当小的调整,您可以真正改善情况,这可能比尝试解决一个困难的软件问题要好。

    最后,除非您被限制在一些非常原始的硬件上(在这种情况下,为什么以及如何运行根目录?)如果你只有几千个这样的光谱,你就可以买一个相当慢的算法。还是每个事件都有2000个光谱,并且事件率很高?

        2
  •  1
  •   James    15 年前

    如果可以的话,维护一个排序的列表;然后每次计算出平均值时,都可以很容易地切掉列表的头和尾。

    这很像删除基于中值的异常值(即,需要对数据进行两次传递,一次是查找中值-这几乎和对浮点数据进行排序一样慢,另一次是计算平均值),但在计算平均值时需要较少的开销,而维护排序列表的成本则较低。哪一个最快将完全取决于你的情况。当然,你真正想要的可能是中位数!

    如果您有离散数据(例如,字节=256个可能值),您可以使用256个柱状图“箱”,对数据进行一次传递,计算每个箱中的值,然后很容易找到中间值/近似平均值/删除异常值等。如果您能承受损失一些精度,这将是我的首选选项。在您的数据中,然后维护一个排序列表(如果适合您的数据的话)。

        3
  •  0
  •   Junier    15 年前

    一个快速的方法可能是取中间值,然后取离中间值不远的数字的平均值。

    “不远,”依赖于你的项目。

        4
  •  0
  •   Sean    15 年前

    确定可能的异常值的一个好经验法则是计算 Interquartile Range (IQR) ,然后距离最近四分之一点1.5*iqr的任何值都是离群值。

    这是许多统计系统(如R)用来自动检测异常值的基本方法。

        5
  •  0
  •   physicsmichael    15 年前

    任何有统计意义的方法和接近它的好方法(dark eru,daniel white)都将过于计算密集,无法重复,我认为我已经找到了一个可以稍后进行修正的方法(意思是,让它不受限制)。

    谢谢你的建议。如果我有时间的话,我会调查他们,看看他们的收益是否值得放缓。

        6
  •  0
  •   Paul    15 年前

    这里有一个我以前使用过的快速而肮脏的方法(如果开始时有很少的异常值,并且对于构成异常值的内容,您没有非常复杂的条件,那么这个方法很有效)

    算法是O(n)。唯一真正昂贵的部分是部门。

    这里真正的优势是你可以在几分钟内启动和运行它。

    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