Skip to content

Commit bf02cd7

Browse files
committed
use gemm instead of matmul
1 parent ce36d85 commit bf02cd7

File tree

1 file changed

+4
-6
lines changed

1 file changed

+4
-6
lines changed

src/stdlib_linalg_pinv.fypp

Lines changed: 4 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -32,6 +32,8 @@ submodule(stdlib_linalg) stdlib_linalg_pseudoinverse
3232
${rt}$, allocatable :: u(:,:),vt(:,:)
3333
type(linalg_state_type) :: err0
3434
integer(ilp) :: m,n,k,i,j
35+
${rt}$, parameter :: alpha = 1.0_${rk}$, beta = 0.0_${rk}$
36+
character, parameter :: H = #{if rt.startswith('complex')}# 'C' #{else}# 'T' #{endif}#
3537

3638
! Problem size
3739
m = size(a,1,kind=ilp)
@@ -74,13 +76,9 @@ submodule(stdlib_linalg) stdlib_linalg_pseudoinverse
7476
! 1) compute (U * diag(1/s)) in-place
7577
do concurrent (i=1:m,j=1:k); u(i,j) = s(j)*u(i,j); end do
7678

77-
! 2) commutate matmul: A_pinv = V^H * (U * diag(1/s))^H = ((U * diag(1/s)) * V^H)^H.
79+
! 2) commutate matmul: A_pinv = V * (U * diag(1/s))^H = ((U * diag(1/s)) * V^H)^H.
7880
! This avoids one matrix transpose
79-
#:if rt.startswith('complex')
80-
pinva = conjg(transpose(matmul(u,vt)))
81-
#:else
82-
pinva = transpose(matmul(u,vt))
83-
#:endif
81+
call gemm(H, H, n, m, k, alpha, vt, k, u, m, beta, pinva, size(pinva,1,kind=ilp))
8482

8583
end subroutine stdlib_linalg_pseudoinvert_${ri}$
8684

0 commit comments

Comments
 (0)