Skip to content

Commit 37612f6

Browse files
committed
submodule
1 parent c54b959 commit 37612f6

File tree

3 files changed

+52
-35
lines changed

3 files changed

+52
-35
lines changed

src/stdlib_linalg.fypp

Lines changed: 47 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -29,6 +29,9 @@ module stdlib_linalg
2929
public :: inv
3030
public :: invert
3131
public :: operator(.inv.)
32+
public :: pinv
33+
public :: pseudoinvert
34+
public :: operator(.pinv.)
3235
public :: lstsq
3336
public :: lstsq_space
3437
public :: norm
@@ -809,6 +812,50 @@ module stdlib_linalg
809812
end interface operator(.inv.)
810813

811814

815+
! Moose-Penrose Pseudo-Inverse: Function interface
816+
interface pinv
817+
#:for rk,rt,ri in RC_KINDS_TYPES
818+
module function stdlib_linalg_pseudoinverse_${ri}$(a,rtol,err) result(pinva)
819+
!> Input matrix a[m,n]
820+
${rt}$, intent(in), target :: a(:,:)
821+
!> [optional] ....
822+
real(${rk}$), optional, intent(in) :: rtol
823+
!> [optional] state return flag. On error if not requested, the code will stop
824+
type(linalg_state_type), optional, intent(out) :: err
825+
!> Matrix pseudo-inverse
826+
${rt}$ :: pinva(size(a,2,kind=ilp),size(a,1,kind=ilp))
827+
end function stdlib_linalg_pseudoinverse_${ri}$
828+
#:endfor
829+
end interface pinv
830+
831+
! Matrix Inverse: Subroutine interface - in-place inversion
832+
interface pseudoinvert
833+
#:for rk,rt,ri in RC_KINDS_TYPES
834+
module subroutine stdlib_linalg_pseudoinvert_${ri}$(a,pinva,rtol,err)
835+
!> Input matrix a[m,n]
836+
${rt}$, intent(inout) :: a(:,:)
837+
!> Output pseudo-inverse matrix
838+
${rt}$, intent(inout) :: pinva(:,:)
839+
!> [optional] ....
840+
real(${rk}$), optional, intent(in) :: rtol
841+
!> [optional] state return flag. On error if not requested, the code will stop
842+
type(linalg_state_type), optional, intent(out) :: err
843+
end subroutine
844+
#:endfor
845+
end interface pseudoinvert
846+
847+
! Operator interface
848+
interface operator(.pinv.)
849+
#:for rk,rt,ri in RC_KINDS_TYPES
850+
module function stdlib_linalg_pinv_${ri}$_operator(a) result(pinva)
851+
!> Input matrix a[m,n]
852+
${rt}$, intent(in), target :: a(:,:)
853+
!> Result matrix
854+
${rt}$ :: pinva(size(a,2,kind=ilp),size(a,1,kind=ilp))
855+
end function
856+
#:endfor
857+
end interface operator(.pinv.)
858+
812859
! Eigendecomposition of a square matrix: eigenvalues, and optionally eigenvectors
813860
interface eig
814861
!! version: experimental

src/stdlib_linalg_pinv.fypp

Lines changed: 5 additions & 34 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
#:include "common.fypp"
22
#:set RC_KINDS_TYPES = REAL_KINDS_TYPES + CMPLX_KINDS_TYPES
3-
module stdlib_linalg_pseudoinverse
3+
submodule(stdlib_linalg) stdlib_linalg_pseudoinverse
44
!! Compute the (Moore-Penrose) pseudo-inverse of a matrix.
55
use stdlib_linalg_constants
66
use stdlib_linalg_blas
@@ -9,35 +9,6 @@ module stdlib_linalg_pseudoinverse
99
use stdlib_linalg, only: svd
1010
use iso_fortran_env,only:real32,real64,real128,int8,int16,int32,int64,stderr => error_unit
1111
implicit none(type,external)
12-
private
13-
14-
!> Pseudo-inverse: Function interface
15-
public :: pinv
16-
!> Pseudo-inverse: Subroutine interface (pre-allocated)
17-
public :: pseudoinvert
18-
!> Operator interface: .pinv.A returns the pseudo-inverse of A
19-
public :: operator(.pinv.)
20-
21-
! Function interface
22-
interface pinv
23-
#:for rk,rt,ri in RC_KINDS_TYPES
24-
module procedure stdlib_linalg_pseudoinverse_${ri}$
25-
#:endfor
26-
end interface pinv
27-
28-
! Subroutine interface
29-
interface pseudoinvert
30-
#:for rk,rt,ri in RC_KINDS_TYPES
31-
module procedure stdlib_linalg_pseudoinvert_${ri}$
32-
#:endfor
33-
end interface pseudoinvert
34-
35-
! Operator interface
36-
interface operator(.pinv.)
37-
#:for rk,rt,ri in RC_KINDS_TYPES
38-
module procedure stdlib_linalg_pinv_${ri}$_operator
39-
#:endfor
40-
end interface operator(.pinv.)
4112

4213
character(*), parameter :: this = 'pseudo-inverse'
4314

@@ -46,7 +17,7 @@ module stdlib_linalg_pseudoinverse
4617
#:for rk,rt,ri in RC_KINDS_TYPES
4718

4819
! Compute the in-place pseudo-inverse of matrix a
49-
subroutine stdlib_linalg_pseudoinvert_${ri}$(a,pinva,rtol,err)
20+
module subroutine stdlib_linalg_pseudoinvert_${ri}$(a,pinva,rtol,err)
5021
!> Input matrix a[m,n]
5122
${rt}$, intent(inout) :: a(:,:)
5223
!> Output pseudo-inverse matrix
@@ -115,7 +86,7 @@ module stdlib_linalg_pseudoinverse
11586
end subroutine stdlib_linalg_pseudoinvert_${ri}$
11687

11788
! Function interface
118-
function stdlib_linalg_pseudoinverse_${ri}$(a,rtol,err) result(pinva)
89+
module function stdlib_linalg_pseudoinverse_${ri}$(a,rtol,err) result(pinva)
11990
!> Input matrix a[m,n]
12091
${rt}$, intent(in), target :: a(:,:)
12192
!> [optional] ....
@@ -134,7 +105,7 @@ module stdlib_linalg_pseudoinverse
134105
end function stdlib_linalg_pseudoinverse_${ri}$
135106

136107
! Inverse matrix operator
137-
function stdlib_linalg_pinv_${ri}$_operator(a) result(pinva)
108+
module function stdlib_linalg_pinv_${ri}$_operator(a) result(pinva)
138109
!> Input matrix a[m,n]
139110
${rt}$, intent(in), target :: a(:,:)
140111
!> Result matrix
@@ -150,4 +121,4 @@ module stdlib_linalg_pseudoinverse
150121

151122
#:endfor
152123

153-
end module stdlib_linalg_pseudoinverse
124+
end submodule stdlib_linalg_pseudoinverse

test/linalg/test_linalg_pseudoinverse.fypp

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,6 @@ module test_linalg_pseudoinverse
55
use testdrive, only: error_type, check, new_unittest, unittest_type
66
use stdlib_linalg
77
use stdlib_linalg_constants
8-
use stdlib_linalg_pseudoinverse
98

109
implicit none (type,external)
1110
private

0 commit comments

Comments
 (0)