Hermitian SVD

Suppose that \(A\) is Hermitian, with a spectral decomposition

\[A = V \Lambda V^H.\]

Then an SVD of \(A\) can easily be computed as

\[A = U |\Lambda| V^H,\]

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=U \mathrm{diag}(s) V^H\).

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)