ForSVD: A Fortran library for singular value decomposition (SVD) calculation, low-rank approximation, and image compression.
If you want to use ForSVD
as a dependency in your own fpm project,
you can easily include it by adding the following line to your fpm.toml
file:
[dependencies]
forsvd = {git="https://github.com/gha3mi/forsvd.git"}
Reuirements:
Fortran Compiler, LAPACK or MKL Libraries
Clone the repository:
You can clone the ForSVD
repository from GitHub using the following command:
git clone https://github.com/gha3mi/forsvd.git
cd forsvd
Intel Fortran Compiler (ifort)
fpm @ifort-test
Intel Fortran Compiler (ifx)
fpm @ifx-test
GNU Fortran Compiler (gfortran)
fpm @gfortran-test
NVIDIA Compiler (nvfortran)
fpm @nvfortran-test
use forsvd, only: svd
call svd(A, U,S,VT, method='gesvd') ! method='gesdd'
program example1
use kinds
use forsvd, only: svd
implicit none
real(rk), dimension(:, :), allocatable :: A, U, VT
real(rk), dimension(:), allocatable :: S
integer :: m, n, i, j
m = 4
n = 3
allocate(A(m,n), U(m,m), S(min(m,n)), VT(n,n))
call random_number(A)
A = A*10.0_rk
call svd(A, U,S,VT)
! Print U
print *, "U:"
print "(4F10.6)", (U(:,j), j = 1, m)
! Print S
print *, "S:"
print "(3F10.6)", S
! Print VT
print *, "VT:"
print "(3F10.6)", (VT(:,j), j = 1, n)
deallocate(A, U, S, VT)
end program example1
use forsvd, only: tsvd
call ts%lowrank(matrix=A, rank=n)
program example2
use kinds
use forsvd, only: tsvd
implicit none
real(rk), dimension(:,:), allocatable :: A
type(tsvd) :: ts
allocate(A(50,20))
call random_number(A)
A = A*100.0_rk
call ts%lowrank(matrix=A, rank=10)
print*, norm2(A - ts%matrix_app)/norm2(A)
call ts%dlloc()
end program example2
The most up-to-date API documentation for the master branch is available
here.
To generate the API documentation for ForSVD
using
ford run the following
command:
ford ford.yml
Contributions to ForSVD
are welcome!
If you find any issues or would like to suggest improvements, please open an issue.