我有一个向量a = 1111000011100001110000100100
,我必须根据它计算两个值:p00
和p11
。
p00
是向量中00
出现的次数除以零的总数。例如,在上面的代码中,00
的出现次数是8/16
(零的总数)。
同样,p11
是11
的出现次数除以1的总数。
如何在Matlab中实现?
答案 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)