(การรับความคิดเห็นยาวเกินไป ... )
ฉันจะสมมติว่าคุณต้องคำนวณอินเวอร์สในอัลกอริทึมของคุณ 1ประการแรกสิ่งสำคัญคือต้องทราบว่าอัลกอริธึมทางเลือกเหล่านี้ไม่ได้อ้างว่าเร็วกว่าจริงเพียงเพราะมีความซับซ้อนเชิงซีมโทติคที่ดีกว่า (หมายถึงจำนวนการปฏิบัติการขั้นพื้นฐานที่ต้องการ ในความเป็นจริงในทางปฏิบัติสิ่งเหล่านี้จริง ๆ แล้วช้ากว่าวิธีมาตรฐาน (สำหรับกำหนด) ด้วยเหตุผลดังต่อไปนี้:n
-notation กลองอย่างต่อเนื่องในด้านหน้าของอำนาจของซึ่งอาจมีขนาดใหญ่ astronomically - ขนาดใหญ่เพื่อให้สามารถมากมีขนาดเล็กกว่าสำหรับการใด ๆว่า สามารถจัดการกับคอมพิวเตอร์เครื่องใดก็ได้ในอนาคตอันใกล้ (นี่เป็นกรณีสำหรับอัลกอริทึม Coppersmith – Winograd) n C 1 n 3 C 2 n 2. x nOnC1n3C2n2.xn
ความซับซ้อนสันนิษฐานว่าการดำเนินการทุกอย่าง (ทางคณิตศาสตร์) ใช้เวลาเดียวกัน - แต่มันก็ไม่จริงในการฝึกจริง: การคูณจำนวนตัวเลขที่มีจำนวนเท่ากันนั้นเร็วกว่าการคูณจำนวนที่แตกต่างกันจำนวนมาก นี่เป็นเพราะความจริงที่ว่าคอขวดใหญ่ในการคำนวณปัจจุบันได้รับข้อมูลเข้าสู่แคชไม่ใช่การดำเนินการเกี่ยวกับคณิตศาสตร์ที่เกิดขึ้นจริงกับข้อมูลนั้น ดังนั้นอัลกอริทึมที่สามารถจัดเรียงใหม่เพื่อให้มีสถานการณ์แรก (เรียกว่าการรับรู้แคช ) จะเร็วกว่าหนึ่งที่ไม่สามารถทำได้ (นี่เป็นกรณีของอัลกอริทึมของ Strassen)
นอกจากนี้ความเสถียรเชิงตัวเลขอย่างน้อยสำคัญเท่ากับประสิทธิภาพ และที่นี่อีกครั้งวิธีการมาตรฐานมักจะชนะ
ด้วยเหตุผลนี้ไลบรารีมาตรฐานประสิทธิภาพสูง (BLAS / LAPACK ซึ่ง Numpy เรียกใช้เมื่อคุณขอให้คำนวณอินเวิร์ส) มักใช้วิธีนี้เท่านั้น แน่นอนว่ามีการนำ Numpy มาใช้เช่นอัลกอริธึมของ Strassen ออกไป แต่อัลกอริทึมปรับด้วยมือในระดับชุดประกอบจะชนะอัลกอริทึมที่เขียนด้วยภาษาระดับสูงสำหรับขนาดเมทริกซ์ที่เหมาะสมO ( n 2. x )O(n3)O(n2.x)
1แต่ฉันผิดปกติถ้าฉันไม่ได้ชี้ให้เห็นว่านี่ไม่ค่อยจำเป็นจริงๆ: ทุกครั้งที่คุณต้องคำนวณผลิตภัณฑ์คุณควรแก้ปัญหาระบบเชิงเส้น (เช่น ใช้) และการใช้งานแทน - นี้เป็นมีเสถียรภาพมากขึ้นและสามารถทำได้ (ขึ้นอยู่กับโครงสร้างของเมทริกซ์)
มากได้เร็วขึ้น หากคุณจำเป็นต้องใช้หลาย ๆ ครั้งคุณสามารถคำนวณค่าตัวประกอบของ (ซึ่งโดยปกติจะเป็นส่วนที่แพงที่สุดของการแก้ปัญหา) และนำมาใช้ใหม่ในภายหลัง
A x = b x A A - 1 AA−1bAx=bnumpy.linalg.solve
xAA−1A