我需要报告数组中的序列数。例如:
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])
和
4 -1s ([-1 -1 -1 -1])
。
如何找到有多少数字序列?
答案 0 :(得分:1)
您可以使用run-length encoding执行此任务
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);
将行程编码应用于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 ]
所以,如果你对长度的序列数感兴趣> n
您需要的只是
>> nnz( rl > n )
答案 1 :(得分:0)
如果A
中只有少量可能的元素值(如问题中只有三个值的示例,-1
,0
和{{1你可以遍历这些并使用以下几个步骤来获得不同序列的长度。
以下是检查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()
在这里我们可以看到有一个长度为5的序列,后面跟着一个长度为4的序列和一个长度为2的序列。我们还可以使用>> C = find(diff(B)==-1)-find(diff(B)==1)
C =
5 4 2
来获取向量中这些长度的频率。
histc()
使用其他值重复该过程,例如检查>> D = histc(C,1:max(C))
D =
0 1 0 1 1
会给我们:
B = [0, A==1, 0];