ドキュメンテーション

最新のリリースでは、このページがまだ翻訳されていません。 このページの最新版は英語でご覧になれます。

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

1 つ以上の条件を配列に適用して配列要素をフィルター処理できます。たとえば、行列の偶数要素のみを調べる場合は、多次元配列内のすべての 0 の位置を検索するか、離散データセット内の NaN 値を置き換えます。関係演算子および論理演算子を組み合わせて、これらのタスクを実行します。関係演算子 (>, <, >=, <=, ==, ~=) は配列に条件を課します。論理演算子 andor およびnot は、それぞれ &| および ~ で示され、これらと関係演算子を連結し、複数の条件を適用することができます。

1 つの条件の適用

1 つの条件を適用するには、まず、1 ~ 15 の間のランダムな整数から構成される 5 行 5 列の行列 A を作成します。

rng(0)
A = randi(15,5)
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 のどの要素が 9 未満であるかを判断します。結果を B に格納します。

B = A < 9
B =

     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

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

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

A(B)
ans =

     2
     2
     5
     3
     8
     3
     7
     1

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

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

I = find(A < 9)
I =

     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
     3
     8
     3
     7

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

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

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

     2
     2
     8

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

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

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

     8

その結果、偶数、9 未満および 2 と等しくないものとして 8 が検出されます。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 =

    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 になりました。

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

A(A~=10) = NaN
A =

    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

結果の行列の要素の値は 10 または NaN になります。

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

A(isnan(A)) = 0;
C = ~A
C =

     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 値が論理値 1 (true) に、10 が論理値 0 (false) になります。NOT の論理演算 ~A は、A&C が論理値 0 (false)、A|C が論理値 1 (true) の行列を返せるように数値配列を論理配列に変換します。

参考

| | | | | | |

この情報は役に立ちましたか?