メインコンテンツ

条件を満たす配列要素の検索

この例では、条件を配列に適用して、配列の要素をフィルター処理する方法を説明します。たとえば、行列の偶数要素を調べたり、多次元配列内のすべての 0 の位置を特定したり、データ内の NaN 値を置き換えたりできます。これらのタスクは関係演算子および論理演算子の組み合わせにより実行できます。関係演算子 (><>=<===~=) は配列に条件を課します。これらを論理演算子 and (&)、or (|) および not (~) により連結することで、複数の条件を適用することができます。

単一条件の適用

単一条件を適用するため、まず、1 ~ 15 の間のランダムな整数から構成される 5 行 5 列の行列を作成します。再現性を得るため、乱数発生器を既定の状態にリセットします。

rng("default")
A = randi(15,5)
A = 5×5

    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 のどの要素が 9 未満であるかを判断します。結果を B に格納します。

B = A < 9
B = 5×5 logical array

   0   1   1   1   0
   0   1   0   1   1
   1   0   0   0   0
   0   0   1   0   0
   0   0   0   0   0

結果は logical 行列になります。B のそれぞれの値は、A の対応する要素が条件 A < 9 を満たしているかどうかを示す logical 1 (true) または logical 0 (false) です。たとえば、A(1,1)13 なので、B(1,1) は logical 0 (false) になります。しかし、A(1,2)2 なので、B(1,2) は logical 1 (true) になります。

B には A"どの" 要素が 9 未満であるかという情報が含まれていますが、B からそれらの "値" についてはわかりません。2 つの行列を要素ごとに比べずに、B を使用して A へのインデックス付けができます。

A(B)
ans = 8×1

     2
     2
     5
     3
     8
     3
     7
     1

結果は、9 未満の A の要素からなる列ベクトルです。B は logical 行列なので、この演算は "論理インデックス付け" と呼ばれます。この場合、インデックスとして使用される logical 配列は、インデックスを付けている配列と同じサイズですが、これは必ずしも必要ではありません。詳細については、配列インデックス付けを参照してください。

問題によっては、条件を満たす配列要素の実際値ではなく、その "場所" に関する情報が必要な場合があります。この例では、関数 find を使用して A 内の 9 未満のすべての要素を検索します。

I = find(A < 9)
I = 8×1

     3
     6
     7
    11
    14
    16
    17
    22

結果は、線形インデックスの列ベクトルです。それぞれのインデックスは A 内の 9 未満の要素の位置を示すので、A(I)A(B) と同じ結果を返します。違いは、A(B) は論理インデックス付け、A(I) は線形インデックス付けを使用することです。

複数の条件の適用

論理演算子 andor および not を使用して複数の条件を配列に適用できます。条件の数は 1 つまたは 2 つに制限されません。

まず、& で示される論理演算子 and を使用して、9 未満および 2 より大きい、という 2 つの条件を要素に指定しなければなりません。両方の条件を満たす要素を表示するためには、条件を論理インデックスとして指定します。

A(A<9 & A>2)
ans = 5×1

     5
     3
     8
     3
     7

結果は、両方の条件を満たす A 内の要素のリストです。必ず論理演算子で別々のステートメントを連結し、それぞれの条件を指定してください。たとえば、A(2<A<9)A(2<A | A<9) に評価されるので、上記の条件の指定には使用できません。

次に、A から "9 未満" かつ "偶数" の要素を検出します。

A(A<9 & ~mod(A,2))
ans = 3×1

     2
     2
     8

結果は、A 内のすべての 9 未満の偶数の要素のリストです。not の論理演算子 ~ は、行列 mod(A,2) を logical 行列に変換します。logical 1 (true) の値は、要素が 2 の倍数 (偶数) である場所に示されます。

最後に、A から "9 未満" かつ "偶数" かつ "2 と等しくない" 要素を検出します。

A(A<9 & ~mod(A,2) & A~=2)
ans = 
8

結果の 8 は 9 未満で、偶数であり、2 と等しくありません。8 は A 内で 3 つすべての条件を満たす唯一の要素です。

関数 find を使用して条件を満たす 8 の要素のインデックスを取得します。

find(A<9 & ~mod(A,2) & A~=2)
ans = 
14

結果は、A(14) = 8 と示されます。

条件を満たす値の置換

複数の既存の配列要素の値を同時に変更できると便利な場合があります。簡単な代入ステートメントを含む論理インデックス付けを使用して、条件を満たす配列内の値を置き換えます。

たとえば、A 内の 10 より大きい値をすべて 10 に置き換えます。

A(A>10) = 10
A = 5×5

    10     2     3     3    10
    10     5    10     7     1
     2     9    10    10    10
    10    10     8    10    10
    10    10    10    10    10

A 内の 10 と等しくない値をすべて NaN 値に置き換えます。

A(A~=10) = NaN
A = 5×5

    10   NaN   NaN   NaN    10
    10   NaN    10   NaN   NaN
   NaN   NaN    10    10    10
    10    10   NaN    10    10
    10    10    10    10    10

最後に、A 内のすべての NaN 値を 0 に置き換え、A に対して not の論理演算子を適用して ~A とします。

A(isnan(A)) = 0;
C = ~A
C = 5×5 logical array

   0   1   1   1   0
   0   1   0   1   1
   1   1   0   0   0
   0   0   1   0   0
   0   0   0   0   0

結果の行列では、NaN 値が logical 1 (true) に、10 が logical 0 (false) になります。not の論理演算 ~A は、A&C が logical 0 (false) の値の行列、A|C が logical 1 (true) の値の行列を返せるように数値配列 A を logical 配列 C に変換します。

参考

| | | | | | | |