4

次のような特定のコードから生成されたセル配列があります。

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'

ゼロを含む行を削除する必要があります(たとえば、最初の列にゼロがあるため、行1を削除する必要があります)。では、この配列からゼロを含まない配列を作成するにはどうすればよいですか?

4

2 に答える 2

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'),:)

これは「古い」ように見えますが、実際にはパフォーマンスが優れています。

例の配列でこれらを1000回テストすると、次のようになります。

Elapsed time is 1.382801 seconds.
Elapsed time is 0.138519 seconds.
Elapsed time is 0.075245 seconds.
Elapsed time is 0.014674 seconds.
于 2012-10-25T14:59:40.813 に答える
2
  zerosLocation = cellfun(@(x)isEqual(x, 0 ) , m);
  zeroRows = any(zerosLocation,2);
  m(zeroRows,:) = [];
于 2012-10-25T15:00:00.427 に答える