我有时间序列数据或考虑长度为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
答案 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]进行过滤正是计算出局部均值......