在 MATLAB 中创建重叠和非重叠滑动 windows
Create overlapping and non-overlapping sliding windows in MATLAB
我正在尝试从包含 N
元素的数组 Data
创建重叠和非重叠数据块。如何为任何 N
和任何 blksze
正确形成 Data
的子数组?以下代码用于非重叠块,因为在创建子块时元素数量超过而抛出错误。例如,让 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
要提取重叠块,我建议使用 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
中的元素数量与块大小不兼容以捕获所有相同大小的块中的所有数据,则在索引时会发生错误。
我正在尝试从包含 N
元素的数组 Data
创建重叠和非重叠数据块。如何为任何 N
和任何 blksze
正确形成 Data
的子数组?以下代码用于非重叠块,因为在创建子块时元素数量超过而抛出错误。例如,让 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
要提取重叠块,我建议使用 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
中的元素数量与块大小不兼容以捕获所有相同大小的块中的所有数据,则在索引时会发生错误。