在MATLAB

时间:2016-06-10 19:57:24

标签: arrays matlab mean reshape moving-average

我有时间序列数据或考虑长度为N的实值数据。我想创建长度为k的子块,这是窗口长度。 k的值可以任意选择。这会产生问题,因为整个数据的窗口大小相同。我想将每个子块存储在一个数组中。但我仍然坚持创建数据的子块并包含一个检查,以便(mod(N, nseg)) nseg必须可以被数据长度整除。

N = 512; %length of the time series
data = rand(N,1);
window_length = 30;  %k
Nseg = floor(N/window_length) %Number of segments or blocks

Modified_Data = [mean(reshape(data,window_length,Nseg))]; %Throws error 

3 个答案:

答案 0 :(得分:2)

如果您有图像处理工具箱,则可以使用im2col在整个时间序列中滑动特定的块大小。输出的每一列代表来自其中一个块的数据。

values = im2col(data, [window_length 1], 'distinct');

由于看起来您只想要每个块的平均值,您也可以使用blockproc来执行此操作。

means = blockproc(data, [window_length, 1], @(x)mean(x.data));

如果您没有图像处理工具箱,则可以使用accumarray来执行此任务。

means = accumarray(floor((0:(N-1)).'/window_length) + 1, data, [], @mean);

如果您要丢弃任何超出可被window_length整除的数字的数据,您可以使用以下内容执行此操作:

data = data(1:(numel(data) - mod(numel(data), window_length)));

如果您想要重叠数据,您可能要使用直接卷积(首选方法)

means = conv(data(:), ones(5, 1)/5, 'same');

或者您可以通过省略最后一个输入来创建与im2col重叠的块。

values = im2col(data, [window_length 1]);
means = mean(values 1);

答案 1 :(得分:2)

如果您有R2016a +,请考虑使用内置的movmean功能:

N = 512; %length of the time series
data = rand(N,1);
window_length = 30;  %k
Modified_Data = movmean(data, window_length);

有关详细信息和其他选项,请参阅文档。

答案 2 :(得分:0)

如果我理解你的问题,那就非常简单了:

filter(ones(N,1)/N,1,signal)

如果你认为用[1 / N 1 / N 1 / N ... 1 / N]进行过滤正是计算出局部均值......