# Singular Value Decomposition

svds(A; nsv=6, ritzvec=true, tol=0.0, maxiter=1000, ncv=2*nsv, v0=zeros((0,))) -> (SVD([left_sv,] s, [right_sv,]), nconv, niter, nmult, resid)

Computes the largest singular values s of A using implicitly restarted Lanczos iterations derived from eigs.

Inputs

• A: Linear operator whose singular values are desired. A may be represented as a subtype of AbstractArray, e.g., a sparse matrix, or any other type supporting the four methods size(A), eltype(A), A * vector, and A' * vector.
• nsv: Number of singular values. Default: 6.
• ritzvec: If true, return the left and right singular vectors left_sv and right_sv. If false, omit the singular vectors. Default: true.
• tol: tolerance, see eigs.
• maxiter: Maximum number of iterations, see eigs. Default: 1000.
• ncv: Maximum size of the Krylov subspace, see eigs (there called nev). Default: 2*nsv.
• v0: Initial guess for the first Krylov vector. It may have length min(size(A)...), or 0.

Outputs

• svd: An SVD object containing the left singular vectors, the requested values, and the right singular vectors. If ritzvec = false, the left and right singular vectors will be empty. U, S, V and Vt can be obtained from the SVD object with Z.U, Z.S, Z.V and Z.Vt, where Z = svds(A)[1] and U * Diagonal(S) * Vt is a low-rank approximation of A with rank nsv. Internally Vt is stored and hence Vt is more efficient to extract than V.
• nconv: Number of converged singular values.
• niter: Number of iterations.
• nmult: Number of matrix–vector products used.
• resid: Final residual vector.

Examples

julia> Random.seed!(123);

julia> A = Diagonal(1:5);

julia> Z = svds(A, nsv = 2)[1];

julia> Z.U
5×2 Array{Float64,2}:
0.0           7.80626e-18
0.0          -0.0
-1.33227e-16   5.35947e-33
-6.38552e-17   1.0
-1.0          -6.38552e-17

julia> Z.S
2-element Array{Float64,1}:
5.0
3.999999999999999

julia> Z.Vt
2×5 Array{Float64,2}:
-2.77556e-17  0.0          -2.22045e-16  -7.9819e-17  -1.0
3.1225e-17   1.89735e-19   0.0           1.0         -8.32667e-17

julia> Z.V
-1.0          -8.32667e-17
svds(A) is formally equivalent to calling eigs to perform implicitly restarted Lanczos tridiagonalization on the Hermitian matrix $A^\prime A$ or $AA^\prime$ such that the size is smallest.