1行に1つのNaN要素がありますが、削除します。行列からNaN要素を削除する
A=[NaN 1 2;
3 NaN 4;
NaN 5 6];
所望の出力は次のようになります。ここでは
[1 2;
3 4;
5 6]
1行に1つのNaN要素がありますが、削除します。行列からNaN要素を削除する
A=[NaN 1 2;
3 NaN 4;
NaN 5 6];
所望の出力は次のようになります。ここでは
[1 2;
3 4;
5 6]
されて - コードが堅牢ではないことに注意してください。実際にすべての行には、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
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))'
+1ベクトル化。しかし同じ警告には、1行に少なくとも1ナノが必要です。 – Marc
私はそれが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
上記以外のものは、サイズと寸法の取り扱いです。
本当に、あなたのコードは、質問が何を求めていたのですか? 'A(isnan(A))= []'は 'A'の列方向の配列を返します。 'reshape'を適用すると(' sz(A、。) 'との構文エラーに注意してください)、最終的に第1行と第2行の最初の要素を入れ替えます。 –
@ T.K。 、ありがとう、確かに私は間違いがあった。それを私が直した。 –