2011-12-15 27 views
1

我有一個向量a = 1111000011100001110000100100,我必須根據它計算兩個值:p00p11找到一個向量中的連續的00和11's

p00是向量中發生的次數00除以總的零數。例如,在上面的代碼中,00正在發生的次數是8/16(總數爲零)。

同樣,p1111的出現次數除以1的總次數。

這是如何在Matlab中實現的?

+1

您的問題沒有完全搞清楚。我計算了11個超過8'00'條目的向量。每個'00`對中只能出現一次'0'? – Boris 2011-12-15 13:20:58

+0

我認爲測試用例顯示所有對必須是不重疊的。 – Nzbuu 2011-12-15 15:24:00

回答

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.

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)); 
+0

我沒有從這個代碼中得到合適的答案,從上面的例子中,p00的值應該是0.5,但是我得到了0.7。對於一個非常漫長的系列我得到無限。任何幫助將非常感激。 – Spaniard89 2011-12-15 13:02:24

+0

這不會出於同樣的原因,我的替代解決方案不會。 – Nzbuu 2011-12-15 14:52:28

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) 
相關問題