Hermitian SVD

Suppose that A is Hermitian, with a spectral decomposition

A=VΛVH.

Then an SVD of A can easily be computed as

A=U|Λ|VH,

where the columns of U equal the columns of V, modulo sign flips introduced by negative eigenvalues.

Computing singular values

The following routines return the singular values of A in s. Note that the appropriate triangle of A is overwritten during computation.

C++ API

void HermitianSVD(UpperOrLower uplo, Matrix<F> &A, Matrix<Base<F>> &s)
void HermitianSVD(UpperOrLower uplo, AbstractDistMatrix<F> &A, AbstractDistMatrix<Base<F>> &s)

C API

ElError ElHermitianSingularValues_s(ElUpperOrLower uplo, ElMatrix_s A, ElMatrix_s s)
ElError ElHermitianSingularValues_d(ElUpperOrLower uplo, ElMatrix_d A, ElMatrix_d s)
ElError ElHermitianSingularValues_c(ElUpperOrLower uplo, ElMatrix_c A, ElMatrix_s s)
ElError ElHermitianSingularValues_z(ElUpperOrLower uplo, ElMatrix_z A, ElMatrix_d s)
ElError ElHermitianSingularValuesDist_s(ElUpperOrLower uplo, ElDistMatrix_s A, ElDistMatrix_s s)
ElError ElHermitianSingularValuesDist_d(ElUpperOrLower uplo, ElDistMatrix_d A, ElDistMatrix_d s)
ElError ElHermitianSingularValuesDist_c(ElUpperOrLower uplo, ElDistMatrix_c A, ElDistMatrix_s s)
ElError ElHermitianSingularValuesDist_z(ElUpperOrLower uplo, ElDistMatrix_z A, ElDistMatrix_d s)

Computing Singular Value Decompositions

The following routines return a vector of singular values, s, and the left and right singular vector matrices, U and V, such that A=Udiag(s)VH.

C++ API

void HermitianSVD(UpperOrLower uplo, Matrix<F> &A, Matrix<Base<F>> &s, Matrix<F> &U, Matrix<F> &V)
void HermitianSVD(UpperOrLower uplo, AbstractDistMatrix<F> &A, AbstractDistMatrix<Base<F>> &s, AbstractDistMatrix<F> &U, AbstractDistMatrix<F> &V)

C API

ElError ElHermitianSVD_s(ElUpperOrLower uplo, ElMatrix_s A, ElMatrix_s s, ElMatrix_s U, ElMatrix_s V)
ElError ElHermitianSVD_d(ElUpperOrLower uplo, ElMatrix_d A, ElMatrix_d s, ElMatrix_d U, ElMatrix_d V)
ElError ElHermitianSVD_c(ElUpperOrLower uplo, ElMatrix_c A, ElMatrix_s s, ElMatrix_c U, ElMatrix_c V)
ElError ElHermitianSVD_z(ElUpperOrLower uplo, ElMatrix_z A, ElMatrix_d s, ElMatrix_z U, ElMatrix_z V)
ElError ElHermitianSVDDist_s(ElUpperOrLower uplo, ElDistMatrix_s A, ElDistMatrix_s s, ElDistMatrix_s U, ElDistMatrix_s V)
ElError ElHermitianSVDDist_d(ElUpperOrLower uplo, ElDistMatrix_d A, ElDistMatrix_d s, ElDistMatrix_d U, ElDistMatrix_d V)
ElError ElHermitianSVDDist_c(ElUpperOrLower uplo, ElDistMatrix_c A, ElDistMatrix_s s, ElDistMatrix_c U, ElDistMatrix_c V)
ElError ElHermitianSVDDist_z(ElUpperOrLower uplo, ElDistMatrix_z A, ElDistMatrix_d s, ElDistMatrix_z U, ElDistMatrix_z V)