poster
2019-12-10, 20:48
计算简单的一维数据向量的运行平均值似乎很简单。确实, FILTER (http://www.mathworks.com/access/helpdesk/help/techdoc/ref/filter.html)的MATLAB文档很高兴地宣称:
您可以使用过滤器查找运行平均值,而无需使用for循环。本示例使用16的窗口大小查找16元素向量的运行平均值:
D = [1:0.2:4]'; windowSize = 3; F = ones(1,windowSize)/windowSize; Df = filter(F,1,D); 结果:
上例http://www.tc.umn.edu/~vande642/pictures/untitled.png中原始数据和经过过滤的数据图的图像 (http://www.tc.umn.edu/~vande642/pictures/untitled.png)
就我的目的而言,关于此结果有两个令人讨厌的事情:输出点n是输入点n-(windowSize-1).. n(即,未居中,如水平移位所示)的平均值,并且指向该点的左侧可用数据视为零。
FILTFILT (http://www.mathworks.com/access/helpdesk/help/toolbox/signal/filtfilt.html)处理这两个问题,但还有其他缺点。它是Signal Processing Toolbox的一部分,并且不能很好地处理NaN(我想从平均值中排除掉NaN)。
FEX上的某些 (http://www.mathworks.com/matlabcentral/fileexchange/12276-movingaverage-v3-1-mar-2008) 人 (http://www.mathworks.com/matlabcentral/fileexchange/10113-runmean)显然也有同样的挫败感,但是对我来说,这种简单的事情需要自定义代码似乎很奇怪。我在这里想念什么吗?
回答:
您还可以使用卷积进行移动 (http://www.mathworks.com/access/helpdesk/help/techdoc/ref/conv.html)平均。因此,您无需担心filtfilt。
例如,您可以使用
D = [1:0.2:4]; windowSize = 3; F = ones(1,windowSize)/windowSize; Df = conv(D,F); %# if you didn't use 'valid', Df is larger than D. To correct: halfSize = floor(windowSize/2); Df = Df(halfSize+1:end-halfSize); 当然,您仍然需要处理边缘,因此您应该先填充D或使用'valid'参数运行conv。例如,如果您有图像处理工具箱,则可以使用PADARRAY (http://www.mathworks.com/access/helpdesk/help/toolbox/images/padarray.html) 。
填充的最简单方法是复制第一个和最后一个值。如果您对数据了解更多,其他方法可能会更适合。
更多&回答... (https://stackoverflow.com/questions/3453663)
您可以使用过滤器查找运行平均值,而无需使用for循环。本示例使用16的窗口大小查找16元素向量的运行平均值:
D = [1:0.2:4]'; windowSize = 3; F = ones(1,windowSize)/windowSize; Df = filter(F,1,D); 结果:
上例http://www.tc.umn.edu/~vande642/pictures/untitled.png中原始数据和经过过滤的数据图的图像 (http://www.tc.umn.edu/~vande642/pictures/untitled.png)
就我的目的而言,关于此结果有两个令人讨厌的事情:输出点n是输入点n-(windowSize-1).. n(即,未居中,如水平移位所示)的平均值,并且指向该点的左侧可用数据视为零。
FILTFILT (http://www.mathworks.com/access/helpdesk/help/toolbox/signal/filtfilt.html)处理这两个问题,但还有其他缺点。它是Signal Processing Toolbox的一部分,并且不能很好地处理NaN(我想从平均值中排除掉NaN)。
FEX上的某些 (http://www.mathworks.com/matlabcentral/fileexchange/12276-movingaverage-v3-1-mar-2008) 人 (http://www.mathworks.com/matlabcentral/fileexchange/10113-runmean)显然也有同样的挫败感,但是对我来说,这种简单的事情需要自定义代码似乎很奇怪。我在这里想念什么吗?
回答:
您还可以使用卷积进行移动 (http://www.mathworks.com/access/helpdesk/help/techdoc/ref/conv.html)平均。因此,您无需担心filtfilt。
例如,您可以使用
D = [1:0.2:4]; windowSize = 3; F = ones(1,windowSize)/windowSize; Df = conv(D,F); %# if you didn't use 'valid', Df is larger than D. To correct: halfSize = floor(windowSize/2); Df = Df(halfSize+1:end-halfSize); 当然,您仍然需要处理边缘,因此您应该先填充D或使用'valid'参数运行conv。例如,如果您有图像处理工具箱,则可以使用PADARRAY (http://www.mathworks.com/access/helpdesk/help/toolbox/images/padarray.html) 。
填充的最简单方法是复制第一个和最后一个值。如果您对数据了解更多,其他方法可能会更适合。
更多&回答... (https://stackoverflow.com/questions/3453663)