2012-01-19 5 views

答えて

0

されて - コードが堅牢ではないことに注意してください。実際にすべての行には、NaN要素があると仮定しています。

ベクトル化された解決策ではありませんが、明確なコードのような他の利点もあります。

for i=1:size(A,1) 
    x = A(i,:); 
    x(isnan(x)) = []; 
    B(i,:) = x; 
end 

B

B =

1  2 
3  4 
5  6 
+1

本当に、あなたのコードは、質問が何を求めていたのですか? 'A(isnan(A))= []'は 'A'の列方向の配列を返します。 'reshape'を適用すると(' sz(A、。) 'との構文エラーに注意してください)、最終的に第1行と第2行の最初の要素を入れ替えます。 –

+0

@ T.K。 、ありがとう、確かに私は間違いがあった。それを私が直した。 –

6
A = [NaN 1 2 ; 3 NaN 4; NaN 5 6] 
sz = size(A); 
B = reshape(A', size(A,1)*size(A,2), 1); 
B(isnan(B)) = []; 
B = reshape(B, sz(2)-1, sz(1))' 
+0

+1ベクトル化。しかし同じ警告には、1行に少なくとも1ナノが必要です。 – Marc

2

私はそれが1行で行うことができると思ったが、私は間違っていました。 (追加された行は、私は以下の私のインデックス作成をデバッグするのに役立ちます)が与えられ

:以下のソリューションを参照してください

>> A = [NaN 1 2 ; 3 NaN 4; NaN 5 6; 7 8 NaN] 
A = 
    NaN  1  2 
    3 NaN  4 
    NaN  5  6 
    7  8 NaN 

その後:

>> Atrans = A'; 
>> B = reshape( Atrans(~isnan(Atrans)) ,[],size(Atrans,2))' 
B = 
    1  2 
    3  4 
    5  6 
    7  8 

ちなみに、簡単な論理的なチェックを行うのMatlabのイディオム論理的な索引付け操作内の配列上では非常に一般的であり、非常に有用です。一般的な例は次のとおりです。

>> x(x>0) %This returns a 1D column vector of all values of x 
      %which are greater than 0, regardless of the initial 
      %size of x. Multidimensional inputs are unwrapped 
      %column-first 

上記以外のものは、サイズと寸法の取り扱いです。

関連する問題