粗大メモ置き場

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

matlabで行列の特定の値を持つ行を検出・置換・削除する

今回はfind関数を主に使っていきたいと思います。

find:特定の条件に一致する部分を調べる

等号条件

例> 行列 A から値が0である箇所を探す。

find(A==0)

この際の出力は1次元の配列になります。m行n列のi行j列目にある場合は,i*n+j として出力されることに注意。

以下のようなコードを書いて位置との対応を掴んでください。

mg = magic(4)
find(mg==1)

なお,後ろにfind(A==0,3)などと数値を列挙すると条件に一致する部分のうち数値の数だけ列挙してくれます。

不等号条件

例> 行列 A から値が10より大きい箇所を探す。

find(A>10)

findを使わない場合の記法との比較

findを使わずとも

A==0

という表記単体で,条件に一致するか否かの論理値を得ることができます。

A = magic(3)

A =

     8     1     6
     3     5     7
     4     9     2

>> A>5

ans =

     1     0     1
     0     0     1
     0     1     0

findではこの論理値行列の代わりに条件を満たす行列のindexをそのまま返します。

>> find(A>5)

ans =

     1
     6
     7
     8

特定の条件に一致する部分を置換

先程調べた箇所を行列に代入することで置換できます。

試しに行列の中で特定の条件を満たす部分を0にしてみましょう。

mg = magic(4)
place = find(mg>10)
mg(place)=0

魔法陣mgのうち,10より大きい成分の位置がplaceに入り,
mgのうちのplaceに該当する部分をまとめて0に置換できています。

これは,次のように縮めて書くことが多いです。

mg = magic(4)
mg(find(mg>10)) = 0

追記:先程述べた表記を活用すればfindを省略しても以下のように書くことも可能です。

mg = magic(4)
mg(mg>10) = 0

特定の条件に一致する部分を削除

同様に特定の値ではなく [] を代入することで該当する箇所を削除可能です。

例>ベクトルAのうち,0に該当する箇所を削除。

A(find(A==0)) = []

あるいは

A(A==0) = []

どうやらmatlabの仕様上では