Para redução do modelo, quero calcular os vetores singulares esquerdos associados aos - digamos 20 - maiores valores singulares de uma matriz , em que N ≈ 10 6 e k ≈ 10 3 . Infelizmente, minha matriz A será densa sem nenhuma estrutura.
Se eu apenas chamar a svdrotina do numpy.linalgmódulo em Python para uma matriz aleatória desse tamanho, ocorrerá um erro de memória. Isto é devido à atribuição de para a decomposição A = V S L .
Existem algoritmos por aí que evitam essa armadilha? Por exemplo, configurando apenas os vetores singulares associados a valores singulares diferentes de zero.
Estou pronto para negociar com precisão e tempo de computação.
full_matricesque está definida como False, para que apenas as partes 'diferentes de zero' sejam computadas. No entanto, existe uma maneira de reduzir ainda mais a computação?
numpyback-end usa o código fortran, a LAPACKE_dgesvdrotina para o svd padrão. No entanto, normalmente sua matriz é C_CONTIGOUS(verifique com matrix.flags). Portanto, ele copia os dados para o alinhamento do fortran. Além disso, durante a execução da rotina lapack dgesvd, é necessária outra cópia da sua matriz (ou pelo menos a memória). Você pode se livrar de uma cópia se certificar-se de que o alinhamento da memória seja do tipo fortran desde o início.