Javascript 平滑数组的值
如果我有一个像[3,5,0,8,4,2,6]这样的数字数组,有没有办法“平滑”这些值,使它们彼此更接近,显示的差异更小 我已经研究过使用一种称为高斯函数的方法对数据进行窗口化,该函数用于一维情况,这是我的数组,但是我在实现它时遇到了困难。似乎正好解决了我需要的问题,但我不明白用户naschilling(第二篇文章)是如何得出高斯矩阵值的 上下文:我正在开发一个音乐波形发生器(借鉴SoundCloud的设计),它将时间t的歌曲振幅映射到相应的条形高度。不幸的是,有很多噪音,当程序映射一个微小的振幅,导致高度突然下降时,它看起来特别难看。我基本上想要平滑酒吧的高度,这样他们就不会有太多的变化 我使用的语言是Javascript 编辑:对不起,让我更具体地说明“平滑”值。根据上面链接的线程,用户获取了一个数组Javascript 平滑数组的值,javascript,arrays,smoothing,Javascript,Arrays,Smoothing,如果我有一个像[3,5,0,8,4,2,6]这样的数字数组,有没有办法“平滑”这些值,使它们彼此更接近,显示的差异更小 我已经研究过使用一种称为高斯函数的方法对数据进行窗口化,该函数用于一维情况,这是我的数组,但是我在实现它时遇到了困难。似乎正好解决了我需要的问题,但我不明白用户naschilling(第二篇文章)是如何得出高斯矩阵值的 上下文:我正在开发一个音乐波形发生器(借鉴SoundCloud的设计),它将时间t的歌曲振幅映射到相应的条形高度。不幸的是,有很多噪音,当程序映射一个微小的振幅
[10.00, 13.00, 7.00, 11.00, 12.00, 9.00, 6.00, 5.00]
并使用高斯函数将其映射到
[ 8.35, 9.35, 8.59, 8.98, 9.63, 7.94, 5.78, 7.32]
请注意这些数字彼此之间的距离有多近
编辑2:成功了!感谢用户Awal Garg的算法,以下是结果:
不平滑
一些平滑
最大平滑度
编辑3:这是我在JS中的最终代码。我对它进行了调整,使数组的第一个和最后一个元素能够通过环绕数组而不是调用自身来找到它的邻居
var array = [10, 13, 7, 11, 12, 9, 6, 5];
function smooth(values, alpha) {
var weighted = average(values) * alpha;
var smoothed = [];
for (var i in values) {
var curr = values[i];
var prev = smoothed[i - 1] || values[values.length - 1];
var next = curr || values[0];
var improved = Number(this.average([weighted, prev, curr, next]).toFixed(2));
smoothed.push(improved);
}
return smoothed;
}
function average(data) {
var sum = data.reduce(function(sum, value) {
return sum + value;
}, 0);
var avg = sum / data.length;
return avg;
}
smooth(array, 0.85);
有趣的问题
平滑值的算法可能会有很大的不同,但我的观点如下:
“严格使用”;
var数组=[10,13,7,11,12,9,6,5];
函数平均值(v){
返回v.reduce((a,b)=>a+b,0)/v.length;
}
函数平滑(向量、方差){
var t_avg=平均值(向量)*方差;
var ret=数组(向量长度);
对于(变量i=0;i0?ret[i-1]:向量[i];
var next=i console.log(`${el}\t\t${y[i]}`);
}
显示(array,smoothOut(array,0.85));
您描述的技术听起来像是a的1D版本。将1D高斯数组的值乘以数组中给定的窗口,并对结果求和。例如
你可以改变高斯的方差来增加或减少模糊的影响。我不确定我是否理解你的意思平滑值这与我要寻找的非常接近。你是如何得到高斯数组[.242、.399、.242]?它们是高斯函数的离散值,平均值为0,sd=1)在-1、0和1处。对不起,您能更具体地说明如何计算这些值吗?我假设您使用了。我了解平均值和标准偏差的位置;对于x,您是否插入了-1、0和1?我知道这是旧的,但我认为您可以在此处查找值: