2016-05-18 2 views
0

Мне нужна помощь для ускорения этой функции, которую я создал для удаления элементов NaN в массиве ячеек.MATLAB - Удалить элементы NaN в массиве ячеек. Помогите ускорить функцию

Чтобы лучше объяснить мою функцию с примером. Предположим, у нас есть массив ячеек, у меня есть массив ячеек в форме indx{ii}, где каждый ii представляет собой массив размером 1xNii (это означает, что массивы имеют разный размер) с элементами NaN.

datawithNaN{1}=[1,4,8,6]; 
datawithNaN{2}=[4,6,2]; 
datawithNaN{3}=[9,8,NaN]; 
datawithNaN{4}=[3,NaN,NaN]; 
datawithNaN{5}=[NaN,NaN,NaN,NaN]; 

Что я хочу, чтобы функция функции выполняла удаление всех элементов NaN в массиве ячеек. Таким образом, ответ на пример должен быть:

datawithoutNaN{1}=[1,4,8,6]; 
datawithoutNaN{2}=[4,6,2]; 
datawithoutNaN{3}=[9,8]; 
datawithoutNaN{4}=[3]; 
datawithoutNaN{5}=[]; 

До сих пор я написал функцию, которая дает мне результат я хочу, но это занимает слишком много времени, особенно при работе с большими массивами ячеек или большими массивами внутри массива ячеек , Моя функция:

function result = rmNaN(datawithNaN) 

[row_cell, col_cell] = size(datawithNaN); 
result = cell(row_cell, col_cell); 
for i=1:row_cell 
    for j=1:col_cell 
     [row,col]=size(datawithNaN{i,j}); 
     if col>row 
      datawithNaN{i,j}=datawithNaN{i,j}'; 
      [row,~]=size(datawithNaN{i,j}); 
     end 
     for k=1:row 
      if ~isnan(datawithNaN{i,j}(k)) 
       result{i,j}(k) = datawithNaN{i,j}(k); 
      else 
       continue 
      end 
     end 
    end 
end 

ответ

0

Вы можете легко сделать это с cellfun.

datawithoutNaN = cellfun(@(x)x(~isnan(x)), datawithNaN, 'uniform', 0); 

Это идет через каждый элемент массива клеток, использует isnan, чтобы определить, какие элементы в массиве NaN и дает логический массив того же размера, как x где true, где это NaN и false иначе , Затем он отменяет это и использует его как логический индекс, чтобы захватить только значения не Nan и вернуть их. Ввод 'uniform' гарантирует, что результатом будет также массив ячеек.

+0

Я пробовал, и он отлично работает! И проще, чем я написал! Благодаря :). –

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