我有一個向量a = 1111000011100001110000100100
,我必須根據它計算兩個值:p00
和p11
。找到一個向量中的連續的00和11's
p00
是向量中發生的次數00
除以總的零數。例如,在上面的代碼中,00
正在發生的次數是8/16
(總數爲零)。
同樣,p11
是11
的出現次數除以1的總次數。
這是如何在Matlab中實現的?
我有一個向量a = 1111000011100001110000100100
,我必須根據它計算兩個值:p00
和p11
。找到一個向量中的連續的00和11's
p00
是向量中發生的次數00
除以總的零數。例如,在上面的代碼中,00
正在發生的次數是8/16
(總數爲零)。
同樣,p11
是11
的出現次數除以1的總次數。
這是如何在Matlab中實現的?
最安全和最普通的方法是使用正則表達式,因爲它們匹配運行的方式。
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.
我會將矢量添加到其自身,並向右移動一個元素。 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));
我沒有從這個代碼中得到合適的答案,從上面的例子中,p00的值應該是0.5,但是我得到了0.7。對於一個非常漫長的系列我得到無限。任何幫助將非常感激。 – Spaniard89 2011-12-15 13:02:24
這不會出於同樣的原因,我的替代解決方案不會。 – Nzbuu 2011-12-15 14:52:28
建議的解決方案是錯誤的!
這是一個應該工作,但效率不高(但比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)
您的問題沒有完全搞清楚。我計算了11個超過8'00'條目的向量。每個'00`對中只能出現一次'0'? – Boris 2011-12-15 13:20:58
我認爲測試用例顯示所有對必須是不重疊的。 – Nzbuu 2011-12-15 15:24:00