1

必须有一些算法可以使这比我正在做的更容易......

我有两个数组,每个数组有两列。两者中的一列是时间戳,另一列是测量值。

需要做的是把它变成一个单一的数组:时间戳,测量1,测量2

问题是时间戳通常不会完全匹配。一个数组可能在一段时间内完全丢失了一个值,或者时间戳可能会偏离很小的量(微不足道,可以将两个测量值分配给相同的时间戳)。

是否有一些众所周知的方法来进行这种模糊合并操作?一个简单的公共领域功能??

4

1 回答 1

1

首先问自己这些问题:数组是否具有相同数量的元素?您想如何组合具有相同时间戳的两个项目?你想如何组合具有不同时间戳的两个项目?

您可能必须自己编写算法。这样的事情很容易实现:

  1. 首先按时间戳顺序对每个数组进行单独排序。
  2. 在每个输入数组的开头分别声明两个迭代器,以及一个空的输出数组。
  3. 然后,您检查哪个数组具有最早的时间戳。称它为 EARLY,另一个称为 LATE。
    • 如果 EARLY 接近 LATE(小于某个常数),则应用合并操作并将结果插入到输出数组的末尾。增加两个迭代器并返回到 3。
    • 否则,EARLY 远非 LATE。您需要处理 LATE 数组中的缺失值,可能是通过重复前一个值或使用某些函数对其进行插值。决定在输出数组中插入或不插入值。在这种情况下,您只需增加 EARLY 数组迭代器并返回到 3。
  4. 如果您已到达任一阵列的末尾,则另一个阵列的其余部分为 LATE。您可能希望将此解释为缺失值,并重复或插入测量值。
  5. 返回输出数组。

~

OutputArray merge(InputArray& a, InputArray& b) {
    InputArray::iterator a_it = a.begin();
    InputArray::iterator b_it = b.begin();
    while(a_it != a.end() && b_it != b.end()) {
        InputArray::iterator& early = *a_it.timestamp < *b_it.timestamp ? a_it : b_it;
        InputArray::iterator& late = *a_it.timestamp < *b_it.timestamp ? b_it : a_it;
        if(*late.timestamp - *early.timestamp < TIMESTAMP_CLOSE_ENOUGH) {
            output.timestamp = (*late.timestamp + *early.timestamp) / 2; // mean value
            output.measure1 = *a_it.measure;
            output.measure2 = *b_it.measure;
            outputArray.push_back(output);
            a_it++; b_it++;
        }
        else {
            output.timestamp = *early.timestamp;
            output.measure1 = *a_it.timestamp < *b_it.timestamp ? *a_it.measure : outputArray.back.measure1; // previous value if missing
            output.measure2 = *a_it.timestamp < *b_it.timestamp ? outputArray.back.measure2 : *b_it.measure;
            outputArray.push_back(output);
            early++;
        }
    }

    InputArray::iterator& late = a_it != a.end() ? a_it : b_it;
    InputArray::iterator late_end = a_it != a.end() ? a.end() : b.end();
    while(late != late_end) {
            output.timestamp = *late.timestamp;
            output.measure1 = a_it != a.end() ? *a_it.measure : outputArray.back.measure1; // previous value if missing
            output.measure2 = a_it != a.end() ? outputArray.back.measure2 : *b_it.measure;
            outputArray.push_back(output);
            late++;
    }
    return outputArray;
}
于 2011-04-19T22:40:10.927 回答