Low rank SVD

I need to calculate a low rank SVD of a large matrix for a pseudoinverse, but I also need the individual matrices. I currently do I like this:

X_svd = svd(X)

r = 20
U = X_svd.U[:, 1:r]
Σ = Diagonal(X_svd.S[1:r])
Vt = X_svd.Vt[1:r, :]

svd does not have a parameter to produce the low rank approximations, interestingly pinv has an option for that (atol and rtol).

Am I right that this is a limitation of LAPACK and not julia calling it? I don’t know much about the algorithmic side of this, how large are the potential gains (computation and memory) when only calculating a lower rank?

I found LowRankApprox.jl but I have yet to try it.

1 Like

You may find algorithms in
https://github.com/haampie/RandomizedLinAlg.jl
and
https://github.com/JuliaLinearAlgebra/TSVD.jl
helpful. They allow you to compute a rank-r approximation to the SVD without having to compute the entire factorization.

2 Likes

What dimensions does X has?

Thanks, I will try out the different packages and see if there is a performance difference!