2014-11-22 58 views
1

我用零來分割矢量時遇到了問題。如何在MATLAB中用零分割矢量

我具有例如矢量

V = [1 3 2 6 4 0 0 2 4 6 0 0 0 3 1]

我需要得到載體等

V1 = [1 3 2 6 4]

V2 = [2 4 6]

v3 = [3 1]

有什麼辦法可以通過使用MATLAB函數來做到這一點?

當然我不知道主矢量v中包含了多少個子矢量,以及有多少零用於界定矢量。

我不是程序員,也不是MATLAB中的專家。 我知道一個程序化的方法來做到這一點,但希望通過MATLAB來做到這一點。

我發現一個函數A = strsplit(str,delimiter)但我沒有字符串我有一個向量。 所以我搜索了轉換函數。我發現S = char(V),但是當我執行它時它崩潰了。

+0

崩潰,你的意思是你有錯誤?發佈錯誤請 – Oleg 2014-11-22 11:30:37

回答

3

最好將輸出作爲單元格數組,而不是單獨的變量。這樣輸出將更容易處理。

試試這個:(對於你的例子)

v = [1 3 2 6 4 0 0 2 4 6 0 0 0 3 1]; %// data 
w = [false v~=0 false]; %// "close" v with zeros, and transform to logical 
starts = find(w(2:end) & ~w(1:end-1)); %// find starts of runs of non-zeros 
ends = find(~w(2:end) & w(1:end-1))-1; %// find ends of runs of non-zeros 
result = arrayfun(@(s,e) v(s:e), starts, ends, 'uniformout', false); %// build result 

結果:

>> result{:} 
ans = 
    1  3  2  6  4 
ans = 
    2  4  6 
ans = 
    3  1 
+0

非常好的+1,.. – Rashid 2014-11-22 11:25:25

+2

比@ oleg-komarov的答案更好,因爲這是一般性的,Oleg的只適用於整數1-9,而不是10以上,而不是浮點值 – 2014-11-22 14:04:38

2

爲小於9 整個數(所以有一個非常具體的解決方案,向量的strsplit()解決方案一般的解決方案見Luis Mendo's)。拆分並轉換回數字:

res = strsplit(char(v), char(0)); 
res = cellfun(@(x) x - 0,res,'un',0); 

celldisp(res) 
res{1} = 
    1  3  2  6  4 
res{2} = 
    2  4  6 
res{3} = 
    3  1 
+2

您必須成爲但是,小心,這隻會有整數向量。浮點條目將被截斷爲整數。 – lmNt 2014-11-22 11:38:53

+0

@lmNt很好。 – Oleg 2014-11-22 12:55:40