【问题标题】:Determine offset where the most constructive interference occurs确定发生最大相长干扰的偏移量
【发布时间】:2014-04-14 09:02:09
【问题描述】:

我有两个数据数组:

我想将这些相似的图表对齐在一起(通过向任一数组添加偏移量):

基本上我想要的是最具建设性的干扰,如图所示两个波一起产生相同的波但幅度更大:

这也与找到最具破坏性的干扰相同,但必须将其中一个阵列倒置,如图所示:

请注意,第二波反转(波峰变为波谷/反之亦然)。

实际数据不仅包含一个主要的峰值和一个次要的波峰和波谷,而且包含许多,并且可能没有任何明显的峰值。我已经简化了图表中的数据,以显示我希望数据如何对齐。

我在想几个循环,比如:

biggest = 0
loop from -10 to 10 as offset
    count = 0
    loop through array1 as ar1
        loop through array2 as ar2
            count += array1[ar1] + array2[ar2 - offset]
    replace biggest with count if count/sizeof(array1) > biggest

但是,这需要遍历偏移量并遍历两个数组。我真正的数组定义非常大,这将花费太长时间。

我将如何确定将 data1 与 data2 匹配所需的偏移量?

JSFiddle(请注意,这与语言无关,我想比实际代码更了解算法)

【问题讨论】:

  • 可能找到两个数组中最高和最低的元素,并比较它们的索引。
  • @SecondRikudo 这在一般情况下显然会失败。如果没有额外的数据结构,这个问题不太可能在少于O(n) 的情况下得到解决。
  • @SecondRikudo 在更复杂的数组中,会有重复。许多低值和高值会相互冲突。
  • 这不是我熟悉的领域(我想有关于它的文献)。但是,由于流不相同,而且性能很重要,我会尝试使用一些随机方法(例如选择 K 个随机代表点,然后通过在滑动时寻找这些 k 点的最小增量来找到最佳偏移量它们沿着完整的流。这个过程可以重复 T 次,以增加信心)。
  • 这看起来像是地图匹配算法最基本的问题之一。尝试在那里搜索

标签: algorithm language-agnostic waveform


【解决方案1】:

查看ConvolutionCross-correlation 及其使用Fast Fourier Transformation 的计算。这就是它在现实生活中的应用程序的实现方式。

【讨论】:

  • 如果你知道的唯一工具是锤子,那么一切看起来都像钉子。
  • 抛开Snark,这个问题看起来像钉子,因为它钉子。
【解决方案2】:

如果(且仅当)您的数据具有非常可识别的尖峰,您可以做人类会做的事情:匹配尖峰:Fiddle

重要的部分是function matchData()

改进的版本会搜索 N 个最大和最小峰值,然后计算平均偏移量。

【讨论】:

  • 人们应该从Cybernetic知道一点,而不是给出愚蠢的建议。只知道电脑是没用的。
  • 感谢您采用这种方法。这是我最初测试过的,但我意识到我的数据没有尖峰//到处都有尖峰。我已经编辑了我的问题以澄清这一点。组合阵列时,与单独使用两个阵列相比,结果应该具有整体更高的峰值和更低的谷值。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-11-28
  • 2011-08-04
  • 1970-01-01
  • 2015-10-05
  • 1970-01-01
相关资源
最近更新 更多