2017-02-16 11 views
1

配列Dataに、N要素を含む重複していない重複しないデータブロックを作成しようとしています。 Nblkszeのサブ配列を正しくDataにするにはどうすればいいですか?次のコードは、サブブロックを作成するときに要素の数が超過するため、重複しないブロックのエラーをスローします。例えば、私が取得する必要ケースの重複を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 
スニペット3210

答えて

1

オーバーラップするブロックを抽出するには、bsxfunを使用してインデックスを作成し、マトリックスをサブセット化することをお勧めします。オーバーラップしないブロックの場合は、単にreshapeを使用します。この方法の利点

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

を重複

は、ブロックごと右インデックスを生成するために、放送を使用することです。したがって、これは2D行列であり、各行は右のブロックのデータを取得するために必要なインデックスであり、列の数はブロックのサイズによって決定されます。

非重複

ind = reshape(1 : numel(Data), [], numel(Data)/blksze).'; 

各行が1だけ増加し、列の数は、ブロックサイズによって決定されるインデックスのユニークなセットになるようにこれは単にベクトルを整形。


は最後に、あなたが必要なものを得るためにDataにだけインデックス:2、またはblksze = 2のブロックサイズで

>> rng(123); Data = rand(1, 6) 

Data = 

    0.6965 0.2861 0.2269 0.5513 0.7195 0.4231 

blocks = Data(ind); 

はここで6つの要素を使用して実行している例ですオーバーラップとオーバーラップの両方のために得られるものは次のとおりです。

>> 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の要素数がブロックサイズと互換性がなく、すべてのデータを同じサイズのブロックでキャプチャすると、インデックス作成時にエラーが発生します。

関連する問題