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
และโดยj
1i
ดังนั้นแทนที่จะหลีกเลี่ยงชื่อตัวแปรที่ใช้กันมากสองชื่อเนื่องจากความขัดแย้งที่อาจเกิดขึ้นฉันชัดเจนเกี่ยวกับตัวเลขในจินตนาการ มันทำให้รหัสของฉันชัดเจนยิ่งขึ้น เมื่อใดก็ตามที่ฉันเห็น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
เป็นชื่อตัวแปรห่วงทั่วไป