1
1
#:include "common.fypp"
2
- ! Compute the (Moore-Penrose) pseudo-inverse of a matrix.
2
+ #:set RC_KINDS_TYPES = REAL_KINDS_TYPES + CMPLX_KINDS_TYPES
3
3
module stdlib_linalg_pseudoinverse
4
+ !! Compute the (Moore-Penrose) pseudo-inverse of a matrix.
4
5
use stdlib_linalg_constants
5
6
use stdlib_linalg_blas
6
7
use stdlib_linalg_lapack
7
8
use stdlib_linalg_state
8
- use stdlib_linalg_svd , only: svd
9
+ use stdlib_linalg , only: svd
9
10
use iso_fortran_env,only:real32,real64,real128,int8,int16,int32,int64,stderr => error_unit
10
11
implicit none(type,external)
11
12
private
@@ -19,21 +20,21 @@ module stdlib_linalg_pseudoinverse
19
20
20
21
! Function interface
21
22
interface pinv
22
- #:for rk,rt,ri in ALL_KINDS_TYPES
23
+ #:for rk,rt,ri in RC_KINDS_TYPES
23
24
module procedure stdlib_linalg_pseudoinverse_${ri}$
24
25
#:endfor
25
26
end interface pinv
26
27
27
28
! Subroutine interface
28
29
interface pseudoinvert
29
- #:for rk,rt,ri in ALL_KINDS_TYPES
30
+ #:for rk,rt,ri in RC_KINDS_TYPES
30
31
module procedure stdlib_linalg_pseudoinvert_${ri}$
31
32
#:endfor
32
33
end interface pseudoinvert
33
34
34
35
! Operator interface
35
36
interface operator(.pinv.)
36
- #:for rk,rt,ri in ALL_KINDS_TYPES
37
+ #:for rk,rt,ri in RC_KINDS_TYPES
37
38
module procedure stdlib_linalg_pinv_${ri}$_operator
38
39
#:endfor
39
40
end interface operator(.pinv.)
@@ -42,7 +43,7 @@ module stdlib_linalg_pseudoinverse
42
43
43
44
contains
44
45
45
- #:for rk,rt,ri in ALL_KINDS_TYPES
46
+ #:for rk,rt,ri in RC_KINDS_TYPES
46
47
47
48
! Compute the in-place pseudo-inverse of matrix a
48
49
subroutine stdlib_linalg_pseudoinvert_${ri}$(a,pinva,rtol,err)
@@ -53,27 +54,27 @@ module stdlib_linalg_pseudoinverse
53
54
!> [optional] ....
54
55
real(${rk}$), optional, intent(in) :: rtol
55
56
!> [optional] state return flag. On error if not requested, the code will stop
56
- type(linalg_state ), optional, intent(out) :: err
57
+ type(linalg_state_type ), optional, intent(out) :: err
57
58
58
59
! Local variables
59
60
real(${rk}$) :: tolerance,cutoff
60
61
real(${rk}$), allocatable :: s(:)
61
62
${rt}$, allocatable :: u(:,:),vt(:,:)
62
- type(linalg_state ) :: err0
63
+ type(linalg_state_type ) :: err0
63
64
integer(ilp) :: m,n,k,i,j
64
65
65
66
! Problem size
66
67
m = size(a,1,kind=ilp)
67
68
n = size(a,2,kind=ilp)
68
69
k = min(m,n)
69
70
if (m<1 .or. n<1) then
70
- err0 = linalg_state (this,LINALG_VALUE_ERROR,'invalid matrix size: a=',[m,n])
71
+ err0 = linalg_state_type (this,LINALG_VALUE_ERROR,'invalid matrix size: a=',[m,n])
71
72
call linalg_error_handling(err0,err)
72
73
return
73
74
end if
74
75
75
76
if (any(shape(pinva,kind=ilp)/=[n,m])) then
76
- err0 = linalg_state (this,LINALG_VALUE_ERROR,'invalid pinv size:',shape(pinva),'should be',[n,m])
77
+ err0 = linalg_state_type (this,LINALG_VALUE_ERROR,'invalid pinv size:',shape(pinva),'should be',[n,m])
77
78
call linalg_error_handling(err0,err)
78
79
return
79
80
end if
@@ -89,7 +90,7 @@ module stdlib_linalg_pseudoinverse
89
90
allocate(s(k),u(m,k),vt(k,n))
90
91
call svd(a,s,u,vt,overwrite_a=.false.,full_matrices=.false.,err=err0)
91
92
if (err0%error()) then
92
- err0 = linalg_state (this,LINALG_ERROR,'svd failure -',err0%message)
93
+ err0 = linalg_state_type (this,LINALG_ERROR,'svd failure -',err0%message)
93
94
call linalg_error_handling(err0,err)
94
95
return
95
96
endif
@@ -120,7 +121,7 @@ module stdlib_linalg_pseudoinverse
120
121
!> [optional] ....
121
122
real(${rk}$), optional, intent(in) :: rtol
122
123
!> [optional] state return flag. On error if not requested, the code will stop
123
- type(linalg_state ), optional, intent(out) :: err
124
+ type(linalg_state_type ), optional, intent(out) :: err
124
125
!> Matrix pseudo-inverse
125
126
${rt}$ :: pinva(size(a,2,kind=ilp),size(a,1,kind=ilp))
126
127
0 commit comments