2016-05-18 27 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}=[]; 

これまでのところ、私は私が望む結果を与えるが、セル配列内の大きなセル配列または大きな配列を扱う際には、特別に時間がかかりすぎる機能を書かれています。 My機能は次のとおりです。

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

これはNaNであり、それ以外NaNfalseである場合、それはtrueあるxような論理アレイ同じサイズをもたらす配列内のどの要素を決定するためにisnanを使用して、セル配列の各要素を通過します。その後、これを否定し、それを論理インデックスとして使用して、Nanの値以外の値を取得して返します。 'uniform'入力は、結果がセル配列であることを保証します。

+0

私はそれを試して、完璧に動作します!私が書いたものより簡単です!ありがとう:) –

関連する問題