MATLABである配列内の要素について、条件を満たすものを抜き出したり、それらを別の値に置き換えたりする方法です。

普段、MATLABとRの両方をよく使っており、ついついコードの書き方が混ざってしまうのでまとめました。

目次

array型の配列Aを作成。

rng default
A = randi(15,5)

上のコマンドを入力した結果、配列Aは次の要素をもつ。

A =
    13     2     3     3    10
    14     5    15     7     1
     2     9    15    14    13
    14    15     8    12    15
    10    15    13    15    11

以下、この配列Aを使い例示する。

条件を満たす論理行列を得たいとき(元の配列と同じ次元数)

たとえば、Aの要素が「13より大きい」かどうかを判断し、その結果の論理行列をBに格納。

B = A > 13

元の配列Aと同じ次元数(5×5)の論理行列Bが得られる。

B =
  5×5logical 配列
   0   0   0   0   0
   1   0   1   0   0
   0   0   1   1   0
   1   1   0   0   1
   0   1   0   1   0

条件を満たす配列要素の値を得たいとき(列ベクトル)

以下のように書くと、条件を満たす配列Aの要素の値が、1次元の列ベクトルとして出力される。(必要があれば、別の変数に代入して使用)

A(B)
ans =
    14
    14
    15
    15
    15
    15
    14
    15
    15

またこの結果は、以下のコマンドで得られる結果と同じ。

A(A > 13)

条件を満たす配列要素の場所情報を得たいとき(find関数)

条件を満たす要素が配列A内のどこに存在しているか知りたいときは、find()関数を使う。

線形インデックスからなる列ベクトルで返す場合

たとえば、「13より大きい」要素がある場所を返したいときは、以下のコマンドを入力する。

I = find(A>13)
I =
     2
     4
     9
    10
    12
    13
    18
    20
    24

ただこの結果は、2次元以上の配列で使う場合にちょっと不便なこともあるので、そのようなときは条件を満たす配列要素が存在する行と列の添え字を返すようにする。

行と列の添え字を返させたい場合

添え字用の変数を指定する。

[row, col] = find(A > 13)

これで変数rowcolから、A(2,1)A(4,1)などに条件を満たす配列要素が存在することがわかる。

row =
     2
     4
     4
     5
     2
     3
     3
     5
     4

col =
     1
     1
     2
     2
     3
     3
     4
     4
     5

条件を複数指定したいとき

論理演算子を使い、条件を羅列すればOK。

たとえば、「13より大きい」かつ「15より小さい」であれば、&を使う。(ORなら|、NOTなら~

A(A > 13 & A < 15)
ans =
    14
    14
    14

論理行列が必要な場合は、

B = A > 13 & A < 15
B =
  5×5logical 配列
   0   0   0   0   0
   1   0   0   0   0
   0   0   0   1   0
   1   0   0   0   0
   0   0   0   0   0

など、上記の「条件を満たす配列要素の値を得たいとき」と同様に記述する。

条件を満たす配列要素を別の値で置換したいとき

外れ値などを別の値に置き換えたいときなどに便利。

たとえば、「10以下」の値をすべてNaN値(非数値)に置き換えたいときは、論理行列の仕組みを利用し、置換したい値を代入する。

A(A <= 10) = NaN
A =
    13   NaN   NaN   NaN   NaN
    14   NaN    15   NaN   NaN
   NaN   NaN    15    14    13
    14    15   NaN    12    15
   NaN    15    13    15    11

参考情報

参考にした公式Webページは以下。