2016-05-18 6 views
0

Ich brauche Hilfe, um diese Funktion zu beschleunigen, die ich erstellt habe, um NaN-Elemente in einem Zellenfeld zu entfernen.MATLAB - Entfernen Sie NaN-Elemente im Zellenfeld. Hilfe, um eine Funktion zu beschleunigen

Um meine Funktion besser mit einem Beispiel zu erklären. Angenommen, wir haben ein Zellenarray von Ich habe ein Zellenarray auf dem Formular indx{ii}, wobei jedes ii ein Array der Größe 1xNii ist (dies bedeutet, dass die Arrays unterschiedliche Größe haben) mit NaN Elementen.

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]; 

Was ich will die Funktion Funktion zu tun ist, entfernen Sie alle NaN-Elemente im Zell-Array. So ist die Antwort für das Beispiel sollte sein:

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

Bisher habe ich eine Funktion geschrieben, die mir das Ergebnis gibt ich will, aber es dauert zu lange, besonders wenn sie mit großen Zellen-Arrays oder große Arrays innerhalb des Zellenfeldes Arbeits . Meine Funktion ist:

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 

Antwort

0

Sie können dies leicht mit cellfun erreichen.

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

Dies geht durch jedes Element des Zellenfeldes verwendet isnan, um zu bestimmen, welche Elemente in dem Array NaN sind und ergibt eine logische Array die gleiche Größe wie x wo es true ist, wo es ein NaN und false sonst . Dann negiert es dies und verwendet es als logischen Index, um nur die Nicht-Nan-Werte zu erfassen und zurückzugeben. Der Eingang 'uniform' stellt sicher, dass das Ergebnis auch ein Zellen-Array ist.

+0

Ich habe es versucht und es funktioniert perfekt! Und einfacher als das, was ich geschrieben hatte! Vielen Dank :). –