svd.f90 Source File


Source Code

submodule(specialmatrices_diagonal) diagonal_singular_value_decomposition
   use stdlib_sorting, only: sort, sort_index
   use stdlib_linalg, only: eye
   implicit none(type, external)
contains
   module procedure svdvals_rdp
   s = abs(A%dv); call sort(s, reverse=.true.)
   end procedure

   module procedure svd_rdp
   integer(ilp) :: i, index(A%n)
   ! Sorted singular values.
   s = abs(A%dv); call sort_index(s, index, reverse=.true.)
   ! Left singular vectors.
   u = eye(A%n); u = u(:, index)
   ! Right singular vectors.
   vt = eye(A%n)
   do concurrent(i=1:A%n, A%dv(i) < 0.0_dp)
      vt(i, i) = -1.0_dp
   end do
   vt = vt(index, :)
   end procedure
end submodule