我正在尝试从包含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
答案 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
中的元素数与块大小不兼容以捕获所有相同大小的块中的所有数据,则索引时将发生错误。