Singular-value soft-thresholding
Overwrites \(A\) with \(U S_{\tau}(\Sigma) V^H\), where \(U \Sigma V^H\) is the singular-value decomposition of \(A\) upon input and \(S_{\tau}\) performs soft-thresholding with parameter \(\tau\).
The return value is the rank of the soft-thresholded matrix.
Implementation
Standard algorithm
Runs the default SVT algorithm. In the sequential case, this is currently
svt::Normal, and, in the parallel case, it is svt::Cross.
C++ API
-
Int
SVT(Matrix<F> &A, Base<F> tau, bool relative = false)
-
Int
SVT(ElementalMatrix<F> &A, Base<F> tau, bool relative = false)
C API
-
ElError
ElSVT_s(ElMatrix_s A, float rho, bool relative)
-
ElError
ElSVT_d(ElMatrix_d A, double rho, bool relative)
-
ElError
ElSVT_c(ElMatrix_c A, float rho, bool relative)
-
ElError
ElSVT_z(ElMatrix_z A, double rho, bool relative)
-
ElError
ElSVTDist_s(ElDistMatrix_s A, float rho, bool relative)
-
ElError
ElSVTDist_d(ElDistMatrix_d A, double rho, bool relative)
-
ElError
ElSVTDist_c(ElDistMatrix_c A, float rho, bool relative)
-
ElError
ElSVTDist_z(ElDistMatrix_z A, double rho, bool relative)
Approximate algorithm
Runs a faster (for small ranks), but less accurate, algorithm given an
upper bound on the rank of the soft-thresholded matrix.
The current implementation preprocesses via relaxedRank steps of
(Businger-Golub) column-pivoted QR via the routine svt::PivotedQR.
C++ API
-
Int
SVT(Matrix<F> &A, Base<F> tau, Int relaxedRank, bool relative = false)
-
Int
SVT(ElementalMatrix<F> &A, Base<F> tau, Int relaxedRank, bool relative = false)
Tall-skinny algorithm
Runs an SVT algorithm designed for tall-skinny matrices.
The current implementation is based on TSQR factorization and is
svt::TSQR.
C++ API
-
Int
SVT(DistMatrix<F, U, STAR> &A, Base<F> tau, bool relative = false)
namespace svt
-
Int
svt::Normal(Matrix<F> &A, Base<F> tau, bool relative = false)
-
Int
svt::Normal(ElementalMatrix<F> &A, Base<F> tau, bool relative = false)
Runs a standard SVD, soft-thresholds the singular values, and then reforms
the matrix.
-
Int
svt::Cross(Matrix<F> &A, Base<F> tau, bool relative = false)
-
Int
svt::Cross(ElementalMatrix<F> &A, Base<F> tau, bool relative = false)
Forms the normal matrix, computes its Hermitian EVD, soft-thresholds the
eigenvalues, and then reforms the matrix. Note that Elemental’s parallel
Hermitian EVD is much faster than its parallel SVD; this is typically worth
the loss of accuracy in the computed small (truncated) singular values and
is therefore the default choice for parallel SVT.
-
Int
svt::PivotedQR(Matrix<F> &A, Base<F> tau, Int numStepsQR, bool relative = false)
-
Int
svt::PivotedQR(ElementalMatrix<F> &A, Base<F> tau, Int numStepsQR, bool relative = false)
Computes an approximate SVT by first approximating A as the rank-numSteps
approximation produced by numSteps iterations of column-pivoted QR.
-
Int
svt::TSQR(ElementalMatrix<F> &A, Base<F> tau, bool relative = false)
Since the majority of the work in a tall-skinny SVT will be in the initial
QR factorization, this algorithm runs a TSQR factorization and then
computes the SVT of the small R factor using a single process.