バッファ行列を生成することです。ここで、この行列の各行は、配列の重複したn
要素です。これを作成したら、配列にインデックスを付けて、1をすべて含む最初の行を見つけます:
x = [0 0 1 0 1 1 1 0 0 0]; %// Example data
n = 3; %// How many times we look for duplication
%// Solution
ind = bsxfun(@plus, (1:numel(x)-n+1).', 0:n-1); %'
out = find(all(x(ind),2), 1);
最初の行は微妙です。 bsxfun
を使用してサイズm x n
の行列を生成します。ここで、m
はオーバーラップする近傍の総数です。n
は検索するウィンドウのサイズです。これは、1行目が1からn
まで列挙され、2行目が2からn+1
まで列挙され、最後までnumel(x)-n+1
からnumel(x)
までの行列が生成されます。 n = 3
を考えると、私たちは持っている:
>> ind
ind =
1 2 3
2 3 4
3 4 5
4 5 6
5 6 7
6 7 8
7 8 9
8 9 10
これらの私たちは、配列x
へのインデックスとして使用するインデックスがあり、そしてあなたの例のためには、次のバッファ行列を生成する際にx
に、私たちは直接インデックス:
>> x = [0 0 1 0 1 1 1 0 0 0];
>> x(ind)
ans =
0 0 1
0 1 0
1 0 1
0 1 1
1 1 1
1 1 0
1 0 0
0 0 0
各行は、n
要素の重複する近傍です。私たちは最終的に私たちにすべて1を与える最初の行を検索することで終わります。これは、all
を使用し、2
を2番目のパラメータとして、すべての行を独立して検索することによって行われます。 all
は、行のすべての要素がゼロでない場合はtrue
を生成します。次に、find
と組み合わせて、この制約を満たす最初の非ゼロ位置を決定します。そのため:
>> out = find(all(x(ind), 2), 1)
out =
5
これは、この重複の始まりはn
回発生場所x
の第五の場所があることを教えてくれる。ループと
あなたはループでOKですか? –
@MadPhysicistループするのはうれしいです。 – tannoreth
あなたはループしていませんか? –