粗大メモ置き場

個人用,たまーに来訪者を意識する雑記メモ

MATLABでNaNやInfを何とかしたい

ダジャレみたいな軽い記事です。

NaNを0に置換

Aという行列の中にNanがあってそれを0にする場合,以下のように書きます。

A(isnan(A))=0

なお,matlabではfor文はべらぼうに時間がかかるので
なるべく行列のまま処理したほうが計算時間の節約になります。

Infを0に置換

Aという行列の中にInfがあってそれを0にする場合,以下のように書きます。
なお,-Infも同様です

A(~isfinite(A))=0

種明かし

isnan(A)

というコマンドは行列Aのうち,Nanがある所を1,無い所を0の「論理値」で出力します。
はい,ここ重要です。
行列に論理値を食わせることで該当する箇所の値を参照できるらしいです。
なるほど~。

よくわからんので実験

以下のコードで実験してみました。

3*3の魔法陣を作ります。

Magi =[ 8  1  6; 3  5  7; 4  9  2]

代入するのは代数値でなければなりません。
例えば代数値の対角行列を入れてみる。

 Magi(diag([true true true]))

結果,ans = 8,5,2 と見事に対角の値だけにアクセスしています。

ならば,一つだけ食わせるとどうか?
なんと先頭の値にアクセスします。

 Magi(true)

結果:ans = 8

そして数値を足してずらせるようです。ポインタみたいだな。

 Magi(true+1)

結果:ans = 3

行 → 列の順に格納しているのがわかります。

 Magi(true+3)

結果:ans = 1

ほらね。


また,こんなことも出来ます。

Magi(true,true+1)

結果:ans = 1

う~ん,true=1として処理してるだけに見えてきた。

Infの方はなんか出力が逆ですが基本やってることは同じです。
ほ~ん。