在 MATLAB 中创建重叠和非重叠滑动 windows

Create overlapping and non-overlapping sliding windows in MATLAB

我正在尝试从包含 N 元素的数组 Data 创建重叠和非重叠数据块。如何为任何 N 和任何 blksze 正确形成 Data 的子数组?以下代码用于非重叠块,因为在创建子块时元素数量超过而抛出错误。例如,让 Data = [1,2,3,4,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

要提取重叠块,我建议使用 bsxfun to create the indices and subset the matrix whereas non-overlapping blocks you can simply use reshape

重叠

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

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

Non-overlapping

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,这是我们得到的重叠和 non-overlapping:

>> 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 中的元素数量与块大小不兼容以捕获所有相同大小的块中的所有数据,则在索引时会发生错误。