查找数组中的序列数

时间:2013-02-11 09:40:38

标签: matlab numbers sequences

我需要报告数组中的序列数。例如:

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])

如何找到有多少数字序列?

2 个答案:

答案 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中只有少量可能的元素值(如问题中只有三个值的示例,-10和{{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];