สำหรับการลดแบบจำลองฉันต้องการคำนวณเวกเตอร์เอกพจน์ทางซ้ายที่เกี่ยวข้องกับ - พูด 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 จะต้องทำสำเนาเมทริกซ์ของคุณอีกชุดหนึ่ง (หรืออย่างน้อยก็เป็นหน่วยความจำ) คุณสามารถกำจัดสำเนาหนึ่งชุดได้หากคุณแน่ใจว่าการจัดเรียงหน่วยความจำนั้นเป็นสไตล์ฟอร์แทรนตั้งแต่ต้น