javascript - 计算数组每个时间帧的平均值最大值

标签 javascript algorithm math

我有一组数据,由传感器以 1 秒的时间间隔记录。我正在尝试计算记录数据的每个时间间隔的最大平均值。如果我有 2 小时的数据,我想计算 1 秒间隔、2 秒间隔、3 秒间隔等的最大平均值...一直到 2 小时。

例如,给定以下 3 个值:

[8, 14, 11]

我要返回以下内容:

[
   {
      "Interval": 1,
      "MeanMax": 14,
   },
   {
      "Interval": 2,
      "MeanMax": 12.5,
   },
   {
      "Interval": 3,
      "MeanMax": 11,
   }
]

我创建了以下返回正确值的函数,但从性能 Angular 来看它非常慢。计算 2 小时数据 block 的输出大约需要 30 秒。 它正在计算给定间隔的所有可能平均值,然后返回最大值。

let sampleData = Array.from({length: 20}, () => Math.floor(Math.random() * 20));
console.log("SampleData: " + sampleData)

let meanMaxByTimeFrame = [];

for(var intervalInSeconds = 1; intervalInSeconds <= sampleData.length; intervalInSeconds++){
    let allAveragesForCurrentInterval = [];
  for(var sampleDataIndex = 0; sampleDataIndex < sampleData.length; sampleDataIndex++){
    if((sampleDataIndex + intervalInSeconds) > sampleData.length){
        break;
    }
    let sum = sampleData.slice(sampleDataIndex, sampleDataIndex + intervalInSeconds).reduce((a, b) => a + b, 0);
    let avg = sum/intervalInSeconds;
    allAveragesForCurrentInterval.push(avg);
  }
  meanMaxByTimeFrame.push({'Interval': intervalInSeconds, 'MeanMax': Math.max.apply(Math, allAveragesForCurrentInterval)});
}

console.log(meanMaxByTimeFrame)

任何帮助将不胜感激

最佳答案

好的旧命令式代码就可以了。 那,并使用窗口技​​术。

也就是说:对于每个窗口大小,我们只需要扫描一次数组:

[ 1, 2, 3, 4]
The sum of the first 3 elements is 6:
[ 1, 2, 3, 4]
 --------

The next sum is 6 - 1 (the element that goes out) + 4 (the element that goes in).


[ 1, 2, 3, 4]
    --------

So we keep the sum and divide by the window size to get the averages.

完整的解决方案:

console.time();

function maxOfAverages(source, windowSize) {
  if (windowSize > source.length || windowSize < 1) return null;
  let sum = 0,
    idx = 0;

  while (idx < windowSize) sum += source[idx++];

  let maxOfAverages = sum / windowSize;

  while (idx < source.length) {
    sum = sum - source[idx - windowSize] + source[idx];
    const avg = sum / windowSize;
    if (avg > maxOfAverages) maxOfAverages = avg;
    idx++;
  }

  return maxOfAverages;
}

let sampleData = Array.from({ length: 2000 }, () =>
  Math.floor(Math.random() * 20)
);
console.log("SampleData: " + sampleData);

let meanMaxByTimeFrame = [];

for (let interval = 1; interval <= sampleData.length; interval++) {
  const meanMax = maxOfAverages(sampleData, interval);
  meanMaxByTimeFrame.push({ Interval: interval, MeanMax: meanMax });
}

console.timeEnd();

console.log(meanMaxByTimeFrame);

免责声明:这种技术不能很好地处理截然不同的值。例如,如果最小值和最大值之间的差异超过 15 个数量级,则舍入误差将在总和中逐渐增加。所以,如果你有很多数字和非常不同的数字,你可能想要每次都重新计算总和。不过,请使用 while/for 循环并将功能性内容留给应用程序的每个非关键部分。

关于javascript - 计算数组每个时间帧的平均值最大值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/63160600/

相关文章:

arrays - 二叉搜索树按以下顺序递归遍历 Right root Left?

查找数据集中元素之间关系的算法

string - 删除句子中的片段 [puzzle]

java - 如何在 JLabel 中显示数学符号

javascript - React中根据路由将数据加载到组件中

javascript - 我目前正在尝试在将任务添加到数组后清除输入字段

python - 图 st 排序或耳朵分解的任何实现?

javascript - 制作一个简单的 Javascript 版本的高斯分布

javascript - 使用传单热图控制热图的不透明度

Javascript:无法检索具有功能的对象中的值