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