2017-02-16 403 views
1

我试图从包含N元素的数组Data创建重叠和非重叠的数据块。我如何正确地形成Data的任何Nblksze的子阵列?下面的代码是针对不重叠的块引发错误,因为在创建子块时元素的数量超过了。例如,让Data = [1,2,3,4,5,6],然后在MATLAB中创建重叠和非重叠的滑动窗口

  • 重叠的情况下,我应该得到:块大小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

为了提取出重叠块,我推荐使用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中的元素数量与块大小不兼容以捕获所有大小相同的块中的所有数据,则索引时会发生错误。