pinvLU_rel Function

private pure function pinvLU_rel(A) result(Apinv)

Calculates the pseudoinverse of a matrix A using the LU decomposition.

Arguments

Type IntentOptional Attributes Name
real(kind=rk), intent(in), dimension(:, :), contiguous :: A

Return Value real(kind=rk), dimension(size(A,2), size(A,1))


Calls

proc~~pinvlu_rel~~CallsGraph proc~pinvlu_rel forinv::pinvLU_rel proc~gemm forinv::gemm proc~pinvlu_rel->proc~gemm proc~invlu_rel forinv::invLU_rel proc~pinvlu_rel->proc~invlu_rel

Called by

proc~~pinvlu_rel~~CalledByGraph proc~pinvlu_rel forinv::pinvLU_rel proc~pinv_rel forinv::pinv_rel proc~pinv_rel->proc~pinvlu_rel interface~inv forinv::inv interface~inv->proc~pinv_rel program~test1 test1 program~test1->interface~inv program~test2 test2 program~test2->interface~inv program~test3 test3 program~test3->interface~inv

Source Code

   pure function pinvLU_rel(A) result(Apinv)
#elif defined (IMPURE)
   impure function pinvLU_rel(A) result(Apinv)
#endif

      ! Inputs:
      real(rk), dimension(:, :), contiguous, intent(in) :: A     ! Input matrix A

      ! Outputs:
      real(rk), dimension(size(A,2), size(A,1))         :: Apinv ! Pseudoinverse of A

      if (size(A, 1) == size(A, 2)) then
         Apinv = invLU_rel(A)
      elseif (size(A, 1) > size(A, 2)) then
         Apinv = transpose(A)
         Apinv = gemm(invLU_rel(gemm(Apinv, A)), Apinv)
      else
         Apinv = transpose(A)
         Apinv = gemm(Apinv, invLU_rel(gemm(A, Apinv)))
      end if

   end function pinvLU_rel