Удаление строк NaN и ячеек [] из массива ячеек в Matlab - PullRequest
0 голосов
/ 26 декабря 2018

У меня есть массив ячеек, заданный как

raw = {100 3.2 38 1;
       100 3.7 38 1;
       100 'NaN' 'NaN' 1;
       100 3.8 38 [];
       'NaN' 'NaN' 'NaN' 'NaN';
       'NaN' 'NaN' 'NaN' []; 
        100 3.8 38 1};

Как удалить строки, в которых есть хотя бы одна строка 'NaN' и пустая ячейка []?Таким образом, в этом случае я хочу удалить 3-й, 4-й, 5-й и 6-й ряд из вышеупомянутого массива ячеек.Заранее спасибо!

Ответы [ 2 ]

0 голосов
/ 26 декабря 2018

Чтобы найти, в какой строке выполняется 'NaN:

idxNan = any(cellfun(@(x) isequal(x,'NaN'),raw),2);

Аналогично, чтобы найти, в каких строках выполняются пустые ячейки:

idxEmpty = any(cellfun(@(x) isempty(x),raw),2);

Тогда вы можете пропустить строки, которые вы не делаетехотите использовать 'или'

raw(idxNan | idxEmpty,:) = [];

заменить | на & если это то, что вы имели в виду

0 голосов
/ 26 декабря 2018

В вашем подвале значения NaN определены как строковые, а не как «специальные» значения NaN

В этом случае вы можете использовать функции isempty и isfloat, чтобы определить, какие элементыпустых ячеек либо типа float:

% Remove rows with empty cells
idx=any(cell2mat(cellfun(@isempty,raw,'UniformOutput',false)),2)
raw(idx,:)=[]

% Remove rows with 'NaN'
idx=all(cell2mat(cellfun(@isfloat,raw,'UniformOutput',false)),2)
raw(~idx,:)=[]

На первом шаге вы ищите пустые ячейки, используя функцию isempty, поскольку входные данные представляют собой ячейку, которую вы должны использовать cellfunприменить functino ко всем элементам массива ячеек.

isempty возвращает целую ячейку 0 и 1, где 1 идентифицирует пустую ячейку, поэтому после преобразования ее вВ массиве (с помощью functino cell2mat) вы можете идентифицировать индексы roww с пустой ячейкой, используя функцию any.

. Во втором шаге, с аналогичным подходом, вы можете идентифицировать строки, содержащиеплавающие значения с функцией `isfloat.

Тот же подход можно использовать в случае, если NaN в вашем подвале определено как" значения ", а не как строки:

idx=any(cell2mat(cellfun(@isempty,raw,'UniformOutput',false)),2)
raw(idx,:)=[]
idx=any(cell2mat(cellfun(@isnan,raw,'UniformOutput',false)),2)
raw(idx,:)=[]
...