svd.f90 Source File


Source Code

submodule(specialmatrices_symtridiagonal) symtridiagonal_singular_value_decomposition
   implicit none(type, external)
contains
   module procedure svdvals_rdp
   ! Get singular values from the eigendecomposition.
   s = abs(eigvalsh(A))
   end procedure

   module procedure svd_rdp
   integer(ilp) :: i, n
   n = A%n
   ! Compute eigendecomposition.
   call eigh(A, s, u)
   ! Left singular vectors.
   if (present(vt)) then
      vt = u
      do concurrent(i=1:n, s(i) < 0.0_dp)
         vt(:, i) = -1.0_dp*vt(:, i)
      end do
      vt = transpose(vt)
   end if
   ! Singular values.
   s = abs(s)
   end procedure
end submodule