在 MATLAB 中计算滑动 window 的平均值
Compute mean value over a sliding window in MATLAB
我有一个时间序列数据或考虑一个长度为 N
的实数值数据。我想创建长度为 k
的子块,即 window 长度。 k
的值可以任意选择。这会产生问题,因为 window 大小在数据中是相同的。我想将每个子块存储在一个数组中。但我坚持创建数据的子块并包括检查,以便 (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
如果您有图像处理工具箱,您可以使用 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);
如果我没有正确理解你的问题,那就很简单了:
filter(ones(N,1)/N,1,signal)
如果您考虑用 [1/N 1/N 1/N...1/N] 过滤就是计算局部均值...
如果您有 R2016a+,请考虑使用内置 movmean
功能:
N = 512; %length of the time series
data = rand(N,1);
window_length = 30; %k
Modified_Data = movmean(data, window_length);
有关详细信息和其他选项,请参阅文档。
我有一个时间序列数据或考虑一个长度为 N
的实数值数据。我想创建长度为 k
的子块,即 window 长度。 k
的值可以任意选择。这会产生问题,因为 window 大小在数据中是相同的。我想将每个子块存储在一个数组中。但我坚持创建数据的子块并包括检查,以便 (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
如果您有图像处理工具箱,您可以使用 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);
如果我没有正确理解你的问题,那就很简单了:
filter(ones(N,1)/N,1,signal)
如果您考虑用 [1/N 1/N 1/N...1/N] 过滤就是计算局部均值...
如果您有 R2016a+,请考虑使用内置 movmean
功能:
N = 512; %length of the time series
data = rand(N,1);
window_length = 30; %k
Modified_Data = movmean(data, window_length);
有关详细信息和其他选项,请参阅文档。