คำตอบที่ค่อนข้างยาวกว่านี้ซึ่งอธิบายว่าทำไมมันจึงมีประสิทธิภาพมากกว่าที่จะทำให้ดัชนีส่วนใหญ่เปลี่ยนแปลงไปอย่างรวดเร็วที่สุด มีสองสิ่งสำคัญที่คุณต้องเข้าใจ
อันดับแรก MATLAB (และ Fortran แต่ไม่ใช่ภาษาซีและภาษาการเขียนโปรแกรมส่วนใหญ่อื่น ๆ ) จะจัดเก็บอาร์เรย์ในหน่วยความจำใน "ลำดับหลักของคอลัมน์" เช่นถ้า A เป็นเมทริกซ์ขนาด 2 คูณ 3 คูณ 10 รายการจะถูกเก็บไว้ในหน่วยความจำตามลำดับ
A (1,1,1)
A (2,1,1)
A (1,2,1)
A (2,2,1)
A (1,3,1)
A (2,3,1)
A (1,1,2)
A (2,1,2)
...
A (2,3,10)
ตัวเลือกของการเรียงลำดับคอลัมน์หลักนี้โดยพลการ - เราสามารถนำระเบียบ "คำสั่งแถวหลัก" มาใช้ได้อย่างง่ายดายและที่จริงแล้วนั่นคือสิ่งที่ทำในภาษา C และภาษาการเขียนโปรแกรมอื่น ๆ
สิ่งสำคัญที่สองที่คุณต้องเข้าใจคือตัวประมวลผลที่ทันสมัยไม่สามารถเข้าถึงหน่วยความจำทีละตำแหน่ง แต่ให้โหลดและจัดเก็บ "แคชไลน์" ที่ 64 หรือ 128 ไบต์ที่ต่อเนื่องกัน (8 หรือ 16 คู่เลขทศนิยมแม่นยำ) ในเวลาจากหน่วยความจำ ข้อมูลเหล่านี้จะถูกเก็บไว้ชั่วคราวในแคชหน่วยความจำที่รวดเร็วและเขียนออกมาได้ตามต้องการ (ในทางปฏิบัติแล้วสถาปัตยกรรมแคชตอนนี้ค่อนข้างซับซ้อนโดยมีหน่วยความจำแคชมากถึง 3 หรือ 4 ระดับ แต่แนวคิดพื้นฐานสามารถอธิบายได้ด้วยแคชระดับเดียวของการเรียงลำดับที่คอมพิวเตอร์มีในวันที่น้องของฉัน)
A
หากลูปซ้อนกันเพื่อให้วงในสุดอัพเดทตัวห้อยแถวจากนั้นรายการอาร์เรย์จะถูกเข้าถึงในลำดับ A (1,1), A (2,1), A (3,1), ... เมื่อ การเข้าถึงรายการแรก A (1,1) ระบบจะนำบรรทัดแคชที่มี A (1,1), A (2,1), ... , A (8,1) เข้าสู่แคชจากหน่วยความจำหลัก . การวนซ้ำ 8 ครั้งถัดไปของลูปในสุดจะทำงานกับข้อมูลนี้โดยไม่ต้องมีการถ่ายโอนหน่วยความจำหลักเพิ่มเติม
หากเป็นทางเลือกเราจัดโครงสร้างลูปเพื่อให้ดัชนีคอลัมน์แตกต่างกันในวงในสุดจากนั้นรายการของ A จะเข้าถึงได้ในลำดับ A (1,1), A (1,2), A (1,3 ), ... ในกรณีนี้การเข้าถึงครั้งแรกจะนำ A (1,1), A (2,1), ... , A (8,1) เข้าสู่แคชจากหน่วยความจำหลัก แต่ 7/8 ของ รายการเหล่านี้จะไม่ถูกใช้ การเข้าถึง A (1,2) ในการวนซ้ำครั้งที่สองจะทำให้มี 8 รายการเข้ามาจากหน่วยความจำหลักและอื่น ๆ เมื่อถึงเวลาที่โค้ดทำงานให้กับแถวที่ 2 ของเมทริกซ์รายการ A (2,1) อาจถูกล้างออกจากแคชเพื่อหลีกเลี่ยงข้อมูลที่จำเป็นอื่น ๆ เป็นผลให้รหัสกำลังสร้างปริมาณการรับส่งข้อมูล 8 เท่าตามที่จำเป็น
คอมไพเลอร์ที่ปรับให้เหมาะสมบางตัวสามารถปรับโครงสร้างลูปได้โดยอัตโนมัติเพื่อหลีกเลี่ยงปัญหานี้
อัลกอริธึมเชิงพีชคณิตเชิงตัวเลขจำนวนมากสำหรับการคูณเมทริกซ์และการแยกตัวประกอบสามารถปรับให้ทำงานอย่างมีประสิทธิภาพด้วยชุดรูปแบบการสั่งซื้อแถวหลักหรือคอลัมน์หลักขึ้นอยู่กับภาษาการเขียนโปรแกรม การทำเช่นนี้ในทางที่ผิดอาจส่งผลกระทบในทางลบอย่างมีนัยสำคัญต่อประสิทธิภาพ
For
MATLAB วนซ้ำช้ามาก คุณควรหลีกเลี่ยงการวนซ้ำอย่างชัดเจนใน MATLAB ทุกครั้งที่ทำได้ แต่มักจะมีปัญหาสามารถแสดงในแง่ของการดำเนินงานเมทริกซ์ / เวกเตอร์ นั่นคือวิธี MATLABic นอกจากนี้ยังมีฟังก์ชั่นในตัวจำนวนมากเพื่อกำหนดค่าเริ่มต้นเมทริกซ์เป็นต้นตัวอย่างเช่นมีฟังก์ชั่นones ()ซึ่งจะกำหนดองค์ประกอบทั้งหมดของเมทริกซ์เป็น 1 (ตามส่วนขยายเป็นค่าใด ๆ โดยการคูณ (สเกลาร์ คูณด้วยเมทริกซ์ทุกคน)) มันใช้งานได้กับอาร์เรย์ 3 มิติ (ซึ่งฉันคิดว่าครอบคลุมตัวอย่างที่นี่)