iและjเป็นชื่อตัวแปรที่นิยมมาก (ดูเช่นคำถามนี้นี้และชื่อนี้ )
ตัวอย่างเช่นในลูป:
for i=1:10,
% do something...
end
ตามดัชนีเข้าสู่เมทริกซ์:
mat( i, j ) = 4;
เหตุใดจึงไม่ควรใช้เป็นชื่อตัวแปรใน Matlab
iและjเป็นชื่อตัวแปรที่นิยมมาก (ดูเช่นคำถามนี้นี้และชื่อนี้ )
ตัวอย่างเช่นในลูป:
for i=1:10,
% do something...
end
ตามดัชนีเข้าสู่เมทริกซ์:
mat( i, j ) = 4;
เหตุใดจึงไม่ควรใช้เป็นชื่อตัวแปรใน Matlab
คำตอบ:
เพราะiและjทั้งสองฟังก์ชั่นแสดงถึงหน่วยจินตนาการ :
ดังนั้นตัวแปรที่เรียกว่าiหรือjจะแทนที่พวกเขาอาจทำลายรหัสเงียบที่ทำคณิตศาสตร์ที่ซับซ้อน
วิธีแก้ปัญหาที่เป็นไปได้ ได้แก่ การใช้iiและjjตัวแปรลูปแทนหรือใช้1iทุกครั้งที่iต้องการเพื่อแสดงหน่วยจินตภาพ
iและjชื่อตัวแปร
forลูป 1 พันล้านครั้งไม่แสดงความแตกต่างทางสถิติในเวลา) สำหรับทุกคนที่เรารู้ว่ามีรหัสพิเศษในการจัดการตรงนี้และการใช้ตัวแปรอื่น ๆ นอกเหนือจากiและj(และk?) เป็นจริงช้าลงเล็กน้อย และความแตกต่างที่เกิดขึ้นนั้นมีน้อยมากในชีวิตจริง ไม่มีเหตุผลที่จะไม่ใช้iและjเป็นตัวแปรปกติ - เพียงแค่ต้องใช้อย่างถูกต้องเหมือนกับฟังก์ชัน Matlab อื่น ๆ
forวนซ้ำ 1 พันล้านครั้งและลองใช้แผนการจับเวลาทุกรูปแบบ ฉันเห็นผู้ใช้ SO รายใหม่ที่ได้รับแจ้งว่ารหัสที่ถูกต้องสมบูรณ์นั้นผิดเพราะใช้iและjวนซ้ำ ตรงไปตรงมามันโง่และผู้คนขาดจุดสำคัญของคำถามนี้: iและjไม่ควรใช้กับหน่วยจินตภาพหากใครต้องการเขียนรหัส Matlab สมัยใหม่ที่อ่านได้
เป็นวิธีปฏิบัติที่ดีในการหลีกเลี่ยงiและjตัวแปรเพื่อป้องกันความสับสนว่าเป็นตัวแปรหรือหน่วยจินตภาพ
อย่างไรก็ตามโดยส่วนตัวแล้วฉันใช้iและjเป็นตัวแปรค่อนข้างบ่อยเหมือนดัชนีของลูปสั้น เพื่อหลีกเลี่ยงปัญหาในรหัสของฉันฉันได้ปฏิบัติตามแนวปฏิบัติที่ดีอีกข้อหนึ่งเกี่ยวกับiและj: อย่าใช้พวกเขาเพื่อแสดงถึงจำนวนจินตภาพ ในความเป็นจริงสถานะเอกสารของ Matlab :
สำหรับความเร็วและความทนทานที่ดีขึ้น, คุณสามารถแทนที่ซับซ้อน
iและโดยj1i
ดังนั้นแทนที่จะหลีกเลี่ยงชื่อตัวแปรที่ใช้กันมากสองชื่อเนื่องจากความขัดแย้งที่อาจเกิดขึ้นฉันชัดเจนเกี่ยวกับตัวเลขในจินตนาการ มันทำให้รหัสของฉันชัดเจนยิ่งขึ้น เมื่อใดก็ตามที่ฉันเห็น1iฉันรู้ว่ามันหมายถึงsqrt(-1)เพราะมันอาจจะไม่เป็นตัวแปร
iและjดีที่สุด แต่อธิบายว่าสไตล์การเข้ารหัสส่วนบุคคลของฉันไม่เป็นไปตามกฎนั้นได้อย่างไร
1iและไม่ใช่iสำหรับคณิตศาสตร์ที่ซับซ้อน ลองนึกภาพจำนวนจินตภาพ1iและลองคิดดูว่าการคิดเลขiเป็นจินตภาพเป็นการปฏิบัติที่ไม่ดี ไม่ใช่วิธีอื่น ๆ การใช้i, ii, iiiเป็นเรื่องธรรมดาใน Matlab และไม่มีปัญหาเมื่อมีคนติด1iและ1jจำนวนที่ซับซ้อน Matlab ยังเคารพสิ่งนี้และสิ่งนี้ไม่ลดประสิทธิภาพ (เท่าที่ฉันทดสอบ) ตามที่ระบุไว้ในคำตอบก่อนหน้า
ใน MATLAB รุ่นเก่ามีเหตุผลที่ดีที่จะหลีกเลี่ยงการใช้iและjเป็นชื่อตัวแปร - รุ่นแรกของ MATLAB JIT ไม่ฉลาดพอที่จะบอกได้ว่าคุณใช้พวกเขาเป็นตัวแปรหรือหน่วยจินตภาพและดังนั้นจึง ปิดการเพิ่มประสิทธิภาพที่เป็นไปได้อื่น ๆ
รหัสของคุณจะช้าลงเนื่องจากสถานะiและjตัวแปรต่าง ๆ และจะเพิ่มความเร็วขึ้นหากคุณเปลี่ยนเป็นอย่างอื่น นั่นเป็นเหตุผลที่ถ้าคุณอ่านรหัส MathWorks มากคุณจะเห็นiiและjjใช้อย่างกว้างขวางว่าเป็นดัชนีวนรอบ ในขณะที่ MathWorks อาจมีคนแนะนำอย่างไม่เป็นทางการให้ทำเอง (แม้ว่าพวกเขาจะแนะนำผู้คนอย่างเป็นทางการในการเขียนโปรแกรมเพื่อความสง่างาม / การดูแลรักษาแทนที่จะเป็นสิ่งที่ JIT ปัจจุบันทำเพราะเป็นเป้าหมายที่เคลื่อนไหวในแต่ละรุ่น)
แต่ค่อนข้างนานมาแล้วและทุกวันนี้มันเป็นปัญหาเล็กน้อยของ "ซอมบี้" ที่สำคัญน้อยกว่าหลาย ๆ คนที่ยังคิด แต่ปฏิเสธที่จะตาย
ในรุ่นล่าสุดใด ๆ มันเป็นความชอบส่วนตัวว่าจะใช้iและjเป็นชื่อตัวแปรหรือไม่ หากคุณทำงานกับตัวเลขที่ซับซ้อนจำนวนมากคุณอาจต้องการหลีกเลี่ยงiและjเป็นตัวแปรเพื่อหลีกเลี่ยงความเสี่ยงที่อาจเกิดความสับสนเล็กน้อย (แม้ว่าคุณอาจ / / ต้องการที่จะใช้1iหรือเพียง1jเพื่อความสับสนน้อยลงและประสิทธิภาพที่ดีขึ้นเล็กน้อย )
ในทางกลับกันในงานทั่วไปของฉันฉันไม่เคยจัดการกับตัวเลขที่ซับซ้อนและฉันพบว่าโค้ดของฉันอ่านง่ายขึ้นถ้าฉันรู้สึกอิสระที่จะใช้ iและjเป็นดัชนีลูป
ฉันเห็นคำตอบมากมายที่นี่ที่พูด ไม่แนะนำ ...โดยไม่บอกว่าใครกำลังทำอยู่แนะนำ นี่คือขอบเขตของคำแนะนำจริงของ MathWorks จากเอกสารเผยแพร่ล่าสุดสำหรับi:
เนื่องจาก i เป็นฟังก์ชันจึงสามารถเขียนทับและใช้เป็นตัวแปรได้ อย่างไรก็ตามวิธีที่ดีที่สุดคือหลีกเลี่ยงการใช้ i และ j สำหรับชื่อตัวแปรถ้าคุณตั้งใจจะใช้ในการคำนวณเชิงซ้อน [... ] เพื่อความเร็วและความทนทานที่ดีขึ้นคุณสามารถแทนที่ complex i และ j by 1i
ดังที่อธิบายไว้ในคำตอบอื่น ๆiไม่แนะนำให้ใช้รหัสทั่วไปด้วยเหตุผลสองประการ:
ตามที่แนะนำ: 1iและได้iiรับการแนะนำ อย่างไรก็ตามถึงแม้ว่าสิ่งเหล่านี้จะเบี่ยงเบนไปจากทั้งคู่iแต่ก็ไม่ค่อยดีนักที่จะใช้ตัวเลือกทั้งสองร่วมกัน
นี่คือตัวอย่างทำไม (ส่วนตัว) ฉันไม่ชอบ:
val2 = val + i % 1
val2 = val + ii % 2
val2 = val + 1i % 3
หนึ่งจะไม่ถูกเข้าใจผิดอย่างง่ายดายสำหรับสองหรือสาม แต่สองและสามมีลักษณะคล้ายกัน
ก่อนคำแนะนำส่วนตัวของฉันจะเป็น: ในกรณีที่บางครั้งคุณทำงานกับรหัสที่ซับซ้อนมักจะใช้1iรวมกับตัวแปรลูปที่แตกต่างกัน
ตัวอย่างของดัชนีตัวอักษรเดียวว่าถ้าคุณไม่ได้ใช้ตัวแปรหลายวงและตัวอักษรพอเพียง: t, u, kและp
ตัวอย่างของดัชนีอีกต่อไป: i_loop, step, walkและt_now
แน่นอนว่านี่เป็นเรื่องของรสนิยมส่วนตัวเช่นกัน แต่ไม่ควรยากที่จะหาดัชนีที่จะใช้ซึ่งมีความหมายชัดเจนโดยไม่ต้องเติบโตนานเกินไป
1iจะได้รับการสีแตกต่างกันเป็นจำนวน :)
doc iและdoc j: "เพื่อความเร็วและความทนทานที่ดีขึ้นคุณสามารถแทนที่ i และ j ที่ซับซ้อนได้ด้วย 1i" IMO ใน Matlab ปัจจุบันไม่มีเหตุผลที่จะไม่ใช้iและjในลูปเป็นต้นหรือใช้สิ่งอื่นนอกเหนือจาก1iเพื่อแสดงถึงหน่วยจินตภาพ ( 1jทำงานด้วย) ข้อยกเว้นเพียงอย่างเดียวคือเมื่อส่งสตริงไปยังเอ็นจิน Symbolic ที่เข้ากันไม่ได้เล็กน้อย แปลกhelp 1iและdoc 1iไม่ทำงานแม้ว่า
มันก็ชี้ให้เห็นว่า1iเป็นวิธีที่ได้รับการยอมรับและโปร่งใสในการเขียนและที่เป็นเช่นนี้ไม่มีความจำเป็นที่จะต้องหลีกเลี่ยงการใช้sqrt(-1) iจากนั้นอีกครั้งขณะที่เดนนิสชี้ให้เห็น ( https://stackoverflow.com/a/14893729/1967396 ) มันยากที่จะเห็นความแตกต่างระหว่างและ1i iiคำแนะนำของฉัน: ใช้1jเป็นค่าคงที่จินตภาพที่เป็นไปได้ มันเป็นเคล็ดลับที่เดียวกันกับที่วิศวกรไฟฟ้าจ้าง - พวกเขาใช้jสำหรับsqrt(-1)เนื่องจากiถูกใช้ไปแล้วสำหรับปัจจุบัน
ส่วนตัวฉันไม่เคยใช้iและj; ฉันใช้iiและjjเป็นดัชนีการทำดัชนีแบบสั้น (และ kk, ll, mm, ... ) และ1jเมื่อฉันต้องการใช้ตัวเลขที่ซับซ้อน
1iและii" และมากยิ่งขึ้นความแตกต่างระหว่าง1และlระหว่างและO 0นั่นเป็นเหตุผลที่ขั้นตอนแรกที่ฉันทำในการติดตั้ง MATALB ใหม่คือการเปลี่ยนขนาดตัวอักษรเริ่มต้น
ความสับสนกับหน่วยจินตภาพได้รับการคุ้มครองอย่างดีที่นี่ แต่มีเหตุผลบางอย่างที่น่าเบื่อกว่านี้ที่ทำให้ชื่อตัวแปรตัวอักษรเดี่ยวและอื่น ๆ บางครั้งหมดกำลังใจ
MATLAB โดยเฉพาะ: หากคุณใช้ coder เพื่อสร้างแหล่ง C ++ จากรหัส MATLAB ของคุณ (ไม่น่ากลัวมาก) จากนั้นคุณจะได้รับคำเตือนอย่างชัดเจนว่าไม่ให้นำตัวแปรมาใช้ใหม่เนื่องจากอาจมีการพิมพ์ผิดพลาด
โดยทั่วไปและขึ้นอยู่กับ IDE ของคุณชื่อตัวแปรตัวอักษรตัวเดียวสามารถทำให้เกิดความเสียหายด้วยปากกาเน้นข้อความและค้นหา / แทนที่ MATLAB ไม่ได้รับความทุกข์ทรมานจากสิ่งนี้และฉันเชื่อว่า Visual Studio ไม่มีปัญหาในบางครั้ง แต่มาตรฐานการเข้ารหัส C / C ++ เช่น MISRA ฯลฯ มักจะแนะนำให้พวกเขาขุ่นเคือง
ในส่วนของฉันฉันหลีกเลี่ยงตัวแปรตัวอักษรทั้งหมดแม้จะมีข้อได้เปรียบที่ชัดเจนสำหรับการใช้แหล่งข้อมูลทางคณิตศาสตร์โดยตรง มันต้องใช้ความพยายามเป็นพิเศษเล็กน้อยในช่วงสองสามร้อยครั้งแรกที่คุณทำ แต่หลังจากนั้นคุณหยุดสังเกตและข้อดีเมื่อคุณหรือวิญญาณที่น่าสงสารอื่น ๆ มาอ่านโค้ดของคุณคือกองพัน
รหัสที่ไม่สำคัญมีหลายforลูปและแนวทางปฏิบัติที่ดีที่สุดแนะนำให้คุณใช้ชื่อที่สื่อความหมายถึงวัตถุประสงค์และขอบเขตของมัน สำหรับเวลานมนาน (และถ้าสคริปต์ 5-10 เส้นว่าผมไม่ได้จะประหยัด), ฉันได้รับเสมอโดยใช้ชื่อตัวแปรเช่นidxTask, idxAnotherTaskและidxSubTaskอื่น ๆ
หรืออย่างน้อยที่สุดสองเท่าของตัวอักษรตัวแรกของอาร์เรย์มันคือการจัดทำดัชนีเช่นssการจัดทำดัชนีsubjectList, ttการจัดทำดัชนีtaskListแต่ไม่ได้iiหรือjjซึ่งไม่ได้ช่วยให้ฉันได้อย่างง่ายดายระบุอาร์เรย์ที่พวกเขากำลังทำดัชนีจากหลายของฉันสำหรับลูป
โดยค่าเริ่มต้นiและjยืนสำหรับหน่วยจินตภาพ ดังนั้นจากมุมมองของ MATLAB การใช้iเป็นตัวแปรก็เหมือนกับการใช้1เป็นตัวแปร
iและjเป็นจริงฟังก์ชั่นการกลับค่าของหน่วยจินตนาการ เป็นไปได้ที่จะใช้ตัวแปรที่มีชื่อเดียวกันกับฟังก์ชั่นในขอบเขต อย่างไรก็ตามสิ่งนี้จะทำให้ฟังก์ชั่นเงา
ถ้าคุณเป็นผู้ใช้ที่สับสนมากฉันคิดว่ามีความเสี่ยงน้อยมากในการใช้ชื่อตัวแปรiและjและฉันใช้มันเป็นประจำ ฉันไม่ได้เห็นสิ่งบ่งชี้ทางการใด ๆ ที่ควรหลีกเลี่ยง
ในขณะที่มันเป็นความจริงที่การแรเงาหน่วยจินตภาพอาจทำให้เกิดความสับสนในบางบริบทดังที่กล่าวไว้ในโพสต์อื่น ๆ โดยรวมแล้วฉันไม่เห็นว่ามันเป็นปัญหาใหญ่ มีสิ่งที่สับสนมากกว่าที่คุณสามารถทำได้ใน MATLAB เช่นการกำหนดfalse=true
ในความคิดของฉันครั้งเดียวที่คุณควรหลีกเลี่ยงคือถ้ารหัสของคุณเกี่ยวข้องกับตัวเลขในจินตนาการ
i,j,kเป็นชื่อตัวแปรห่วงทั่วไป