2013-06-02 162 views
3

我有一張圖片,我只剪出一列。之後,我把它變成了邏輯,所以在這一列中只有0和1。如何計算矩陣中的1和0的數量?

假設我在此列中的值是

1111000110000000000000011111111 

我要算那些每塊1或0的每個塊的長度。

其結果將是

1 - 4 (first 1) 
0 - 3 (first 0) 
1 - 2 
and so on... 

我只知道算整個列,但我不能爲每個不同的塊做。任何人都請幫助我。

+0

@Shai該如何[標籤:矢量]標籤與此有關? –

+0

@EitanT - 解決方案是通過矢量化,而不是循環 – Shai

+0

@Shai但問題不在於矢量化_se se _...我認爲這個標籤應該保留用於專門針對向量化代碼實現的問題。如果你的答案恰好是矢量化的,這很好,但是這不應該成爲重複的原因。這裏的大多數MATLAB問題的答案都可以是矢量化的,但這並不意味着它們都應該在這個標籤下。 –

回答

6

vec是零和一的矢量(1逐n),那麼你可以使用下面的代碼

rl = (find(vec ~= [vec(2:end), vec(end)+1])); 
data = vec(rl); 
rl(2:end) = rl(2:end) - rl(1:end-1); 

rl會給你連續的零和一的數量,而data會告訴你每個塊是零還是一個。

此問題與run length coding密切相關。

演示:

vec = [1 1 1 1 0 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 1 1 1 1 1 1]; 
rl = (find(vec ~= [vec(2:end), vec(end)+1])); 
data = vec(rl), 
rl(2:end) = rl(2:end) - rl(1:end-1), 

data = 
    1  0  1  0  1 

rl = 
    4  3  2 14  8 
+0

謝謝。我已經嘗試過,但是我得到了一個錯誤。是因爲我的vec是n-1而不是n-1?錯誤是「使用horzcat CAT參數維度不一致的錯誤。」 –

+0

如果你的向量是'n'-by-1,你可以簡單地使用'vec = vec'來轉置它。';' – Shai

+0

是的,這正是我想要的。但是我可以問你嗎?如果我只看rl,那麼我怎麼知道每一個都是1或0?任何想法? –