อะไรคือความแตกต่างระหว่าง & และ && ใน MATLAB?


คำตอบ:


94

เครื่องหมายแอมเพอร์แซนด์เดียว & เป็นตัวดำเนินการทางตรรกะ AND เครื่องหมายแอมเพอร์แซนด์คู่ && เป็นตัวดำเนินการเชิงตรรกะและอีกครั้งที่ใช้พฤติกรรมการลัดวงจร การลัดวงจรหมายถึงตัวถูกดำเนินการที่สอง (ด้านขวามือ) จะได้รับการประเมินก็ต่อเมื่อผลลัพธ์ไม่ได้ถูกกำหนดโดยตัวถูกดำเนินการแรกอย่างสมบูรณ์ (ด้านซ้ายมือ)

A & B (ประเมิน A และ B)

A && B (B จะได้รับการประเมินก็ต่อเมื่อ A เป็นจริง)


77
ข้อแม้: &สามารถทำงานบนอาร์เรย์ แต่&&สามารถทำงานบนสเกลาร์เท่านั้น
gnovice

หมายเหตุด้านข้าง: หลังจาก 15 ปีที่ทำงานกับ Matlab เกือบทุกวันฉันมักจะใช้ '&' และมันไม่เคยกัดฉันที่ตูด OTOH ฉันรู้จักหลายคนที่รู้สึกรำคาญกับการใช้ '&&' เพราะพวกเขาต้องจำมันไม่ได้เป็นสากล (ใช่ฉันรู้ว่า '&' ไม่มีประสิทธิภาพเท่าเพราะมันไม่ลัดวงจร แต่ฉันไม่เคยเดซี่เลย - เชื่อมโยงตัวถูกดำเนินการของฉันเพื่อให้การประหยัดในปัจจุบันมีน้อยมาก)
eric

7
@neuronet มันไม่ได้เกี่ยวกับประสิทธิภาพจริงๆยิ่งไปกว่านั้นมันอนุญาตโครงสร้างที่นิพจน์แรกรับประกันเงื่อนไขโดยที่นิพจน์ที่สองอาจทำให้เกิดข้อผิดพลาดรันไทม์ เช่น d != 0 && 1/dvs d !=0 & 1/d- ครั้งแรกรับประกันว่าไม่มีการหารด้วยศูนย์อย่างที่สองไม่ได้
Fraser

2
คำตอบนี้ไม่สมบูรณ์และไม่ถูกต้อง &ไม่ลัดวงจรหากอยู่ในifคำสั่ง และ&&รับอินพุตสเกลาร์ คำตอบของ @ ลอเรนด้านล่างถูกต้อง
Cris Luengo

2
โปรดทราบว่าลอเรนเป็นพนักงานของ MathWorks คำตอบไม่ได้มีอำนาจมากไปกว่านั้น หากคุณเต็มใจที่จะเสียสละคุณสามารถตั้งค่าสถานะคำตอบของคุณเพื่อให้ม็อดลบได้ (คุณไม่สามารถลบได้เองเนื่องจากเป็นที่ยอมรับ) คุณจะรักษาตัวแทนที่คุณได้รับจากมัน (ถ้าฉันเข้าใจระบบถูกต้อง) และเราจะได้คำตอบยอดนิยมที่ถูกต้องและเชื่อถือได้ในทางเทคนิค
Andras Deak

35

&&และ||รับอินพุตสเกลาร์และลัดวงจรเสมอ |และ&รับอินพุตอาร์เรย์และการลัดวงจรเฉพาะในคำสั่ง if / while สำหรับการมอบหมายงานหลังห้ามลัดวงจร

ดูหน้าเอกสารเหล่านี้สำหรับข้อมูลเพิ่มเติม


1
คุณมีข้อมูลเกี่ยวกับช็อตคัท Matlab เวอร์ชันใด&และ|ในคำสั่ง if / while หรือไม่? ดูเหมือนจะไม่เป็นเช่นนั้นใน R2012b และ R2014a
ทิม

@Loren มีความคิดว่าทำไมพวกเขาถึงออกแบบให้ทำงานกับสเกลาร์เท่านั้น? มันดูแปลก ๆ ...
eric

@neuronet: คุณไม่สามารถลัดวงจรได้หากคุณใช้งานอาร์เรย์
Cris Luengo

17

ดังกล่าวแล้วโดยคนอื่น ๆ&เป็นตรรกะและผู้ประกอบการและ&&เป็นลัดวงจรและผู้ประกอบการ พวกเขาแตกต่างกันในวิธีการประเมินตัวถูกดำเนินการรวมทั้งการทำงานบนอาร์เรย์หรือสเกลาร์หรือไม่:

  • &(ตัวดำเนินการ AND) และ|(ตัวดำเนินการ OR) สามารถทำงานบนอาร์เรย์ได้อย่างชาญฉลาด
  • &&และ||เป็นเวอร์ชันลัดวงจรที่ตัวถูกดำเนินการตัวที่สองจะได้รับการประเมินก็ต่อเมื่อผลลัพธ์ไม่ได้ถูกกำหนดโดยตัวถูกดำเนินการตัวแรกอย่างสมบูรณ์ สิ่งเหล่านี้สามารถทำงานบนสเกลาร์เท่านั้นไม่ใช่อาร์เรย์

8

ทั้งสองเป็นตรรกะ AND การดำเนินการ แม้ว่า && เป็นตัวดำเนินการ "ลัดวงจร" จากเอกสาร MATLAB:

พวกเขาเป็นตัวดำเนินการลัดวงจรซึ่งจะประเมินตัวถูกดำเนินการตัวที่สองก็ต่อเมื่อผลลัพธ์ไม่ได้ถูกกำหนดโดยตัวถูกดำเนินการตัวแรกอย่างสมบูรณ์

ดูเพิ่มเติมได้ที่นี่


6

&เป็นตัวดำเนินการเชิงตรรกะแบบ elementwise ในขณะที่&&เป็นตัวดำเนินการลัดวงจรเชิงตรรกะ (ซึ่งสามารถทำงานบนสเกลาร์เท่านั้น)

ตัวอย่างเช่น (ให้อภัยไวยากรณ์ของฉัน)

ถ้า..

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

..หรือ..

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

สำหรับ&&ตัวถูกดำเนินการด้านขวาจะคำนวณก็ต่อเมื่อตัวถูกดำเนินการด้านซ้ายเป็นจริงและผลลัพธ์เป็นค่าบูลีนเดียว

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

หวังว่าจะชัดเจน


3
ไม่ใช่บิตมันเป็นองค์ประกอบที่ชาญฉลาด
Cris Luengo

3
10 ปีต่อมาฉันรู้สึกดีขึ้นจริงหรือ? 😺
Erik Kerber

คำถามนี้มีผู้เข้าชมมากถึง 115,000 ครั้งซึ่งหมายความว่ามีคนจำนวนมากอ่านข้อมูลที่ผิดที่นี่ คำตอบจำนวนมากเหล่านี้ไม่สมบูรณ์หรือมีข้อมูลที่ไม่ถูกต้อง สิ่งที่คุณต้องทำคือแก้ไขคำตอบหรือลบคำตอบ BTW: bitandเป็นตัวดำเนินการตรรกะ AND ในระดับบิตใน MATLAB
Cris Luengo


2

กฎที่ดีของหัวแม่มือเมื่อสร้างข้อโต้แย้งสำหรับการใช้งานในงบเงื่อนไข (IF ในขณะที่อื่น ๆ ) คือการเสมอใช้ && / || แบบฟอร์มเว้นแต่จะมีเหตุผลที่ดีมากที่จะไม่ทำ มีสองเหตุผล ...

  1. ดังที่คนอื่นกล่าวถึงพฤติกรรมการลัดวงจรของ && / || คล้ายกับภาษาซีส่วนใหญ่ โดยทั่วไปแล้วความเหมือน / ความคุ้นเคยนั้นถือเป็นจุดที่ชอบ
  2. การใช้ && หรือ || แบบฟอร์มบังคับให้คุณเขียนโค้ดแบบเต็มเพื่อตัดสินใจว่าคุณต้องการอาร์กิวเมนต์เวกเตอร์ เมื่อ a = [1 0 0 1] และ b = [0 1 0 1] a & b เป็นจริงหรือเท็จ ฉันจำกฎสำหรับ MATLAB ของ & คุณไม่ได้? คนส่วนใหญ่ทำไม่ได้ ในทางกลับกันถ้าคุณใช้ && หรือ || คุณถูกบังคับให้เขียนโค้ด "เต็ม" เพื่อแก้ไขเงื่อนไข

การทำเช่นนี้แทนที่จะใช้ความละเอียดของเวกเตอร์ใน & และ | ของ MATLAB นำไปสู่โค้ดที่ละเอียดกว่าเล็กน้อย แต่ LOT ปลอดภัยและดูแลรักษาง่ายกว่า


1
+1 แต่ควรสังเกตว่าคำตอบของคุณใช้กับกรณีที่คุณต้องการให้ผลลัพธ์สุดท้ายของการดำเนินการเป็นสเกลาร์เท่านั้น มีการใช้งานมากมายสำหรับ & และ | ที่ไหน && และ || ไม่มีประโยชน์เพราะไม่สามารถส่งคืนอาร์เรย์ตัวอย่างเช่นเมื่อทำการจัดทำดัชนีแบบแฟนซีเช่น "การเลือก r ทั้งหมดระหว่าง 1 ถึง 2: r((r<2)&(r<2))"
Jonas Heidelberg

จุดดีโจนัส ฉันคิดถึงเงื่อนไขไม่ใช่ "การจัดทำดัชนีเชิงตรรกะ" (คำ MATLAB สำหรับ "การจัดทำดัชนีแฟนซี" ที่คุณกล่าวถึง) เมื่อฉันเขียนสิ่งนี้ ฉันเปลี่ยนประโยคแรกของโพสต์เพื่อแสดงถึงสิ่งนั้น ขอบคุณสำหรับการแจ้งเตือน!
Bob Gilmore
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.