从matlab中的单元格数组中删除包含零的行

Glo*_*ria 4 matlab cells

我有一个由某个代码产生的单元格数组如下:

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'
Run Code Online (Sandbox Code Playgroud)

我需要删除包含零的行(例如:第一行应该被删除,因为我们在第一列中有一个零).那么如何从这个不包含零的数组创建一个数组呢?

Rod*_*uis 6

你可以在漂亮的单行中做到这一点:

m(any(cellfun(@(x)x(1)==0, m),2), :) = []
Run Code Online (Sandbox Code Playgroud)

或者:

m(any(~cellfun(@ischar, m),2), :) = []
Run Code Online (Sandbox Code Playgroud)

这有点快.

如果您可以确定只有第一列将包含零,请使用

m = m(cellfun(@ischar, m(:,1)),:)
Run Code Online (Sandbox Code Playgroud)

最后,你可以使用

m = m(cellfun('isclass', m(:,1), 'char'),:)
Run Code Online (Sandbox Code Playgroud)

看起来"老",但实际上有更大的表现.

在您的示例数组上测试这一千次,给出

Elapsed time is 1.382801 seconds.
Elapsed time is 0.138519 seconds.
Elapsed time is 0.075245 seconds.
Elapsed time is 0.014674 seconds.
Run Code Online (Sandbox Code Playgroud)