Per la riduzione del modello, voglio calcolare i vettori singolari di sinistra associati ai - diciamo 20 - valori singolari più grandi di una matrice , dove N ≈ 10 6 e k ≈ 10 3 . Sfortunatamente, la mia matrice A sarà densa senza alcuna struttura.
Se chiamo semplicemente la svdroutine dal numpy.linalgmodulo in Python per una matrice casuale di queste dimensioni, mi imbatto in un errore di memoria. Ciò è dovuto alla destinazione di per la decomposizione A = V S U .
Ci sono algoritmi in giro che evitano questa trappola? Ad esempio impostando solo i singoli vettori associati a valori singolari diversi da zero.
Sono pronto a scambiare tempo e precisione di calcolo.
full_matricesche deve essere impostata su False in modo che vengano calcolate solo le parti 'diverse da zero'. Tuttavia, c'è un modo per ridurre ulteriormente il calcolo?
numpybackend utilizza il codice fortran, la LAPACKE_dgesvdroutine per svd standard. Tuttavia, in genere la tua matrice è C_CONTIGOUS(verifica con matrix.flags). Pertanto copia i dati per l'allineamento Fortran. Inoltre, durante l'esecuzione del dackvd di routine, è necessaria un'altra copia della matrice (o almeno la memoria per essa). È possibile eliminare una copia se si assicura che l'allineamento della memoria sia in stile Fortran sin dall'inizio.