สำหรับการลดแบบจำลองฉันต้องการคำนวณเวกเตอร์เอกพจน์ทางซ้ายที่เกี่ยวข้องกับ - พูด 20 - ค่าเอกพจน์ที่ใหญ่ที่สุดของเมทริกซ์โดยที่และ 3 น่าเสียดายเมทริกซ์ของฉันจะหนาแน่นโดยไม่มีโครงสร้างใด ๆ N ≈ 10 6 k ≈ 10 3 A
หากฉันเพิ่งเรียกsvd
รูทีนจากnumpy.linalg
โมดูลใน Python สำหรับเมทริกซ์แบบสุ่มขนาดนี้ฉันพบข้อผิดพลาดของหน่วยความจำ เพราะนี่คือการจัดสรรสำหรับการสลายตัวVSU A = V S U
มีอัลกอริธึมที่หลีกเลี่ยงหลุมพรางนี้ไหม เช่นโดยการตั้งค่าเฉพาะเวกเตอร์เอกพจน์ที่สัมพันธ์กับค่าเอกพจน์ที่ไม่ใช่ศูนย์
ฉันพร้อมที่จะแลกเปลี่ยนในเวลาและความแม่นยำในการคำนวณ
full_matrices
ที่ถูกตั้งค่าเป็นเท็จเพื่อให้คำนวณเฉพาะส่วนที่ไม่ใช่ศูนย์ อย่างไรก็ตามมีวิธีที่จะลดการคำนวณให้ดียิ่งขึ้นไปอีกหรือไม่?
numpy
แบ็กเอนด์ใช้รหัส Fortran ที่ LAPACKE_dgesvd
ประจำสำหรับ SVD มาตรฐาน อย่างไรก็ตามโดยทั่วไปเมทริกซ์ของคุณคือC_CONTIGOUS
(ตรวจสอบด้วยmatrix.flags
) ดังนั้นจึงคัดลอกข้อมูลสำหรับการจัดตำแหน่ง Fortran นอกจากนี้ในขณะที่รันชุดคำสั่ง lapack จะต้องทำสำเนาเมทริกซ์ของคุณอีกชุดหนึ่ง (หรืออย่างน้อยก็เป็นหน่วยความจำ) คุณสามารถกำจัดสำเนาหนึ่งชุดได้หากคุณแน่ใจว่าการจัดเรียงหน่วยความจำนั้นเป็นสไตล์ฟอร์แทรนตั้งแต่ต้น