1

Matlab に配列があるとします。

x = [1 1 1 2 2 2 3 3 3 3 2 2 3 3 3 1 1 1 1 1 2 2 2 2 3 3 3]

連続した s の最新のセットのインデックスが必要です'1'。この場合、私は答えが欲しい:

answer = [16 17 18 19 20] % (which should correspond to the last sequence of 1's)

Matlab でこれを行う自動化された方法が必要です。これは、任意のサイズの配列で動作し、連続する 1 の最後のセットのインデックスを常に提供します。

助言がありますか?

4

3 に答える 3

2

これを行う1つの方法は次のとおりです。

I=find(diff([0, x==1, 0]),2,'last');
answer = I(1):I(2)-1;

x==11どこでもx等しい論理ベクトルを返し1ます0

>> x==1
ans =
 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 1 1 1 1 1 0 0 0 0 0 0 0

それに関数を適用すると、連続する s が削除され、最後の非ゼロの 2 つの要素がs の元のシーケンスに関連するdiff別のベクトルが得られます11

>> diff(x==1)
 0 0 -1 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 -1 0 0 0 0 0 0

ただし、最初と最後の要素1に forx=[0 0 1 1 1]や などの が含まれている場合、これを使用すると失敗しx=[1 1 1 0 0]ます。したがって0、先頭と末尾に追加し、findそれらのインデックスを返します

>> I = find(diff(x==1), 2, 'last')
I =
    16    21

2 番目の引数は返してほしい要素の数を示し、3 番目の引数はそれらが最初の要素か最後の要素かを示します。そして今、あなたは答えを作成することができます

answer = I(1):I(2)-1;
于 2013-07-01T17:24:46.430 に答える
1

私はFEX:findseqを書いて、値の開始/終了位置と連続するストリークの長さを見つけました。

x = [1 1 1 2 2 2 3 3 3 3 2 2 3 3 3 1 1 1 1 1 2 2 2 2 3 3 3];

seq = findseq(x)
seq =
     1     1     3     3
     2     4     6     3
     3     7    10     4
     2    11    12     2
     3    13    15     3
     1    16    20     5
     2    21    24     4
     3    25    27     3

どこ:

  • 1 列目: 繰り返される値
  • 2列目:開始位置
  • 3列目:終了位置
  • 4列目:繰り返し要素数

そこから、最後の連続した 1 の位置を取得できます。

pos = find(seq(:,1) == 1,1,'last');
seq(pos,2):seq(pos,3)
ans =
    16    17    18    19    20
于 2013-07-01T19:57:15.763 に答える