ドキュメンテーション センター

  • 評価版
  • 製品アップデート

このページは前リリースの情報です。該当の英語のページはこのリリースで更新されています。このリリースの英語のドキュメンテーションを参照するには、言語設定を United States に変更してください。

論理演算子

MATLAB® では、次の 3 種類の論理演算子と論理関数が提供されています。

ビット単位の関数を除き、MATLAB の論理演算子や論理関数から返される値のデータ型は logical で、論理インデックスでの使用に適しています。

要素単位の演算子と関数 

次の論理演算子と論理関数は、入力に対して要素単位の論理演算を行い、同じサイズの出力配列を生成します。

次の表に示す例は、次のようなベクトル入力 AB を使用しています。

A = [0 1 1 0 1];
B = [1 1 0 0 1];

演算子

説明

&

両方の配列で true (ゼロ以外) であるすべての要素の位置に 1 を返し、その他の全要素には 0 を返します。

A & B = 01001

|

どちらか一方、または両方の配列で true (ゼロ以外) であるすべての要素の位置に 1 を返し、その他の全要素には 0 を返します。

A | B = 11101

~

入力配列 A の各要素の補数を返します。

~A = 10010

xor

1 つの配列のみで true (ゼロ以外) であるすべての要素の位置に 1 を返し、その他の全要素には 0 を返します。

xor(A,B) = 10100

2 つの配列オペランドを取る演算子 (&|xor) や関数では、両方の配列の次元が同じで、各次元のサイズも同じでなければなりません。唯一の例外は、一方のオペランドがスカラーで、他方がスカラーでない場合です。この場合 MATLAB では、スカラーと他方のオペランドの全要素が比較されます。

    メモ:   MATLAB では、論理式への入力として使用される有限のゼロ以外の数値が、論理値 1 または true に変換されます。

演算子のオーバーロード

&|、および ~ の各演算子をオーバーロードして、使用対象のクラスに応じて動作を変えることができます。これらの演算子は、演算子が使用されるたびに呼び出される代表関数を備えています。各演算子を次の表に示します。

論理演算

等価な機能をもつ関数

A & B

and(A, B)

A | B

or(A, B)

~A

not(A)

その他の配列関数

要素単位以外の方法で配列を論理演算する MATLAB 関数としては、anyall があります。これらの関数では、ベクトル、または行列や配列内のベクトルの、"いずれか" または "すべて" の要素がゼロ以外であるかどうかが表されます。

行列に対して anyall を使用すると、行列の列に対して演算が実行されます。N 次元の配列に対して使用した場合は、配列の最初の大きさが 1 でない次元で演算が実行されます。または、追加の dimension 入力を指定し、配列の特定の次元に対して演算を実行することもできます。

次の表に示す例では、次の配列入力 A を使用します。

A = [0   1   2;
     0  -3   8;
     0   5   0];

関数

説明

any(A)

ベクトルの "いずれか" の要素が true (ゼロ以外)の場合はベクトルに 1 を返し、どの要素も true でない場合は 0 を返します。

any(A) ans = 0 1 1

all(A)

ベクトルの "すべて" の要素が true (ゼロ以外)の場合はベクトルに 1 を返し、全要素が true でない場合は 0 を返します。

all(A) ans = 0 1 0

    メモ:   関数 allany では、入力配列内の NaN 値は無視されます。

要素単位のショートサーキット演算子

要素単位の | 演算子と & 演算子を if 式や while 式のコンテキストで使用する場合は、このコンテキストに限り、式を評価するときにショートサーキット演算が行われます。つまり、A|B および A&B において、最初のオペランド A で結果が判断できる場合は、2 番目のオペランド B は無視されます。

したがって、ステートメント 1|[]false と評価されますが、if または while 式のいずれかで使用される場合には、同じステートメントが true と評価されます。

A = 1;   B = [];
if(A|B) disp 'The statement is true',  end;
   The statement is true

一方、ショートサーキットを行わない逆論理式では、false と評価されます。

if(B|A) disp 'The statement is true',  end;

要素単位の演算子を使用するショートサーキットの別の例としては、次のような論理式が考えられます。この式は、AB のサイズの不一致により、多くの状況で無効になりますが、

A = [1 1];   B = [2 0 1];
A|B        % This generates an error.

if または while 式のコンテキスト内では機能します。

if (A|B) disp 'The statement is true',  end;
   The statement is true

関数 find を使用した論理式

関数 find は、与えられた論理条件を満たす配列要素のインデックスを判別します。この関数は、マスクやインデックス行列の作成に役立ちます。最も一般的な場合では、関数 find ではインデックスの単一ベクトルが返されます。このベクトルを使用して、任意のサイズや形状の配列をインデックスすることができます。

たとえば、次のようになります。

A = magic(4)
A =
    16    2    3   13
     5   11   10    8
     9    7    6   12
     4   14   15    1

i = find(A > 8);
A(i) = 100
A =
   100    2    3  100
     5  100  100    8
   100    7    6  100
     4  100  100    1

    メモ:   このような場合には find を使用する代わりに、論理式自体を使用して行列をインデックスすることもできます。次の例を参照してください。

前述の例における最後の 2 つのステートメントは、次の 1 つのステートメントに置き換えることができます。

A(A > 8) = 100;

また、関数 find を使用して、論理条件を満たす配列値の四角形行列の行インデックス、および列インデックスを取得することもできます。

A = magic(4)
A =
    16    2    3   13
     5   11   10    8
     9    7    6   12
     4   14   15    1

[row, col] = find(A > 12)
row =
     1
     4
     4
     1
col =
     1
     2
     3
     4

ビット単位の関数

次の関数は、整数入力に対しビット単位で論理演算を行います。入力には、スカラーや配列を使用できます。配列で入力を行った場合には、同様のサイズの出力配列が生成されます。

次の表に示す例では、次のようなスカラー入力 AB を使用しています。

A = 28;               % binary 00011100
B = 21;               % binary 00010101

関数

説明

bitand

2 つの整数引数に対するビット単位の AND を返します。

bitand(A,B) = 20 (binary 00010100)

bitor

2 つの整数引数に対するビット単位の OR を返します。

bitor(A,B) = 29 (binary 00011101)

bitcmp

ビット単位の補数を返します。2 番目の引数が最初の引数の整数のデータ型を指定するものと見なされます。既定では、MATLAB は double 値を uint64 整数として扱います。

bitcmp(A,'int8') = -29 (binary 11100011)

bitxor

2 つの整数引数に対する、ビット単位の排他的 OR を返します。

bitxor(A,B) = 9 (binary 00001001)

ショートサーキット演算子

次の演算子では、スカラー値を含む論理式に対して AND および OR の演算が実行されます。これらの演算子は、最初のオペランドから結果を完全に判定できない場合にのみ 2 番目のオペランドが評価されるため、"ショートサーキット" 演算子と見なされます。

演算子

説明

&&

両方の入力が true に評価される場合は論理値 1 (true) を返し、そうでない場合は論理値 0 (false) を返します。

||

いずれか一方の入力、または両方 , の入力が true に評価される場合は論理値 1 (true) を返し、そうでない場合は論理値 0 (false) を返します。

次に示すステートメントは、2 つの論理項 A および B の AND を実行します。

A && B

A が 0 に等しい場合は、B の値に関係なく、式全体が論理値 0 (false) に評価されます。これらの状況では、結果は既にわかっているので、B を評価する必要はありません。この場合、MATLAB では最初の項のみが評価され、ステートメントが短絡 (ショートサーキット) されます。

2 つの項の OR を計算する際に、最初の項が true である場合も同様です。この場合も、B の値に関係なく、ステートメントは true に評価されます。2 番目の項を評価する必要はないので、MATLAB では 2 番目の項が無視されます。

ショートサーキット演算の利点

ショートサーキット演算子を使用して、特定の条件を満たす場合にのみに式を評価することができます。たとえば、関数ファイルが現在の MATLAB パス上にある場合にのみ関数を実行したいとします。

ショートサーキット演算を使用することで、ファイル myfun.m が見つからない場合に、次のエラーが発生しないようにすることができます。

comp = (exist('myfun.m') == 2) && (myfun(x) >= y)

同様に、次のステートメントを使用すると、ゼロで除算できなくなります。

x = (b ~= 0) && (a/b > 18.5)

また、if ステートメントと while ステートメントで && 演算子や || 演算子を使用して、ショートサーキット演算を利用することもできます。

if (nargin >= 3) && (ischar(varargin{3}))
この情報は役に立ちましたか?