我有一组数据,由传感器以 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/