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

 Смежные вопросы

  • Нет связанных вопросов^_^