Để giảm mô hình, tôi muốn tính các vectơ số đơn bên trái liên quan đến giá trị số ít nhất 20 - của ma trận , trong đó và . Thật không may, ma trận của tôi sẽ dày đặc mà không có cấu trúc nào.
Nếu tôi chỉ gọi svd
thường trình từ numpy.linalg
mô-đun trong Python cho một ma trận ngẫu nhiên có kích thước này, thì tôi gặp phải lỗi bộ nhớ. Điều này là do sự phân bổ của cho phép phân tách . A = V S U
Có thuật toán xung quanh, mà tránh được cạm bẫy này? Ví dụ: bằng cách chỉ thiết lập các vectơ số ít được liên kết với các giá trị số ít khác.
Tôi đã sẵn sàng để giao dịch trong thời gian tính toán và độ chính xác.
full_matrices
được đặt thành Sai để chỉ các phần 'nonzero' được tính toán. Tuy nhiên, có cách nào để giảm tính toán hơn nữa?
numpy
phụ trợ sử dụng mã fortran, LAPACKE_dgesvd
thói quen cho svd tiêu chuẩn. Tuy nhiên, thông thường ma trận của bạn là C_CONTIGOUS
(kiểm tra với matrix.flags
). Do đó, nó sao chép dữ liệu để căn chỉnh fortran. Ngoài ra, trong khi chạy thói quen lapack, dgesvd một bản sao khác của ma trận của bạn là cần thiết (hoặc ít nhất là bộ nhớ cho nó). Bạn có thể thoát khỏi một bản sao nếu bạn chắc chắn rằng căn chỉnh bộ nhớ là kiểu fortran ngay từ đầu.