在matlab中对任意大小的向量进行移动平均

时间:2014-05-23 09:46:12

标签: matlab vector moving-average

我发现另一个人问了同样的问题,但答案不适用于任意长度的矢量。

Averaging every n elements of a vector in matlab

问题:

X = [1:12]; y =%平均操作; 手术后 y = [2 2 2 5 5 5 8 8 8 11 11 11] 因此,产生的矢量具有相同的大小,并且每3个值的跳跃平均值替换用于产生平均值的值(即,1 3 3被三个值的平均值2 2 2替换)。有没有循环的方法呢?

但是,如果向量x是任意的(在我的情况下,例如500001)并且你想将其任意缩小,例如,平均超过1000个样本...对于这个没有ready-matlab函数,它似乎是一个标准问题吗?

1 个答案:

答案 0 :(得分:1)

以下代码为您提供了任何过滤长度n和任何数据长度N的“跳跃平均值”。要使代码生效,N必须可以被n整除。 (跳跃平均值不是一个标准术语。我做了这个。对我来说这个过滤器就像一个“移动平均线”,但不是连续移动,而是跳跃。)

x = 1:20;     % so N=length(x) is 20
n = 5;        % filter length
xx = reshape(x,n,[]);
yy = sum(xx,1)./size(xx,1);
y = reshape(repmat(yy, size(xx,1),1),1,[]);

例如,如果N为21,那么N不再被n除以,此代码将返回错误。更深层次的原因是在这种情况下没有明显的方法来处理边缘。由于你有很多数据点,我只想扔掉最后几个。

x = 1:21;     
N = length(x);
throw_away = mod(N,n)-1;
x(end-throw_away:end) = []
xx = reshape(x,n,[]);
yy = sum(xx,1)./size(xx,1);
y = reshape(repmat(yy, size(xx,1),1),1,[]);

这可以为您提供所需的结果。但是,我建议你完全抛弃这种方法,而是使用标准函数来平滑数据。您可以使用built-in digital filtering function,也可以使用卷积实现简单的移动平均滤波器。以下是两者的代码:

x = 1:21;     
n=5;
y1 = filter(ones(1,n)/n, 1, x);
y2 = conv(x, ones(1,n)/n,'valid');

如果你看y1,你会注意到它落后于输入数据,输入数据是数字滤波器的标准属性。这个“相位延迟”是n / 2点。

如果你看y2,你会注意到矢量比输入矢量短(n-1)。那是因为这个特定的调用仅返回那些可以完全计算移动平均值的值。

如您所见,有许多不同的方法来处理边缘数据,但在现实世界中,这些边缘情况很少发生。