在MATLAB中创建重叠和非重叠的滑动窗口

时间:2017-02-16 20:41:31

标签: arrays matlab sliding-window

我正在尝试从包含Data元素的数组N创建重叠和非重叠数据块。如何为任何Data和任何N正确形成blksze的子数组?以下代码用于非重叠块抛出错误,因为在创建子块时元素数量超过了。例如,让Data = [1,2,3,4,5,6],然后

  • 对于重叠的情况我应该得到:块大小blksze = 2,我会得到block1 = [1,2], block2 = [2,3], block3 = [3,4], block4 = [4,5], block5 = [5,6]

  • 对于非重叠:块大小blksze = 2,我会得到block1 = [1,2], block2 = [3,4], block3 = [5,6]

代码段

N= 100;
n = 4;
Data = randi([1 n],1,N);
blksze = 10;
Nblocks = N / blksze;
counter = 1;
for i = 1 : Nblocks
    block{i} = Data(counter : counter + blksze - 1);
    counter = blksze + 1;
end

1 个答案:

答案 0 :(得分:1)

为了提取重叠块,我建议使用bsxfun创建索引并对矩阵进行子集,而非重叠块则可以使用reshape

重叠

ind = bsxfun(@plus, (1 : blksze), (0 : numel(Data) - blksze).');

这种方法的优点是它使用广播来生成每个块的正确索引。因此,这将是一个2D矩阵,其中每一行都是获取右块数据所需的索引,列数由块大小决定。

非重叠

ind = reshape(1 : numel(Data), [], numel(Data) / blksze).';

这只是重新整形矢量,这样每一行都是一组唯一的索引,增加1,列数由块大小决定。

最后,只需索引到Data即可获得所需内容:

blocks = Data(ind);

这是一个使用6个元素的运行示例:

>> rng(123); Data = rand(1, 6)

Data =

    0.6965    0.2861    0.2269    0.5513    0.7195    0.4231

块大小为2或blksze = 2时,这是重叠和非重叠的结果:

>> blksze = 2;
>> indno = reshape(1 : numel(Data), [], numel(Data) / blksze).';
>> indo = bsxfun(@plus, (1 : blksze), (0 : numel(Data) - blksze).');
>> blockno = Data(indno)

blockno =

    0.6965    0.2861
    0.2269    0.5513
    0.7195    0.4231

>> blocko = Data(indo)

blocko =

    0.6965    0.2861
    0.2861    0.2269
    0.2269    0.5513
    0.5513    0.7195
    0.7195    0.4231

买者

此代码不进行错误检查,因为我们假设有足够的块来捕获所有数据。如果Data中的元素数与块大小不兼容以捕获所有相同大小的块中的所有数据,则索引时将发生错误。