Compute a few singular triplets from a specified region (the largest, the
smallest, the closest to a point) on a matrix using PRIMME .
Only the matrix-vector product of the matrix is required. The used method is
usually faster than a direct method (such as
seeking few singular values and the matrix-vector product is cheap. For
accelerating the convergence consider to use preconditioning and/or
educated initial guesses.
1 2 3 4 5 6 7 8 9 10 11 12 13
matrix or a function with signature f(x, trans) that returns
number of singular triplets to seek.
which singular values to find:
a triplet (σ,u,v) is marked as converged when sqrt(||A*v - sigma*u||^2 + ||A'*u - σ*v||^2 is smaller than tol*||A||, or close to the minimum tolerance that the selected method can achieve.
matrix whose columns are educated guesses of the left singular vectors to find.
matrix whose columns are educated guesses of the right singular vectors to find.
find left singular vectors orthogonal to the space spanned by the columns of this matrix; useful to avoid finding some triplets or to find new solutions.
find right singular vectors orthogonal to the space spanned by the columns of this matrix.
preconditioner used to accelerated the convergence; it is a named
list of matrices or functions such as
The three values haven't to be set. It is recommended to set
whether A %*% x always returns real number and not complex.
other PRIMME options (see details).
Optional arguments to pass to PRIMME eigensolver (see further details at ):
estimation of norm-2 of A, used in convergence test (if not provided, it is estimated as the largest eigenvalue in magnitude seen)
maximum block size (like in subspace iteration or LOBPCG)
message level reporting, from 0 (no output) to 5 (show all)
1, hard locking; 0, soft locking
maximum size of the search subspace
minimum Ritz vectors to keep in restarting
maximum number of matrix vector multiplications
an array of four numbers used as a random seed
which equivalent eigenproblem to solve
A^*A or AA^*
[0 A^*;A 0]
first normal equations and then augmented (default)
1, hard locking; 0, soft locking
list with options for the first
and the second stage solver; see
"primme_svds_normalequation", the minimum
tolerance that can be achieved is \|A\|ε/σ, where ε
is the machine precision. If
"primme_svds_hybrid", the minimum tolerance is \|A\|ε.
However it may not return triplets with singular values smaller than
list with the next elements
the singular values σ_i
the left singular vectors u_i
the right singular vectors v_i
the residual vector norms sqrt(||A*v - sigma*u||^2 + ||A'*u - σ*v||^2
matrix-vector products performed
number of preconditioner applications performed
time expended by the eigensolver
time expended in the matrix-vector products
time expended in applying the preconditioner
time expended in orthogonalizing
estimation of the norm of A
 L. Wu, E. Romero and A. Stathopoulos, PRIMME_SVDS: A High-Performance Preconditioned SVD Solver for Accurate Large-Scale Computations, J. Sci. Comput., Vol. 39, No. 5, (2017), S248–S271.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38
A <- diag(1:5,10,5) # the singular values of this matrix are 1:10 and the # left and right singular vectors are the columns of # diag(1,100,10) and diag(10), respectively r <- svds(A, 3); r$d # the three largest singular values on A r$u # the corresponding approximate left singular vectors r$v # the corresponding approximate right singular vectors r$rnorms # the corresponding residual norms r$stats$numMatvecs # total matrix-vector products spend r <- svds(A, 3, "S") # compute the three smallest values r <- svds(A, 3, 2.5) # compute the three closest values to 2.5 A <- diag(1:500,500,100) # we use a larger matrix to amplify the difference r <- svds(A, 3, 2.5, tol=1e-3); # compute the values with r$rnorms # residual norm <= 1e-3*||A|| # Build the diagonal squared preconditioner # and see how reduce the number matrix-vector products P <- diag(colSums(A^2)) svds(A, 3, "S", tol=1e-3)$stats$numMatvecs svds(A, 3, "S", tol=1e-3, prec=list(AHA=P))$stats$numMatvecs # Passing A and the preconditioner as functions Af <- function(x,mode) if (mode == "n") A%*%x else crossprod(A,x); P = colSums(A^2); PAHAf <- function(x) x / P; r <- svds(Af, 3, "S", tol=1e-3, prec=list(AHA=PAHAf), m=500, n=100) # Passing initial guesses v0 <- diag(1,100,4) + matrix(rnorm(400), 100, 4)/100; svds(A, 4, "S", tol=1e-3)$stats$numMatvecs svds(A, 4, "S", tol=1e-3, v0=v0)$stats$numMatvecs # Passing orthogonal constrain, in this case, already compute singular vectors r <- svds(A, 4, "S", tol=1e-3); r$d svds(A, 4, "S", tol=1e-3, orthov=r$v)$d
Add the following code to your website.
For more information on customizing the embed code, read Embedding Snippets.