Computing the SVD of a LinearMap

I’m trying to compute the SVD of a LinearMap since a dense representation of the matrix would go out of memory. I tried using IterativeSolvers.svdl but it does not give me all of the singular values or the U matrix. Is there any other way to get the SVD on Julia?

But if you need all singular values and the full U matrix you will face the same memory problem ? If you are ready to truncate the series, there is GitHub - JuliaLinearAlgebra/TSVD.jl: Truncated singular value decomposition with partial reorthogonalization or GitHub - JuliaLinearAlgebra/Arpack.jl: Julia Wrappers for the arpack-ng Fortran library

I hoped to get the singular values as a vector (for the scales at which I am working this would be within memory) and U as a LinearMap. I’m trying to compute the preconditioner for IterativeSolvers.lsqr using the LSRN method. Here the preconditioner would be U*\Sigma^{-1} which is why I dont really need the dense matrix representations at any point.

Since you want to use it as a preconditioner, maybe the truncated version still works since anyway the preconditioner is only an approximation to the true inverse anyway ? Do you have an idea on the singular values spectrum (how fast it decreases) ?

I’m not aware of an svd decomposition returning U as a function rather than a full matrix and if that exists I would like to learn about it !

Well, there’s this paper.

3 Likes

The spectrum of the singular values is the same as that of a random matrix (a Gaussian ensemble). So your suggestion is worth a shot.
Thank you.