MATLAB'da & ve && arasındaki fark nedir?


Yanıtlar:


94

Tek ve işareti &, mantıksal AND operatörüdür. Çift ampersand &&, yine kısa devre davranışı kullanan mantıksal bir AND işlecidir. Kısa devre, yalnızca ikinci işlenenin (sağ taraf), yalnızca sonuç ilk işlenen tarafından tam olarak belirlenmediğinde (sol taraf) değerlendirildiği anlamına gelir.

A & B (A ve B değerlendirilir)

A && B (B yalnızca A doğruysa değerlendirilir)


77
Dikkat: &diziler üzerinde çalışabilir ancak &&yalnızca skalerlerde çalışabilir.
gnovice

Yan not: Matlab ile 15 yıl çalıştıktan sonra neredeyse her gün "&" kullanıyorum ve beni asla kıçımdan ısırmadı. OTOH, '&&' kullanımından rahatsız olan birçok insan tanıyorum çünkü bunun evrensel olmadığını hatırlamak zorundalar işlenenlerimi zincirleyin, böylece günümüzdeki tasarruflar ihmal edilebilir).
eric

7
@neuronet, gerçekte verimlilikle ilgili değildir, daha çok, ilk ifadenin, ikinci ifadenin çalışma zamanı hatasına neden olabileceği bir koşulu garanti ettiği bir yapıya izin verir. örn. d != 0 && 1/dvs d !=0 & 1/d- ilki sıfıra bölmeyi garanti etmezken ikincisi garanti etmez.
Fraser

2
Bu cevap eksik ve yanlış. &bir ifaçıklamada ise kısa devre yapar . Ve &&skaler girdiler alır. @ Loren'in aşağıdaki cevabı doğrudur.
Cris Luengo

2
Ayrıca Loren'in bir MathWorks çalışanı olduğunu unutmayın. Bir cevap bundan daha güvenilir olamaz. Bir fedakarlık yapmaya istekli iseniz, bir modun onu silmesi için cevabınızı işaretleyebilirsiniz (kabul edildiği için kendiniz silemezsiniz). Ondan kazandığınız itibarı tutarsınız (sistemi doğru anlarsam) ve sonunda teknik olarak doğru ve yetkili bir en iyi cevap alırız.
Andras Deak

35

&&ve her ||zaman skaler girişler ve kısa devre alın. |ve &dizi girişlerini ve kısa devreyi yalnızca if / while ifadelerinde alın. Atama için ikincisi kısa devre yapmaz.

Daha fazla bilgi için bu belge sayfalarına bakın .


1
Hangi Matlab sürümlerinin kısayolu &ve |if / while ifadeleri hakkında herhangi bir bilginiz var mı? R2012b ve R2014a'da durum böyle görünmüyor.
Tim

@ Birini neden yalnızca skalarlarla çalışacak şekilde tasarladıklarına dair bir fikriniz var mı? Garip görünüyor ...
eric

@neuronet: Diziler üzerinde çalışırsanız kısa devre yapamazsınız.
Cris Luengo

17

Zaten başkaları tarafından belirtildiği gibi, &a, mantıksal ve operatör ve &&a, kısa devre ve operatör . İşlenenlerin nasıl değerlendirildiği ve diziler veya skalarlar üzerinde çalışıp çalışmadıklarına göre farklılık gösterirler :

  • &(VE operatörü) ve |(OR operatörü), diziler üzerinde eleman bazında çalışabilir .
  • &&ve ||ikinci işlenenin yalnızca sonuç birinci işlenen tarafından tam olarak belirlenmediğinde değerlendirildiği kısa devre versiyonlarıdır. Bunlar dizilerde değil , yalnızca skalerlerde çalışabilir .

8

Her ikisi de mantıksal AND işlemlerdir. &&, bir "kısa devre" operatörüdür. MATLAB belgelerinden:

Bunlar, ikinci işlenenlerini yalnızca sonuç ilk işlenen tarafından tam olarak belirlenmediğinde değerlendirdikleri için kısa devre operatörleridir.

Daha fazlasını burada görün .


6

&mantıksal elementsel bir operatördür, &&mantıksal kısa devre operatörü ise (sadece skalerlerde çalışabilir)

Örneğin (sözdizimimi bağışlayın).

Eğer..

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

..veya..

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

Çünkü &&, sağ işlenen yalnızca sol işlenen doğruysa ve sonuç tek bir boole değeriyse hesaplanır.

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

Umarım bu açıktır.


3
Bitsel değil, element açısından.
Cris Luengo

3
Gerçekten 10 yıl sonra mı iyileştim? 😺
Erik Kerber

Bu soru şu ana kadar ~ 115.000 görüntüleme aldı, bu da birçok insanın burada yanlış bilgi okuduğu anlamına geliyor. Bu cevapların çoğu eksik veya yanlış bilgi içeriyor. Tek yapmanız gereken cevabınızı düzeltmek veya silmek. BTW: bitandMATLAB'daki bitsel mantıksal AND operatörüdür.
Cris Luengo

4

&& ve || olan kısa devre skalerler faaliyet operatörler. & ve | diziler üzerinde çalışır ve kısa devreyi yalnızca ifveya whiledöngü ifadeleri bağlamında kullanır .


2

Koşullu ifadelerde (IF, WHILE, vb.) Kullanmak için argümanlar oluştururken iyi bir temel kural, her zaman && / || yapmamak için çok iyi bir neden yoksa formlar. Bunun iki sebebi var ...

  1. Diğerlerinin de belirttiği gibi, && / || nin kısa devre davranışı çoğu C benzeri dile benzer. Bu benzerlik / aşinalık genellikle kendi lehine bir nokta olarak kabul edilir.
  2. && veya || formlar sizi vektör argümanları için niyetinize karar vermek için tam kodu yazmaya zorlar . A = [1 0 0 1] ve b = [0 1 0 1] olduğunda, a & b doğru mu yanlış mı? MATLAB'ın kurallarını hatırlayamıyorum, değil mi? Çoğu insan yapamaz. Öte yandan, && veya || kullanırsanız, koşulu çözmek için kodu "tam olarak" yazmak zorunda kalırsınız.

Bunu yapmak, MATLAB'ın & ve | içindeki vektörlerin çözünürlüğüne güvenmek yerine, biraz daha ayrıntılı, ancak LOT daha güvenli ve bakımı daha kolay olan koda yol açar.


1
+1, ancak yanıtınızın yalnızca operasyonun nihai sonucunun skaler olmasını istediğiniz durumlar için geçerli olduğuna dikkat edilmelidir . & Ve | için birçok kullanım vardır. nerede && ve || işe yaramaz çünkü dizileri döndüremiyorlar, örneğin "1 ile 2 arasındaki tüm r'yi seçerken: r((r<2)&(r<2))" gibi süslü indeksleme yaparken .
Jonas Heidelberg

İyi nokta Jonas. Bunu yazarken "mantıksal indeksleme" (bahsettiğiniz "fantezi indeksleme" için MATLAB terimi) değil, koşullu ifadeler düşünüyordum. Yazımın ilk cümlesini bunu yansıtacak şekilde değiştirdim. Hatırlatma için teşekkürler!
Bob Gilmore
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.