【问题标题】:Moving-averaging over an arbitray size vector in matlab在matlab中对任意大小的向量进行移动平均
【发布时间】:2014-07-12 14:52:58
【问题描述】:

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

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 2 3 替换为三个值的平均值 2 2 2)。有没有办法在没有循环的情况下做到这一点?

但是如果向量 x 是任意的(在我的例子中,例如 500001)并且您想任意缩小它,例如取平均超过 1000 个样本...是否没有现成的 matlab 函数,这似乎是一个标准问题?

【问题讨论】:

  • 填充它以制作长度为5001000的向量,然后按照链接中的代码进行操作,然后将末尾切断。使这项工作适用于任意长度应该不会太难。
  • 您应该指定您希望对未包含完整长度的 1000 个样本的数据系列的剩余部分进行什么处理。解决方案取决于此。

标签: matlab vector moving-average


【解决方案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)。这是因为这个特定的调用只返回那些可以完全计算移动平均值的值。

如您所见,处理边缘数据的方法有很多种,但在现实世界中,这些边缘情况并不重要。

【讨论】:

  • 谢谢!我没有意识到过滤器功能可以用于此。现在代码更简单更整洁了。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2016-08-29
  • 2021-01-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多