2012-10-25 95 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,:) = [];