1

配列内のシーケンスの数を報告する必要があります。例えば:

A=[ 1 1 -1 -1 -1 -1 -1 0 1 -1 -1 -1 -1 1 1 -1 -1 1 0 1 1]

そして、数字が連続して来る回数を報告する必要があります。

5 -1s ([-1 -1 -1 -1 -1])および 1 つのシーケンス

4 -1s ([-1 -1 -1 -1]).

数列がいくつあるかを調べるにはどうすればよいですか?

4

2 に答える 2

1

You may use run-length encoding to perform this task

function [rl data] = runLength( vec )
% run length encoding for vector vec
rl = ( find( vec ~= [vec(2:end), vec(end)+1] ) );
data = vec( rl );
rl(2:end) = rl(2:end) - rl(1:end-1);

Applying run-length encoding to A

>> [rl data] = runLength( A )
rl =
   [ 2 5 1 1 4 2 2 1 1 2 ]
data =
   [ 1 -1 0 1 -1 1 -1 1 0 1 ]

So, if you are interested in the number of sequences of length > n all you need is

>> nnz( rl > n )
于 2013-02-12T12:41:41.473 に答える
0

可能な要素の値が少数しかない場合A(問題の例のように、-10の3 つの値しかない場合1)、これらをループし、次のいくつかの手順を使用して、異なるシーケンスの長さを取得できます。

チェックの例を次に示しますA == -1

A = [1 1 -1 -1 -1 -1 -1 0 1 -1 -1 -1 -1 1 1 -1 -1 1 0 1 1];
B = [0, A==-1, 0];

diff()関数を使用して各シーケンスの開始と終了を検出し、2 つのベクトルを減算してシーケンスの長さを取得します。

>> C = find(diff(B)==-1)-find(diff(B)==1)

C =

     5     4     2

ここでは、長さ 5 のシーケンスが 1 つあり、その後に長さ 4 のシーケンスと長さ 2 のシーケンスが 1 つずつあることがわかります。histc()これらの長さの頻度をベクトルで取得するために使用することもできます。

>> D = histc(C,1:max(C))

D =

     0     1     0     1     1

手順を別の値で繰り返します。たとえば、チェックすると、次のようになりB = [0, A==1, 0];ます。

C =

     2     1     2     1     2

D =

     2     3
于 2013-02-12T12:26:47.010 に答える