2017-02-16 101 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中的元素數量與塊大小不兼容以捕獲所有大小相同的塊中的所有數據,則索引時會發生錯誤。