| svds | R Documentation | 
Compute a few singular triplets from a specified region (the largest, the
smallest, the closest to a point) on a matrix using PRIMME [1].
Only the matrix-vector product of the matrix is required. The used method is
usually faster than a direct method (such as svd) if
seeking few singular values and the matrix-vector product is cheap. For
accelerating the convergence consider to use preconditioning  and/or
educated initial guesses.
svds(
  A,
  NSvals,
  which = "L",
  tol = 1e-06,
  u0 = NULL,
  v0 = NULL,
  orthou = NULL,
  orthov = NULL,
  prec = NULL,
  isreal = NULL,
  ...
)
| A | matrix or a function with signature f(x, trans) that returns
 | ||||||||
| NSvals | number of singular triplets to seek. | ||||||||
| which | which singular values to find: 
 | ||||||||
| tol | a triplet  | ||||||||
| u0 | matrix whose columns are educated guesses of the left singular vectors to find. | ||||||||
| v0 | matrix whose columns are educated guesses of the right singular vectors to find. | ||||||||
| orthou | 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. | ||||||||
| orthov | find right singular vectors orthogonal to the space spanned by the columns of this matrix. | ||||||||
| prec | 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
 | ||||||||
| isreal | 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 [2]):
aNormestimation of norm-2 of A, used in convergence test (if not provided, it is estimated as the largest eigenvalue in magnitude seen)
maxBlockSizemaximum block size (like in subspace iteration or LOBPCG)
printLevelmessage level reporting, from 0 (no output) to 5 (show all)
locking1, hard locking; 0, soft locking
maxBasisSizemaximum size of the search subspace
minRestartSizeminimum Ritz vectors to keep in restarting
maxMatvecsmaximum number of matrix vector multiplications
iseedan array of four numbers used as a random seed
methodwhich equivalent eigenproblem to solve
"primme_svds_normalequation"A^*A or AA^*
"primme_svds_augmented"[0 A^*;A 0]
"primme_svds_hybrid"first normal equations and then augmented (default)
locking1, hard locking; 0, soft locking
primmeStage1, primmeStage2list with options for the first
and the second stage solver; see eigs_sym
If method is "primme_svds_normalequation", the minimum
tolerance that can be achieved is \|A\|\epsilon/\sigma, where \epsilon
is the machine precision. If method is "primme_svds_augmented"
or "primme_svds_hybrid", the minimum tolerance is \|A\|\epsilon.
However it may not return triplets with singular values smaller than
\|A\|\epsilon.
list with the next elements
dthe singular values \sigma_i
uthe left singular vectors u_i
vthe right singular vectors v_i
rnormsthe residual vector norms
\sqrt{\|Av - \sigma u\|^2+\|A^*u - \sigma v\|^2}
stats$numMatvecsmatrix-vector products performed
stats$numPrecondsnumber of preconditioner applications performed
stats$elapsedTimetime expended by the eigensolver
stats$timeMatvectime expended in the matrix-vector products
stats$timePrecondtime expended in applying the preconditioner
stats$timeOrthotime expended in orthogonalizing
stats$estimateANormestimation of the norm of A
[1] 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.
[2] https://www.cs.wm.edu/~andreas/software/doc/svdsc.html#parameters-guide
svd for computing all singular triplets;
eigs_sym for computing a few eigenvalues and vectors
from a symmetric/Hermitian matrix.
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.