在向量中找到连续的00和11

时间:2011-12-15 11:32:49

标签: matlab vector division

我有一个向量a = 1111000011100001110000100100,我必须根据它计算两个值:p00p11

p00是向量中00出现的次数除以零的总数。例如,在上面的代码中,00的出现次数是8/16(零的总数)。

同样,p1111的出现次数除以1的总数。

如何在Matlab中实现?

3 个答案:

答案 0 :(得分:2)

最安全,最通用的方法是使用正则表达式,因为它们匹配运行的方式。

a = [1 1 1 1 0 0 0 0 1 1 1 0 0 0 0 1 1 1 0 0 0 0 1 0 0 1 0 0]
s = char(a + '0');
p00 = numel(regexp(s, '00')) / sum(a == 0)
p11 = numel(regexp(s, '11')) / sum(a == 1)

注意: 我很想沿着以下几点做点什么:

a = [1 1 1 1 0 0 0 0 1 1 1 0 0 0 0 1 1 1 0 0 0 0 1 0 0 1 0 0]
n = numel(a);
p00 = sum(a(1:n-1) == 0 & a(2:n) == 0) / sum(a == 0)
p11 = sum(a(1:n-1) == 1 & a(2:n) == 1) / sum(a == 1)

但是这不会给出正确的结果,因为它将序列0 0 0 0计为3而不是2。

答案 1 :(得分:0)

我会将向量添加到自身,并向右移动一个元素。 2-s的数量将是11-s的数量。 0-s的数量将是00-s的数量。我认为这是MATLAB中的一个自然解决方案。

或者,您可以实现有限状态机来解析向量。

a2  = a(2:end)+a(1:end-1);
p11 = length(find(a2 == 2))/length(find(a));
p00 = length(find(a2 == 0))/length(find(a==0));

答案 2 :(得分:0)

建议的解决方案错了!!!

这是一个应该有效的,但效率不高(但比regexp解决方案更快):

d0=0; i=1; 
while i<length(a) 
    if (a(i) == 0 & a(i)==a(i+1)) d0 = d0+1; i = i+1; end; 
    i=i+1;
end
p00 = d0/sum(a == 0)