2012-10-25 181 views
4

我有一個單元陣列產生從某個代碼如下:刪除包含從細胞陣列零在MATLAB行

m = 

    [   0] 'GO:0008150' 
    'GO:0008150' 'GO:0016740' 
    'GO:0016740' 'GO:0016787' 
    'GO:0016787' 'GO:0006810' 
    'GO:0008150' 'GO:0006412' 
    'GO:0016740' 'GO:0004672' 
    'GO:0016740' 'GO:0016779' 
    'GO:0016787' 'GO:0004386' 
    'GO:0016787' 'GO:0003774' 
    'GO:0016787' 'GO:0016298' 
    'GO:0006810' 'GO:0016192' 
    'GO:0006412' 'GO:0005215' 
    'GO:0004672' 'GO:0030533' 
    [   0] 'GO:0008150' 
    [   0] 'GO:0016740' 
    'GO:0008150' 'GO:0016787' 
    'GO:0008150' 'GO:0006810' 
    'GO:0006810' 'GO:0006412' 
    [   0] 'GO:0004672' 
    [   0] 'GO:0016779' 
    [   0] 'GO:0004386' 
    'GO:0016192' 'GO:0003774' 
    [   0] 'GO:0016298' 
    [   0] 'GO:0016192' 
    'GO:0006810' 'GO:0005215' 
    'GO:0005215' 'GO:0030533' 

我需要刪除它包含零(例如行:行之一應是刪除,因爲我們在第一列有一個零)。 所以如何從這個數組中創建一個不包含零的數組?

+0

從你的榜樣,並且作爲@Rody Oldenhuis隱含凸顯,這是更適合作爲尋找'char'與'double'而不是零與非零) – gevang

回答

6

您可以在一個漂亮的一行做到這一點:

m(any(cellfun(@(x)x(1)==0, m),2), :) = [] 

或者:

m(any(~cellfun(@ischar, m),2), :) = [] 

這是一個稍快一點。

如果你能肯定的是,只有第一列將永遠包含零,使用

m = m(cellfun(@ischar, m(:,1)),:) 

,最後,你可以使用

m = m(cellfun('isclass', m(:,1), 'char'),:) 

看起來「老」,但實際上有更好的表現。

測試你的榜樣陣列上這些一千倍,給人

Elapsed time is 1.382801 seconds. 
Elapsed time is 0.138519 seconds. 
Elapsed time is 0.075245 seconds. 
Elapsed time is 0.014674 seconds. 
+0

與性能測試的良好努力.. – angainor

2
zerosLocation = cellfun(@(x)isEqual(x, 0) , m); 
    zeroRows = any(zerosLocation,2); 
    m(zeroRows,:) = [];