MATLABの&と&&の違いは何ですか?


回答:


93

単一のアンパサンド&は論理AND演算子です。二重のアンパサンド&&も、短絡動作を採用した論理AND演算子です。短絡とは、2番目のオペランド(右側)が最初のオペランド(左側)によって完全に決定されない場合にのみ評価されることを意味します

A&B(AとBが評価されます)

A && B(Bは、Aがtrueの場合にのみ評価されます)


75
注意点:&アレイ&&で操作できますが、スカラーでのみ操作できます。
gnovice

補足:15年後、ほぼ毎日Matlabで作業しているので、私は常に「&」を使用しています。OTOH、私は '&&'が普遍的ではないことを覚えておく必要があるためにイライラする多くの人々を知っています(はい、私は '&'は短絡しないので効率的ではないことを認識していますが、デイジーはほとんどありません-現在の節約が無視できるように、私のオペランドをチェーンします)。
エリック2016年

7
@neuronetそれは実際には効率についてではなく、最初の式が条件を保証する構成を許可し、それなしでは2番目の式が実行時エラーを引き起こす可能性があります。たとえば、 d != 0 && 1/dvs- d !=0 & 1/d最初はゼロによる除算を保証せず、2番目は保証しません。
Fraser

2
この答えは不完全で不正確です。ステートメント&内の場合は短絡しifます。そして&&、スカラー入力を受け取ります。以下の@Lorenの答えは正しいです。
クリスLuengo

2
また、ローレンはMathWorksの社員です。答えはそれ以上の権威を持ちません。犠牲を払う気がある場合は、modの回答にフラグを付けて削除することができます(受け入れられるため、自分で削除することはできません)。あなたはそれから得た担当者を維持し(私がシステムを正しく理解していれば)、技術的に正確で信頼できるトップアンサーが得られます。
Andras Deak

35

&&||常にスカラー入力を受け取り、短絡します。 配列入力|&受け取り、if / whileステートメントでのみ短絡します。割り当てについては、後者は短絡しません。

詳細については、これらのドキュメントページを参照してください。


1
どのMatlabバージョンのショートカット&|if / whileステートメントに情報がありますか?R2012bとR2014aではそうではないようです。
Tim

@ローレンは、なぜスカラーのみで動作するように設計したの、何か考えはありますか?それは奇妙に思えます...
エリック2015年

@neuronet:配列を操作する場合、短絡することはできません。
クリスルエンゴ

17

他の人がすでに述べたように、&論理AND演算子&&あり、短絡AND演算子です。これらは、オペランドが評価される方法、および配列またはスカラーで動作するかどうかで異なります

  • &(AND演算子)および|(OR演算子)は、要素ごとに配列を操作できます。
  • &&そして||、結果が完全に最初のオペランドによって決定されていない場合にのみ、第2オペランドは評価されているショートバージョンがあります。これらは配列ではなくスカラーでのみ動作します。

8

どちらも論理AND演算です。&&は、「短絡」演算子です。MATLABドキュメントから:

これらは、結果が最初のオペランドによって完全に決定されない場合にのみ2番目のオペランドを評価するという点で、短絡演算子です。

詳細はこちら


6

他の言語と同様に、&は論理ビットごとの演算子&&ですが、は論理演算です。

たとえば(私の構文を許して)。

もしも

A = [True True False True]
B = False
A & B = [False False False False]

..または..

B = True
A & B = [True True False True]

の場合&&、右のオペランドは、左のオペランドがtrueで、結果が単一のブール値である場合にのみ計算されます。

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

それが明確であることを願っています。


3
それはビット単位ではなく、要素単位です。
クリスLuengo

3
私はちょうど実際に10年後に取得しましたか?😺
エリックKerberの

さて、この質問はこれまでに1万15千回の意見を得ています。つまり、多くの人々がここで誤った情報を読んだことになります。これらの回答の多くは不完全であるか、間違った情報が含まれています。あなたがする必要があるのはあなたの答えを修正するか、それを削除することです。ところで:bitandMATLABのビット単位の論理AND演算子です。
クリスLuengo

4

&&および|| ある短絡スカラーで動作オペレーターが。&および| 配列を操作し、またはループ式のコンテキストでのみ短絡使用します。ifwhile


2

条件付きステートメント(IF、WHILEなど)で使用する引数を作成するときの経験則は、常に && / ||を使用することです。非常に正当な理由がない限り、フォーム。2つの理由があります...

  1. 他の人が述べたように、&& / ||の短絡動作 ほとんどのC言語に似ています。その類似性/親しみやすさは、一般的にその支持のポイントと考えられています。
  2. &&または||の使用 formsは、ベクトル引数の意図を決定するための完全なコードを書くことを強制します。a = [1 0 0 1]およびb = [0 1 0 1]の場合、a&bは真ですか、偽ですか?MATLABの&のルールを思い出せません。ほとんどの人はできません。一方、&&または||を使用する場合は、条件を解決するために「完全に」コードを記述する必要があります。

&と|でのベクトルのMATLABの解像度に依存するのではなく、これを行うと、コードは少し冗長になりますが、LOTの安全性と保守が容易になります。


1
+1。ただし、答えは、演算の最終結果をスカラーにしたい場合にのみ適用されることに注意してください。&と|には多くの用途があります。&&と|| たとえば、「1から2までのすべてのrを選択する」などの高度なインデックス付けを行う場合は、配列を返すことができないため、役に立ちませんr((r<2)&(r<2))
Jonas Heidelberg

良い点、ジョナス。これを書いたとき、私は「論理インデックス」(あなたが言及した「ファンシーインデックス」のMATLAB用語)ではなく条件を考えていました。それを反映するために、投稿の最初の文を変更しました。念押し有難う!
ボブ・ギルモア
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.