Man page - gesvj(3)
Packages contains this manual
- hptrd(3)
- potri(3)
- xerbla_array(3)
- ggsvd_driver_grp(3)
- hfrk(3)
- getsqr_comp_grp(3)
- laed6(3)
- gtrfs(3)
- lasdq(3)
- gglse(3)
- la_xisnan_la_isnan(3)
- unmr2(3)
- hetrs_aa(3)
- tpttr(3)
- gerz_comp_grp(3)
- potrf(3)
- hegv_driver(3)
- laqps(3)
- ggqr_comp_grp(3)
- ilalc(3)
- ung2r(3)
- heevd(3)
- pstf2(3)
- lacn2(3)
- ptrfs(3)
- ungrq(3)
- gelqf(3)
- ppsv_comp(3)
- blas2_full(3)
- gemlqt(3)
- unml2(3)
- tplqt(3)
- tpcon(3)
- getf2(3)
- ggbak(3)
- bdsvd_driver(3)
- lamch(3)
- gelq(3)
- gebal(3)
- laqr1(3)
- ptsvx(3)
- lahr2(3)
- larscl2(3)
- geqrt(3)
- larfb(3)
- gtsv_comp(3)
- gesvd_aux(3)
- hbevx_2stage(3)
- hbgvx(3)
- tprfs(3)
- params_grp(3)
- lahef(3)
- laqr_group(3)
- unmqr(3)
- tgsy2(3)
- tfsv_comp(3)
- ggls_driver_grp(3)
- geev(3)
- latrd(3)
- unbdb4(3)
- bbcsd(3)
- lange(3)
- gelq_comp3(3)
- gttrs(3)
- lasy2(3)
- hetf2_rook(3)
- gtsv(3)
- lalsd(3)
- lanhb(3)
- laqhb(3)
- hgeqz(3)
- gesvj(3)
- gsvj0(3)
- ungtsqr_row(3)
- gelq_comp1(3)
- gemmtr(3)
- pbequ(3)
- heev_driver(3)
- unhr_col(3)
- syconvf_rook(3)
- getc2(3)
- syconv(3)
- norm_grp(3)
- larrc(3)
- laqr4(3)
- posv_comp(3)
- geev_driver_grp(3)
- heev_comp(3)
- pfsv(3)
- trevc3(3)
- gesv_driver_grp(3)
- reflector_aux_grp(3)
- langt(3)
- lacrt(3)
- latdf(3)
- hetrs_aa_2stage(3)
- lamc1(3)
- hpev_driver(3)
- hegvd(3)
- pptri(3)
- geqrt3(3)
- gelqt3(3)
- lasd5(3)
- laeda(3)
- geqr(3)
- lamtsqr(3)
- heev(3)
- hpev_comp(3)
- larfg(3)
- blas2_grp(3)
- hesv_rook(3)
- laexc(3)
- hetrd(3)
- geesx(3)
- ppsvx(3)
- blas_top(3)
- gtts2(3)
- la_herpvgrw(3)
- hpevx(3)
- ggevx(3)
- lahqr(3)
- gelq_comp_grp(3)
- hesv_comp_v3(3)
- tplqt2(3)
- hpev(3)
- hbtrd(3)
- getrs(3)
- hecon_3(3)
- lasrt(3)
- lanhe(3)
- gesv_comp(3)
- gbequ(3)
- hetrf_rk(3)
- laqr3(3)
- heev_comp_grp(3)
- ungtsqr(3)
- ppcon(3)
- ggrq_comp_grp(3)
- larmm(3)
- ieeeck(3)
- geqrf(3)
- solve_aux_grp(3)
- herfs(3)
- posvx(3)
- posvxx(3)
- gges3(3)
- hbgvd(3)
- lantb(3)
- lasd_comp_grp(3)
- hpgvx(3)
- lapy2(3)
- lauu2(3)
- copy(3)
- getsqrhrt(3)
- stev_comp_grp(3)
- laev2(3)
- larfb_gett(3)
- trti2(3)
- laqz4(3)
- hegv_driver_grp(3)
- la_porfsx_extended(3)
- laruv(3)
- ggsvd_comp_grp(3)
- dot(3)
- gehd2(3)
- lanhf(3)
- hetri_rook(3)
- pfsv_comp(3)
- gbtrf(3)
- hpgst(3)
- getri(3)
- trevc(3)
- unmrz(3)
- hsein(3)
- lsamen(3)
- lasd6(3)
- trtri(3)
- ggglm(3)
- las2(3)
- latrs(3)
- lapll(3)
- gemlq(3)
- geqpf_comp_grp(3)
- stemr(3)
- rotm(3)
- disna(3)
- ggrqf(3)
- pptrf(3)
- lasd0(3)
- lals0(3)
- laqz2(3)
- hbev_driver2(3)
- geswlq_comp_grp(3)
- laqr0(3)
- trttp(3)
- stedc(3)
- lasq4(3)
- geev_comp_grp(3)
- ungbr(3)
- lanv2(3)
- hpsv(3)
- pprfs(3)
- gehrd(3)
- ppsv(3)
- lagtm(3)
- hpgv(3)
- trsv_comp(3)
- larfx(3)
- gesv_driver(3)
- gerfsx(3)
- la_geamv(3)
- laed9(3)
- tpqrt2(3)
- uncsd(3)
- gecs_comp_grp(3)
- bdsqr(3)
- hegv_comp_grp(3)
- labad(3)
- geqp3(3)
- gesvdq(3)
- tfttp(3)
- laln2(3)
- uncsd2by1(3)
- blas2_like_grp(3)
- latbs(3)
- hbgst(3)
- larrv(3)
- ilaenv2stage(3)
- bdsvdx(3)
- hegs2(3)
- lasq_comp_grp(3)
- hpr2(3)
- laqhe(3)
- larra(3)
- gemqrt(3)
- hbmv(3)
- hpsv_driver(3)
- lacp2(3)
- lapmt(3)
- gecon(3)
- unbdb5(3)
- la_gerpvgrw(3)
- tgex2(3)
- laqhp(3)
- tftri(3)
- getrf2(3)
- porfs(3)
- lartg(3)
- lagts(3)
- ggev_comp_grp(3)
- lasd3(3)
- geqr_comp2(3)
- laqz_group(3)
- pftri(3)
- hetri2x(3)
- lahef_aa(3)
- svd_driver_grp(3)
- gbsv_driver(3)
- hesv_comp_aasen2(3)
- laqtr(3)
- lag2(3)
- la_porcond(3)
- hbev(3)
- pbtrf(3)
- lascl(3)
- larr_comp_grp(3)
- hecon(3)
- pttrs(3)
- lasd8(3)
- lsame(3)
- unm2l(3)
- potrs(3)
- tptrs(3)
- lartv(3)
- trtrs(3)
- gsvj1(3)
- sum1(3)
- larrj(3)
- gbmv(3)
- posv(3)
- gghd3(3)
- geev_top(3)
- geqr_comp_grp(3)
- laset(3)
- hesvxx(3)
- posv_comp_grp(3)
- lahef_rk(3)
- lasd1(3)
- tprfb(3)
- potf2(3)
- laein(3)
- lamc4(3)
- stevd(3)
- gtsv_driver(3)
- gesvd_comp_grp(3)
- la_constants(3)
- gesvx(3)
- hseqr(3)
- launhr_col_getrfnp2(3)
- trcon(3)
- larre(3)
- gelsy(3)
- ptsv(3)
- lacon(3)
- laed_comp_grp(3)
- hpsvx(3)
- gemm(3)
- poequ(3)
- laesy(3)
- lagtf(3)
- trrfs(3)
- ggev3(3)
- pbstf(3)
- poequb(3)
- heevr(3)
- lanhp(3)
- unbdb3(3)
- tgsyl(3)
- lamc5(3)
- geqr2p(3)
- ungqr(3)
- laqz3(3)
- imax1(3)
- gels_top(3)
- hesv(3)
- gelqt(3)
- pfsv_driver(3)
- stegr(3)
- gerqf(3)
- laisnan(3)
- ilatrans(3)
- gbsv_comp(3)
- pbrfs(3)
- lascl2(3)
- larz(3)
- la_hercond(3)
- tgexc(3)
- ggesx(3)
- unbdb6(3)
- ungl2(3)
- laed_comp2(3)
- rscl(3)
- hegv(3)
- gelst(3)
- gbtrs(3)
- pftrf(3)
- langb(3)
- lantr(3)
- laqgb(3)
- ggsvp3(3)
- bdsdc(3)
- ladiv(3)
- laqge(3)
- iparmq(3)
- ggbal(3)
- hb2st_kernels(3)
- lartgs(3)
- lartgp(3)
- rot(3)
- ppequ(3)
- laed3(3)
- her(3)
- hptri(3)
- stevx(3)
- upgtr(3)
- lar2v(3)
- hbev_2stage(3)
- gejsv(3)
- ppsv_driver(3)
- unm22(3)
- gesvxx(3)
- laqz0(3)
- unmtr(3)
- laed5(3)
- tptri(3)
- laed0(3)
- heev_driver2(3)
- hpcon(3)
- lasd4(3)
- hetrf_aa(3)
- geqr_comp3(3)
- rot_aux_grp(3)
- aux_grp(3)
- laebz(3)
- trsyl3(3)
- gges(3)
- gesdd(3)
- trexc(3)
- ung2l(3)
- gesv(3)
- laed4(3)
- md__r_e_a_d_m_e(3)
- blas3_like_grp(3)
- laed1(3)
- larcm(3)
- hbevx(3)
- hesv_driver_grp(3)
- hetrs(3)
- hbevd_2stage(3)
- blas1_grp(3)
- laic1(3)
- geql_comp_grp(3)
- heev_2stage(3)
- hpmv(3)
- pbtf2(3)
- hetrf_aa_2stage(3)
- hbgv(3)
- pptrs(3)
- lapmr(3)
- tpqr_comp_grp(3)
- larfy(3)
- gedmd(3)
- lasr(3)
- hetrd_2stage(3)
- gerfs(3)
- ungtr(3)
- porfsx(3)
- tpmv(3)
- lasd_comp2(3)
- unmbr(3)
- tbtrs(3)
- hetd2(3)
- trsv_comp_grp(3)
- lapy3(3)
- ptts2(3)
- unmhr(3)
- hbev_driver(3)
- lalsa(3)
- tbsv_comp(3)
- hesv_comp_v1(3)
- geql2(3)
- sterf(3)
- larrd(3)
- larft(3)
- lagv2(3)
- gttrf(3)
- tpqrt(3)
- la_lin_berr(3)
- rotg(3)
- solve_top(3)
- lacgv(3)
- larrf(3)
- tbmv(3)
- trsyl(3)
- geequ(3)
- upmtr(3)
- hpgv_driver(3)
- tbsv(3)
- hesvx(3)
- latrz(3)
- tfttr(3)
- gesv_comp_grp(3)
- xerbla_grp(3)
- tpsv(3)
- blas3_grp(3)
- gesvd_driver(3)
- geqr_comp1(3)
- ggev_driver_grp(3)
- la_gbamv(3)
- tpmlqt(3)
- trttf(3)
- larzb(3)
- unmr3(3)
- hecon_rook(3)
- stebz(3)
- lantp(3)
- laqz1(3)
- hesv_rk(3)
- tbcon(3)
- xerbla(3)
- posv_mixed(3)
- latps(3)
- hesv_aa_driver(3)
- gemqr(3)
- larrr(3)
- gebrd(3)
- tgsna(3)
- la_gercond(3)
- gbsv(3)
- hesv_comp_grp(3)
- gesv_mixed(3)
- gghrd(3)
- gbrfs(3)
- tpmqrt(3)
- lasq3(3)
- tpsv_comp(3)
- largv(3)
- gelsd(3)
- pftrs(3)
- asum(3)
- launhr_col_getrfnp(3)
- hptrf(3)
- lacpy(3)
- gesc2(3)
- lasda(3)
- second(3)
- hprfs(3)
- hpsv_comp(3)
- lamrg(3)
- pbsv_comp(3)
- hegv_2stage(3)
- gerq2(3)
- lasdt(3)
- abs1(3)
- hbevd(3)
- hbev_comp(3)
- trsv(3)
- la_porpvgrw(3)
- la_gbrpvgrw(3)
- hbgv_driver(3)
- tgsja(3)
- gebd2(3)
- geqr2(3)
- unm2r(3)
- unmql(3)
- la_gbrfsx_extended(3)
- gelq_comp2(3)
- iparam2stage(3)
- ger(3)
- larf(3)
- ilaprec(3)
- labrd(3)
- unbdb1(3)
- unmlq(3)
- geequb(3)
- la_herfsx_extended(3)
- unbdb2(3)
- lapack_top(3)
- ptsv_driver(3)
- hetrs2(3)
- geqr_comp4(3)
- pbsv(3)
- posv_driver(3)
- steqr(3)
- gels(3)
- lar1v(3)
- hemv(3)
- la_transtype(3)
- hesv_aa(3)
- lacrm(3)
- stevr(3)
- hetf2_rk(3)
- blas2_banded(3)
- stein(3)
- unmrq(3)
- larrk(3)
- hetri2(3)
- hesv_aa_2stage(3)
- pttrf(3)
- gelss(3)
- pbsv_driver(3)
- lasq5(3)
- heevx_2stage(3)
- hetri(3)
- lasd2(3)
- laed2(3)
- pbcon(3)
- ptcon(3)
- laed7(3)
- gels_aux_grp(3)
- hpgvd(3)
- hetf2(3)
- tzrzf(3)
- hpr(3)
- unitary_top(3)
- latsqr(3)
- ungql(3)
- her2(3)
- hetri_3x(3)
- hetrd_hb2st(3)
- tgsen(3)
- ggsvd3(3)
- lasq6(3)
- set_grp(3)
- larfgp(3)
- gels_driver_grp(3)
- pbtrs(3)
- lamswlq(3)
- lanht(3)
- gbsvxx(3)
- tgevc(3)
- ilaenv(3)
- swap(3)
- lae2(3)
- iladiag(3)
- lasq2(3)
- la_heamv(3)
- blas_like_top(3)
- la_gerfsx_extended(3)
- hegst(3)
- tfsm(3)
- gesvd(3)
- ungr2(3)
- ggev(3)
- aux_top(3)
- blas2_packed(3)
- geqlf(3)
- hetrs_rook(3)
- gelq2(3)
- geqrfp(3)
- gbequb(3)
- stev(3)
- lauum(3)
- potrf2(3)
- lamc3(3)
- gbrfsx(3)
- gerq_comp_grp(3)
- pocon(3)
- tbrfs(3)
- heswapr(3)
- lamc2(3)
- hpevd(3)
- hesv_comp_aasen(3)
- scalar_grp(3)
- gemv(3)
- lasv2(3)
- lanhs(3)
- svd_top(3)
- gbsvx(3)
- gesvdx(3)
- tplq_comp_grp(3)
- hesv_driver(3)
- hesv_comp_v2(3)
- trsen(3)
- syconvf(3)
- lasd7(3)
- gbcon(3)
- unbdb(3)
- heev_driver_grp(3)
- ggqrf(3)
- heevx(3)
- gtsvx(3)
- lahef_rook(3)
- hetrf_rook(3)
- hetrf(3)
- trsna(3)
- gebak(3)
- larnv(3)
- ptsv_comp(3)
- laswlq(3)
- lags2(3)
- laed8(3)
- laswp(3)
- hptrs(3)
- unglq(3)
- la_wwaddw(3)
- getrf(3)
- gees(3)
- gbtf2(3)
- hegvx(3)
- latrs3(3)
- roundup_lwork(3)
- unghr(3)
- iamax(3)
- larzt(3)
- pteqr(3)
- ilaver(3)
- trmv(3)
- la_gbrcond(3)
- blas0_like_grp(3)
- nrm2(3)
- heev_top(3)
- gtcon(3)
- heevr_2stage(3)
- pstrf(3)
- rot_comp(3)
- laqr5(3)
- heevd_2stage(3)
- getsls(3)
- hetrd_he2hb(3)
- heequb(3)
- laqp2(3)
- axpy(3)
- blast_aux(3)
- rotmg(3)
- pbsvx(3)
- ilauplo(3)
- herfsx(3)
- laqr2(3)
- blas1_like_grp(3)
- lassq(3)
- larrb(3)
- stev_driver(3)
- geevx(3)
- tpttf(3)
- scal(3)
- laneg(3)
- posv_driver_grp(3)
- lasq1(3)
- hetrs_3(3)
- geqrt2(3)
- gbbrd(3)
- ilalr(3)
- hetri_3(3)
apt-get install liblapack-doc
Manual
gesvj
NAMESYNOPSIS
Functions
Detailed Description
Function Documentation
subroutine cgesvj (character*1 joba, character*1 jobu, character*1 jobv,integer m, integer n, complex, dimension( lda, * ) a, integer lda,real, dimension( n ) sva, integer mv, complex, dimension( ldv, * ) v,integer ldv, complex, dimension( lwork ) cwork, integer lwork, real,dimension( lrwork ) rwork, integer lrwork, integer info)
subroutine dgesvj (character*1 joba, character*1 jobu, character*1 jobv,integer m, integer n, double precision, dimension( lda, * ) a, integerlda, double precision, dimension( n ) sva, integer mv, doubleprecision, dimension( ldv, * ) v, integer ldv, double precision,dimension( lwork ) work, integer lwork, integer info)
subroutine sgesvj (character*1 joba, character*1 jobu, character*1 jobv,integer m, integer n, real, dimension( lda, * ) a, integer lda, real,dimension( n ) sva, integer mv, real, dimension( ldv, * ) v, integerldv, real, dimension( lwork ) work, integer lwork, integer info)
subroutine zgesvj (character*1 joba, character*1 jobu, character*1 jobv,integer m, integer n, complex*16, dimension( lda, * ) a, integer lda,double precision, dimension( n ) sva, integer mv, complex*16,dimension( ldv, * ) v, integer ldv, complex*16, dimension( lwork )cwork, integer lwork, double precision, dimension( lrwork ) rwork,integer lrwork, integer info)
Author
NAME
gesvj - gesvj: SVD, Jacobi, low-level
SYNOPSIS
Functions
subroutine
cgesvj
(joba, jobu, jobv, m, n, a, lda, sva, mv, v,
ldv, cwork, lwork, rwork, lrwork, info)
CGESVJ
subroutine
dgesvj
(joba, jobu, jobv, m, n, a, lda,
sva, mv, v, ldv, work, lwork, info)
DGESVJ
subroutine
sgesvj
(joba, jobu, jobv, m, n, a, lda,
sva, mv, v, ldv, work, lwork, info)
SGESVJ
subroutine
zgesvj
(joba, jobu, jobv, m, n, a, lda,
sva, mv, v, ldv, cwork, lwork, rwork, lrwork, info)
ZGESVJ
Detailed Description
Function Documentation
subroutine cgesvj (character*1 joba, character*1 jobu, character*1 jobv,integer m, integer n, complex, dimension( lda, * ) a, integer lda,real, dimension( n ) sva, integer mv, complex, dimension( ldv, * ) v,integer ldv, complex, dimension( lwork ) cwork, integer lwork, real,dimension( lrwork ) rwork, integer lrwork, integer info)
CGESVJ
Purpose:
CGESVJ computes
the singular value decomposition (SVD) of a complex
M-by-N matrix A, where M >= N. The SVD of A is written as
[++] [xx] [x0] [xx]
A = U * SIGMA * VΛ*, [++] = [xx] * [ox] * [xx]
[++] [xx]
where SIGMA is an N-by-N diagonal matrix, U is an M-by-N
orthonormal
matrix, and V is an N-by-N unitary matrix. The diagonal
elements
of SIGMA are the singular values of A. The columns of U and
V are the
left and the right singular vectors of A, respectively.
Parameters
JOBA
JOBA is
CHARACTER*1
Specifies the structure of A.
= βLβ: The input matrix A is lower triangular;
= βUβ: The input matrix A is upper triangular;
= βGβ: The input matrix A is general M-by-N
matrix, M >= N.
JOBU
JOBU is
CHARACTER*1
Specifies whether to compute the left singular vectors
(columns of U):
= βUβ or βFβ: The left singular
vectors corresponding to the nonzero
singular values are computed and returned in the leading
columns of A. See more details in the description of A.
The default numerical orthogonality threshold is set to
approximately TOL=CTOL*EPS, CTOL=SQRT(M),
EPS=SLAMCH(βEβ).
= βCβ: Analogous to JOBU=βUβ, except
that user can control the
level of numerical orthogonality of the computed left
singular vectors. TOL can be set to TOL = CTOL*EPS, where
CTOL is given on input in the array WORK.
No CTOL smaller than ONE is allowed. CTOL greater
than 1 / EPS is meaningless. The option βCβ
can be used if M*EPS is satisfactory orthogonality
of the computed left singular vectors, so CTOL=M could
save few sweeps of Jacobi rotations.
See the descriptions of A and WORK(1).
= βNβ: The matrix U is not computed. However,
see the
description of A.
JOBV
JOBV is
CHARACTER*1
Specifies whether to compute the right singular vectors,
that
is, the matrix V:
= βVβ or βJβ: the matrix V is
computed and returned in the array V
= βAβ: the Jacobi rotations are applied to the
MV-by-N
array V. In other words, the right singular vector
matrix V is not computed explicitly; instead it is
applied to an MV-by-N matrix initially stored in the
first MV rows of V.
= βNβ: the matrix V is not computed and the
array V is not
referenced
M
M is INTEGER
The number of rows of the input matrix A.
1/SLAMCH(βEβ) > M >= 0.
N
N is INTEGER
The number of columns of the input matrix A.
M >= N >= 0.
A
A is COMPLEX
array, dimension (LDA,N)
On entry, the M-by-N matrix A.
On exit,
If JOBU = βUβ .OR. JOBU = βCβ:
If INFO = 0 :
RANKA orthonormal columns of U are returned in the
leading RANKA columns of the array A. Here RANKA <= N
is the number of computed singular values of A that are
above the underflow threshold SLAMCH(βSβ). The
singular
vectors corresponding to underflowed or zero singular
values are not computed. The value of RANKA is returned
in the array RWORK as RANKA=NINT(RWORK(2)). Also see the
descriptions of SVA and RWORK. The computed columns of U
are mutually numerically orthogonal up to approximately
TOL=SQRT(M)*EPS (default); or TOL=CTOL*EPS (JOBU =
βCβ),
see the description of JOBU.
If INFO > 0,
the procedure CGESVJ did not converge in the given number
of iterations (sweeps). In that case, the computed
columns of U may not be orthogonal up to TOL. The output
U (stored in A), SIGMA (given by the computed singular
values in SVA(1:N)) and V is still a decomposition of the
input matrix A in the sense that the residual
|| A - SCALE * U * SIGMA * VΛ* ||_2 / ||A||_2 is small.
If JOBU = βNβ:
If INFO = 0 :
Note that the left singular vectors are βfor
freeβ in the
one-sided Jacobi SVD algorithm. However, if only the
singular values are needed, the level of numerical
orthogonality of U is not an issue and iterations are
stopped when the columns of the iterated matrix are
numerically orthogonal up to approximately M*EPS. Thus,
on exit, A contains the columns of U scaled with the
corresponding singular values.
If INFO > 0 :
the procedure CGESVJ did not converge in the given number
of iterations (sweeps).
LDA
LDA is INTEGER
The leading dimension of the array A. LDA >=
max(1,M).
SVA
SVA is REAL
array, dimension (N)
On exit,
If INFO = 0 :
depending on the value SCALE = RWORK(1), we have:
If SCALE = ONE:
SVA(1:N) contains the computed singular values of A.
During the computation SVA contains the Euclidean column
norms of the iterated matrices in the array A.
If SCALE .NE. ONE:
The singular values of A are SCALE*SVA(1:N), and this
factored representation is due to the fact that some of the
singular values of A might underflow or overflow.
If INFO > 0
:
the procedure CGESVJ did not converge in the given number of
iterations (sweeps) and SCALE*SVA(1:N) may not be
accurate.
MV
MV is INTEGER
If JOBV = βAβ, then the product of Jacobi
rotations in CGESVJ
is applied to the first MV rows of V. See the description of
JOBV.
V
V is COMPLEX
array, dimension (LDV,N)
If JOBV = βVβ, then V contains on exit the
N-by-N matrix of
the right singular vectors;
If JOBV = βAβ, then V contains the product of
the computed right
singular vector matrix and the initial matrix in
the array V.
If JOBV = βNβ, then V is not referenced.
LDV
LDV is INTEGER
The leading dimension of the array V, LDV >= 1.
If JOBV = βVβ, then LDV >= max(1,N).
If JOBV = βAβ, then LDV >= max(1,MV) .
CWORK
CWORK is
COMPLEX array, dimension (max(1,LWORK))
Used as workspace.
LWORK
LWORK is
INTEGER.
Length of CWORK.
LWORK >= 1, if MIN(M,N) = 0, and LWORK >= M+N,
otherwise.
If on entry
LWORK = -1, then a workspace query is assumed and
no computation is done; CWORK(1) is set to the minial (and
optimal)
length of CWORK.
RWORK
RWORK is REAL
array, dimension (max(6,LRWORK))
On entry,
If JOBU = βCβ :
RWORK(1) = CTOL, where CTOL defines the threshold for
convergence.
The process stops if all columns of A are mutually
orthogonal up to CTOL*EPS, EPS=SLAMCH(βEβ).
It is required that CTOL >= ONE, i.e. it is not
allowed to force the routine to obtain orthogonality
below EPSILON.
On exit,
RWORK(1) = SCALE is the scaling factor such that
SCALE*SVA(1:N)
are the computed singular values of A.
(See description of SVA().)
RWORK(2) = NINT(RWORK(2)) is the number of the computed
nonzero
singular values.
RWORK(3) = NINT(RWORK(3)) is the number of the computed
singular
values that are larger than the underflow threshold.
RWORK(4) = NINT(RWORK(4)) is the number of sweeps of Jacobi
rotations needed for numerical convergence.
RWORK(5) = max_{i.NE.j} |COS(A(:,i),A(:,j))| in the last
sweep.
This is useful information in cases when CGESVJ did
not converge, as it can be used to estimate whether
the output is still useful and for post festum analysis.
RWORK(6) = the largest absolute value over all sines of the
Jacobi rotation angles in the last sweep. It can be
useful for a post festum analysis.
LRWORK
LRWORK is
INTEGER
Length of RWORK.
LRWORK >= 1, if MIN(M,N) = 0, and LRWORK >= MAX(6,N),
otherwise
If on entry
LRWORK = -1, then a workspace query is assumed and
no computation is done; RWORK(1) is set to the minial (and
optimal)
length of RWORK.
INFO
INFO is INTEGER
= 0: successful exit.
< 0: if INFO = -i, then the i-th argument had an illegal
value
> 0: CGESVJ did not converge in the maximal allowed
number
(NSWEEP=30) of sweeps. The output may still be useful.
See the description of RWORK.
Author
Univ. of Tennessee
Univ. of California Berkeley
Univ. of Colorado Denver
NAG Ltd.
Further Details:
The orthogonal
N-by-N matrix V is obtained as a product of Jacobi plane
rotations. In the case of underflow of the tangent of the
Jacobi angle, a
modified Jacobi transformation of Drmac [3] is used. Pivot
strategy uses
column interchanges of de Rijk [1]. The relative accuracy of
the computed
singular values and the accuracy of the computed singular
vectors (in
angle metric) is as guaranteed by the theory of Demmel and
Veselic [2].
The condition number that determines the accuracy in the
full rank case
is essentially min_{D=diag} kappa(A*D), where kappa(.) is
the
spectral condition number. The best performance of this
Jacobi SVD
procedure is achieved if used in an accelerated version of
Drmac and
Veselic [4,5], and it is the kernel routine in the SIGMA
library [6].
Some tuning parameters (marked with [TP]) are available for
the
implementer.
The computational range for the nonzero singular values is
the machine
number interval ( UNDERFLOW , OVERFLOW ). In extreme cases,
even
denormalized singular values can be computed with the
corresponding
gradual loss of accurate digits.
Contributor:
============
Zlatko Drmac (Zagreb, Croatia)
References:
[1] P. P. M. De
Rijk: A one-sided Jacobi algorithm for computing the
singular value decomposition on a vector computer.
SIAM J. Sci. Stat. Comp., Vol. 10 (1998), pp. 359-371.
[2] J. Demmel and K. Veselic: Jacobi method is more accurate
than QR.
[3] Z. Drmac: Implementation of Jacobi rotations for
accurate singular
value computation in floating point arithmetic.
SIAM J. Sci. Comp., Vol. 18 (1997), pp. 1200-1222.
[4] Z. Drmac and K. Veselic: New fast and accurate Jacobi
SVD algorithm I.
SIAM J. Matrix Anal. Appl. Vol. 35, No. 2 (2008), pp.
1322-1342.
LAPACK Working note 169.
[5] Z. Drmac and K. Veselic: New fast and accurate Jacobi
SVD algorithm II.
SIAM J. Matrix Anal. Appl. Vol. 35, No. 2 (2008), pp.
1343-1362.
LAPACK Working note 170.
[6] Z. Drmac: SIGMA - mathematical software library for
accurate SVD, PSV,
QSVD, (H,K)-SVD computations.
Department of Mathematics, University of Zagreb, 2008,
2015.
Bugs, examples and comments:
===========================
Please report all bugs and send interesting test examples
and comments to
drmac@math.hr. Thank you.
subroutine dgesvj (character*1 joba, character*1 jobu, character*1 jobv,integer m, integer n, double precision, dimension( lda, * ) a, integerlda, double precision, dimension( n ) sva, integer mv, doubleprecision, dimension( ldv, * ) v, integer ldv, double precision,dimension( lwork ) work, integer lwork, integer info)
DGESVJ
Purpose:
DGESVJ computes
the singular value decomposition (SVD) of a real
M-by-N matrix A, where M >= N. The SVD of A is written as
[++] [xx] [x0] [xx]
A = U * SIGMA * VΛt, [++] = [xx] * [ox] * [xx]
[++] [xx]
where SIGMA is an N-by-N diagonal matrix, U is an M-by-N
orthonormal
matrix, and V is an N-by-N orthogonal matrix. The diagonal
elements
of SIGMA are the singular values of A. The columns of U and
V are the
left and the right singular vectors of A, respectively.
DGESVJ can sometimes compute tiny singular values and their
singular vectors much
more accurately than other SVD routines, see below under
Further Details.
Parameters
JOBA
JOBA is
CHARACTER*1
Specifies the structure of A.
= βLβ: The input matrix A is lower triangular;
= βUβ: The input matrix A is upper triangular;
= βGβ: The input matrix A is general M-by-N
matrix, M >= N.
JOBU
JOBU is
CHARACTER*1
Specifies whether to compute the left singular vectors
(columns of U):
= βUβ: The left singular vectors corresponding
to the nonzero
singular values are computed and returned in the leading
columns of A. See more details in the description of A.
The default numerical orthogonality threshold is set to
approximately TOL=CTOL*EPS, CTOL=DSQRT(M),
EPS=DLAMCH(βEβ).
= βCβ: Analogous to JOBU=βUβ, except
that user can control the
level of numerical orthogonality of the computed left
singular vectors. TOL can be set to TOL = CTOL*EPS, where
CTOL is given on input in the array WORK.
No CTOL smaller than ONE is allowed. CTOL greater
than 1 / EPS is meaningless. The option βCβ
can be used if M*EPS is satisfactory orthogonality
of the computed left singular vectors, so CTOL=M could
save few sweeps of Jacobi rotations.
See the descriptions of A and WORK(1).
= βNβ: The matrix U is not computed. However,
see the
description of A.
JOBV
JOBV is
CHARACTER*1
Specifies whether to compute the right singular vectors,
that
is, the matrix V:
= βVβ: the matrix V is computed and returned in
the array V
= βAβ: the Jacobi rotations are applied to the
MV-by-N
array V. In other words, the right singular vector
matrix V is not computed explicitly, instead it is
applied to an MV-by-N matrix initially stored in the
first MV rows of V.
= βNβ: the matrix V is not computed and the
array V is not
referenced
M
M is INTEGER
The number of rows of the input matrix A.
1/DLAMCH(βEβ) > M >= 0.
N
N is INTEGER
The number of columns of the input matrix A.
M >= N >= 0.
A
A is DOUBLE
PRECISION array, dimension (LDA,N)
On entry, the M-by-N matrix A.
On exit :
If JOBU = βUβ .OR. JOBU = βCβ :
If INFO = 0 :
RANKA orthonormal columns of U are returned in the
leading RANKA columns of the array A. Here RANKA <= N
is the number of computed singular values of A that are
above the underflow threshold DLAMCH(βSβ). The
singular
vectors corresponding to underflowed or zero singular
values are not computed. The value of RANKA is returned
in the array WORK as RANKA=NINT(WORK(2)). Also see the
descriptions of SVA and WORK. The computed columns of U
are mutually numerically orthogonal up to approximately
TOL=DSQRT(M)*EPS (default); or TOL=CTOL*EPS (JOBU =
βCβ),
see the description of JOBU.
If INFO > 0 :
the procedure DGESVJ did not converge in the given number
of iterations (sweeps). In that case, the computed
columns of U may not be orthogonal up to TOL. The output
U (stored in A), SIGMA (given by the computed singular
values in SVA(1:N)) and V is still a decomposition of the
input matrix A in the sense that the residual
||A-SCALE*U*SIGMA*VΛT||_2 / ||A||_2 is small.
If JOBU =
βNβ :
If INFO = 0 :
Note that the left singular vectors are βfor
freeβ in the
one-sided Jacobi SVD algorithm. However, if only the
singular values are needed, the level of numerical
orthogonality of U is not an issue and iterations are
stopped when the columns of the iterated matrix are
numerically orthogonal up to approximately M*EPS. Thus,
on exit, A contains the columns of U scaled with the
corresponding singular values.
If INFO > 0 :
the procedure DGESVJ did not converge in the given number
of iterations (sweeps).
LDA
LDA is INTEGER
The leading dimension of the array A. LDA >=
max(1,M).
SVA
SVA is DOUBLE
PRECISION array, dimension (N)
On exit :
If INFO = 0 :
depending on the value SCALE = WORK(1), we have:
If SCALE = ONE :
SVA(1:N) contains the computed singular values of A.
During the computation SVA contains the Euclidean column
norms of the iterated matrices in the array A.
If SCALE .NE. ONE :
The singular values of A are SCALE*SVA(1:N), and this
factored representation is due to the fact that some of the
singular values of A might underflow or overflow.
If INFO > 0 :
the procedure DGESVJ did not converge in the given number of
iterations (sweeps) and SCALE*SVA(1:N) may not be
accurate.
MV
MV is INTEGER
If JOBV = βAβ, then the product of Jacobi
rotations in DGESVJ
is applied to the first MV rows of V. See the description of
JOBV.
V
V is DOUBLE
PRECISION array, dimension (LDV,N)
If JOBV = βVβ, then V contains on exit the
N-by-N matrix of
the right singular vectors;
If JOBV = βAβ, then V contains the product of
the computed right
singular vector matrix and the initial matrix in
the array V.
If JOBV = βNβ, then V is not referenced.
LDV
LDV is INTEGER
The leading dimension of the array V, LDV >= 1.
If JOBV = βVβ, then LDV >= max(1,N).
If JOBV = βAβ, then LDV >= max(1,MV) .
WORK
WORK is DOUBLE
PRECISION array, dimension (MAX(1,LWORK))
On entry :
If JOBU = βCβ :
WORK(1) = CTOL, where CTOL defines the threshold for
convergence.
The process stops if all columns of A are mutually
orthogonal up to CTOL*EPS, EPS=DLAMCH(βEβ).
It is required that CTOL >= ONE, i.e. it is not
allowed to force the routine to obtain orthogonality
below EPS.
On exit :
WORK(1) = SCALE is the scaling factor such that
SCALE*SVA(1:N)
are the computed singular values of A.
(See description of SVA().)
WORK(2) = NINT(WORK(2)) is the number of the computed
nonzero
singular values.
WORK(3) = NINT(WORK(3)) is the number of the computed
singular
values that are larger than the underflow threshold.
WORK(4) = NINT(WORK(4)) is the number of sweeps of Jacobi
rotations needed for numerical convergence.
WORK(5) = max_{i.NE.j} |COS(A(:,i),A(:,j))| in the last
sweep.
This is useful information in cases when DGESVJ did
not converge, as it can be used to estimate whether
the output is still useful and for post festum analysis.
WORK(6) = the largest absolute value over all sines of the
Jacobi rotation angles in the last sweep. It can be
useful for a post festum analysis.
LWORK
LWORK is
INTEGER
The length of the array WORK.
LWORK >= 1, if MIN(M,N) = 0, and LWORK >= MAX(6,M+N),
otherwise.
If on entry
LWORK = -1, then a workspace query is assumed and
no computation is done; WORK(1) is set to the minial (and
optimal)
length of WORK.
INFO
INFO is INTEGER
= 0: successful exit.
< 0: if INFO = -i, then the i-th argument had an illegal
value
> 0: DGESVJ did not converge in the maximal allowed
number (30)
of sweeps. The output may still be useful. See the
description of WORK.
Author
Univ. of Tennessee
Univ. of California Berkeley
Univ. of Colorado Denver
NAG Ltd.
Further Details:
The orthogonal
N-by-N matrix V is obtained as a product of Jacobi plane
rotations. The rotations are implemented as fast scaled
rotations of
Anda and Park [1]. In the case of underflow of the Jacobi
angle, a
modified Jacobi transformation of Drmac [4] is used. Pivot
strategy uses
column interchanges of de Rijk [2]. The relative accuracy of
the computed
singular values and the accuracy of the computed singular
vectors (in
angle metric) is as guaranteed by the theory of Demmel and
Veselic [3].
The condition number that determines the accuracy in the
full rank case
is essentially min_{D=diag} kappa(A*D), where kappa(.) is
the
spectral condition number. The best performance of this
Jacobi SVD
procedure is achieved if used in an accelerated version of
Drmac and
Veselic [5,6], and it is the kernel routine in the SIGMA
library [7].
Some tuning parameters (marked with [TP]) are available for
the
implementer.
The computational range for the nonzero singular values is
the machine
number interval ( UNDERFLOW , OVERFLOW ). In extreme cases,
even
denormalized singular values can be computed with the
corresponding
gradual loss of accurate digits.
Contributors:
============
Zlatko Drmac (Zagreb, Croatia) and Kresimir Veselic (Hagen, Germany)
References:
[1] A. A. Anda
and H. Park: Fast plane rotations with dynamic scaling.
SIAM J. matrix Anal. Appl., Vol. 15 (1994), pp. 162-174.
[2] P. P. M. De Rijk: A one-sided Jacobi algorithm for
computing the
singular value decomposition on a vector computer.
SIAM J. Sci. Stat. Comp., Vol. 10 (1998), pp. 359-371.
[3] J. Demmel and K. Veselic: Jacobi method is more accurate
than QR.
[4] Z. Drmac: Implementation of Jacobi rotations for
accurate singular
value computation in floating point arithmetic.
SIAM J. Sci. Comp., Vol. 18 (1997), pp. 1200-1222.
[5] Z. Drmac and K. Veselic: New fast and accurate Jacobi
SVD algorithm I.
SIAM J. Matrix Anal. Appl. Vol. 35, No. 2 (2008), pp.
1322-1342.
LAPACK Working note 169.
[6] Z. Drmac and K. Veselic: New fast and accurate Jacobi
SVD algorithm II.
SIAM J. Matrix Anal. Appl. Vol. 35, No. 2 (2008), pp.
1343-1362.
LAPACK Working note 170.
[7] Z. Drmac: SIGMA - mathematical software library for
accurate SVD, PSV,
QSVD, (H,K)-SVD computations.
Department of Mathematics, University of Zagreb, 2008.
Bugs, examples and comments:
===========================
Please report all bugs and send interesting test examples
and comments to
drmac@math.hr. Thank you.
subroutine sgesvj (character*1 joba, character*1 jobu, character*1 jobv,integer m, integer n, real, dimension( lda, * ) a, integer lda, real,dimension( n ) sva, integer mv, real, dimension( ldv, * ) v, integerldv, real, dimension( lwork ) work, integer lwork, integer info)
SGESVJ
Purpose:
SGESVJ computes
the singular value decomposition (SVD) of a real
M-by-N matrix A, where M >= N. The SVD of A is written as
[++] [xx] [x0] [xx]
A = U * SIGMA * VΛt, [++] = [xx] * [ox] * [xx]
[++] [xx]
where SIGMA is an N-by-N diagonal matrix, U is an M-by-N
orthonormal
matrix, and V is an N-by-N orthogonal matrix. The diagonal
elements
of SIGMA are the singular values of A. The columns of U and
V are the
left and the right singular vectors of A, respectively.
SGESVJ can sometimes compute tiny singular values and their
singular vectors much
more accurately than other SVD routines, see below under
Further Details.
Parameters
JOBA
JOBA is
CHARACTER*1
Specifies the structure of A.
= βLβ: The input matrix A is lower triangular;
= βUβ: The input matrix A is upper triangular;
= βGβ: The input matrix A is general M-by-N
matrix, M >= N.
JOBU
JOBU is
CHARACTER*1
Specifies whether to compute the left singular vectors
(columns of U):
= βUβ: The left singular vectors corresponding
to the nonzero
singular values are computed and returned in the leading
columns of A. See more details in the description of A.
The default numerical orthogonality threshold is set to
approximately TOL=CTOL*EPS, CTOL=SQRT(M),
EPS=SLAMCH(βEβ).
= βCβ: Analogous to JOBU=βUβ, except
that user can control the
level of numerical orthogonality of the computed left
singular vectors. TOL can be set to TOL = CTOL*EPS, where
CTOL is given on input in the array WORK.
No CTOL smaller than ONE is allowed. CTOL greater
than 1 / EPS is meaningless. The option βCβ
can be used if M*EPS is satisfactory orthogonality
of the computed left singular vectors, so CTOL=M could
save few sweeps of Jacobi rotations.
See the descriptions of A and WORK(1).
= βNβ: The matrix U is not computed. However,
see the
description of A.
JOBV
JOBV is
CHARACTER*1
Specifies whether to compute the right singular vectors,
that
is, the matrix V:
= βVβ: the matrix V is computed and returned in
the array V
= βAβ: the Jacobi rotations are applied to the
MV-by-N
array V. In other words, the right singular vector
matrix V is not computed explicitly; instead it is
applied to an MV-by-N matrix initially stored in the
first MV rows of V.
= βNβ: the matrix V is not computed and the
array V is not
referenced
M
M is INTEGER
The number of rows of the input matrix A.
1/SLAMCH(βEβ) > M >= 0.
N
N is INTEGER
The number of columns of the input matrix A.
M >= N >= 0.
A
A is REAL
array, dimension (LDA,N)
On entry, the M-by-N matrix A.
On exit,
If JOBU = βUβ .OR. JOBU = βCβ:
If INFO = 0:
RANKA orthonormal columns of U are returned in the
leading RANKA columns of the array A. Here RANKA <= N
is the number of computed singular values of A that are
above the underflow threshold SLAMCH(βSβ). The
singular
vectors corresponding to underflowed or zero singular
values are not computed. The value of RANKA is returned
in the array WORK as RANKA=NINT(WORK(2)). Also see the
descriptions of SVA and WORK. The computed columns of U
are mutually numerically orthogonal up to approximately
TOL=SQRT(M)*EPS (default); or TOL=CTOL*EPS (JOBU =
βCβ),
see the description of JOBU.
If INFO > 0,
the procedure SGESVJ did not converge in the given number
of iterations (sweeps). In that case, the computed
columns of U may not be orthogonal up to TOL. The output
U (stored in A), SIGMA (given by the computed singular
values in SVA(1:N)) and V is still a decomposition of the
input matrix A in the sense that the residual
||A-SCALE*U*SIGMA*VΛT||_2 / ||A||_2 is small.
If JOBU = βNβ:
If INFO = 0:
Note that the left singular vectors are βfor
freeβ in the
one-sided Jacobi SVD algorithm. However, if only the
singular values are needed, the level of numerical
orthogonality of U is not an issue and iterations are
stopped when the columns of the iterated matrix are
numerically orthogonal up to approximately M*EPS. Thus,
on exit, A contains the columns of U scaled with the
corresponding singular values.
If INFO > 0:
the procedure SGESVJ did not converge in the given number
of iterations (sweeps).
LDA
LDA is INTEGER
The leading dimension of the array A. LDA >=
max(1,M).
SVA
SVA is REAL
array, dimension (N)
On exit,
If INFO = 0 :
depending on the value SCALE = WORK(1), we have:
If SCALE = ONE:
SVA(1:N) contains the computed singular values of A.
During the computation SVA contains the Euclidean column
norms of the iterated matrices in the array A.
If SCALE .NE. ONE:
The singular values of A are SCALE*SVA(1:N), and this
factored representation is due to the fact that some of the
singular values of A might underflow or overflow.
If INFO > 0
:
the procedure SGESVJ did not converge in the given number of
iterations (sweeps) and SCALE*SVA(1:N) may not be
accurate.
MV
MV is INTEGER
If JOBV = βAβ, then the product of Jacobi
rotations in SGESVJ
is applied to the first MV rows of V. See the description of
JOBV.
V
V is REAL
array, dimension (LDV,N)
If JOBV = βVβ, then V contains on exit the
N-by-N matrix of
the right singular vectors;
If JOBV = βAβ, then V contains the product of
the computed right
singular vector matrix and the initial matrix in
the array V.
If JOBV = βNβ, then V is not referenced.
LDV
LDV is INTEGER
The leading dimension of the array V, LDV >= 1.
If JOBV = βVβ, then LDV >= max(1,N).
If JOBV = βAβ, then LDV >= max(1,MV) .
WORK
WORK is REAL
array, dimension (MAX(1,LWORK))
On entry,
If JOBU = βCβ :
WORK(1) = CTOL, where CTOL defines the threshold for
convergence.
The process stops if all columns of A are mutually
orthogonal up to CTOL*EPS, EPS=SLAMCH(βEβ).
It is required that CTOL >= ONE, i.e. it is not
allowed to force the routine to obtain orthogonality
below EPSILON.
On exit,
WORK(1) = SCALE is the scaling factor such that
SCALE*SVA(1:N)
are the computed singular vcalues of A.
(See description of SVA().)
WORK(2) = NINT(WORK(2)) is the number of the computed
nonzero
singular values.
WORK(3) = NINT(WORK(3)) is the number of the computed
singular
values that are larger than the underflow threshold.
WORK(4) = NINT(WORK(4)) is the number of sweeps of Jacobi
rotations needed for numerical convergence.
WORK(5) = max_{i.NE.j} |COS(A(:,i),A(:,j))| in the last
sweep.
This is useful information in cases when SGESVJ did
not converge, as it can be used to estimate whether
the output is still useful and for post festum analysis.
WORK(6) = the largest absolute value over all sines of the
Jacobi rotation angles in the last sweep. It can be
useful for a post festum analysis.
LWORK
LWORK is
INTEGER
Length of WORK.
LWORK >= 1, if MIN(M,N) = 0, and LWORK >= MAX(6,M+N),
otherwise.
If on entry
LWORK = -1, then a workspace query is assumed and
no computation is done; WORK(1) is set to the minial (and
optimal)
length of WORK.
INFO
INFO is INTEGER
= 0: successful exit.
< 0: if INFO = -i, then the i-th argument had an illegal
value
> 0: SGESVJ did not converge in the maximal allowed
number (30)
of sweeps. The output may still be useful. See the
description of WORK.
Author
Univ. of Tennessee
Univ. of California Berkeley
Univ. of Colorado Denver
NAG Ltd.
Further Details:
The orthogonal N-by-N matrix V
is obtained as a product of Jacobi plane rotations. The
rotations are implemented as fast scaled rotations of Anda
and Park [1]. In the case of underflow of the Jacobi angle,
a modified Jacobi transformation of Drmac [4] is used. Pivot
strategy uses column interchanges of de Rijk [2]. The
relative accuracy of the computed singular values and the
accuracy of the computed singular vectors (in angle metric)
is as guaranteed by the theory of Demmel and Veselic [3].
The condition number that determines the accuracy in the
full rank case is essentially min_{D=diag} kappa(A*D), where
kappa(.) is the spectral condition number. The best
performance of this Jacobi SVD procedure is achieved if used
in an accelerated version of Drmac and Veselic [5,6], and it
is the kernel routine in the SIGMA library [7]. Some tuning
parameters (marked with [TP]) are available for the
implementer.
The computational range for the nonzero singular values is
the machine number interval ( UNDERFLOW , OVERFLOW ). In
extreme cases, even denormalized singular values can be
computed with the corresponding gradual loss of accurate
digits.
Contributors:
Zlatko Drmac (Zagreb, Croatia) and Kresimir Veselic (Hagen, Germany)
References:
[1] A. A. Anda and H. Park:
Fast plane rotations with dynamic scaling.
SIAM J. matrix Anal. Appl., Vol. 15 (1994), pp. 162-174.
[2] P. P. M. De
Rijk: A one-sided Jacobi algorithm for computing the
singular value decomposition on a vector computer.
SIAM J. Sci. Stat. Comp., Vol. 10 (1998), pp. 359-371.
[3] J. Demmel
and K. Veselic: Jacobi method is more accurate than QR.
[4] Z. Drmac: Implementation of Jacobi rotations for
accurate singular value computation in floating point
arithmetic.
SIAM J. Sci. Comp., Vol. 18 (1997), pp. 1200-1222.
[5] Z. Drmac
and K. Veselic: New fast and accurate Jacobi SVD algorithm
I.
SIAM J. Matrix Anal. Appl. Vol. 35, No. 2 (2008), pp.
1322-1342.
LAPACK Working note 169.
[6] Z. Drmac
and K. Veselic: New fast and accurate Jacobi SVD algorithm
II.
SIAM J. Matrix Anal. Appl. Vol. 35, No. 2 (2008), pp.
1343-1362.
LAPACK Working note 170.
[7] Z. Drmac:
SIGMA - mathematical software library for accurate SVD, PSV,
QSVD, (H,K)-SVD computations.
Department of Mathematics, University of Zagreb, 2008.
Bugs, Examples and Comments:
Please report all bugs and send interesting test examples and comments to drmac@math.hr. Thank you.
subroutine zgesvj (character*1 joba, character*1 jobu, character*1 jobv,integer m, integer n, complex*16, dimension( lda, * ) a, integer lda,double precision, dimension( n ) sva, integer mv, complex*16,dimension( ldv, * ) v, integer ldv, complex*16, dimension( lwork )cwork, integer lwork, double precision, dimension( lrwork ) rwork,integer lrwork, integer info)
ZGESVJ
Purpose:
ZGESVJ computes
the singular value decomposition (SVD) of a complex
M-by-N matrix A, where M >= N. The SVD of A is written as
[++] [xx] [x0] [xx]
A = U * SIGMA * VΛ*, [++] = [xx] * [ox] * [xx]
[++] [xx]
where SIGMA is an N-by-N diagonal matrix, U is an M-by-N
orthonormal
matrix, and V is an N-by-N unitary matrix. The diagonal
elements
of SIGMA are the singular values of A. The columns of U and
V are the
left and the right singular vectors of A, respectively.
Parameters
JOBA
JOBA is
CHARACTER*1
Specifies the structure of A.
= βLβ: The input matrix A is lower triangular;
= βUβ: The input matrix A is upper triangular;
= βGβ: The input matrix A is general M-by-N
matrix, M >= N.
JOBU
JOBU is
CHARACTER*1
Specifies whether to compute the left singular vectors
(columns of U):
= βUβ or βFβ: The left singular
vectors corresponding to the nonzero
singular values are computed and returned in the leading
columns of A. See more details in the description of A.
The default numerical orthogonality threshold is set to
approximately TOL=CTOL*EPS, CTOL=SQRT(M),
EPS=DLAMCH(βEβ).
= βCβ: Analogous to JOBU=βUβ, except
that user can control the
level of numerical orthogonality of the computed left
singular vectors. TOL can be set to TOL = CTOL*EPS, where
CTOL is given on input in the array WORK.
No CTOL smaller than ONE is allowed. CTOL greater
than 1 / EPS is meaningless. The option βCβ
can be used if M*EPS is satisfactory orthogonality
of the computed left singular vectors, so CTOL=M could
save few sweeps of Jacobi rotations.
See the descriptions of A and WORK(1).
= βNβ: The matrix U is not computed. However,
see the
description of A.
JOBV
JOBV is
CHARACTER*1
Specifies whether to compute the right singular vectors,
that
is, the matrix V:
= βVβ or βJβ: the matrix V is
computed and returned in the array V
= βAβ: the Jacobi rotations are applied to the
MV-by-N
array V. In other words, the right singular vector
matrix V is not computed explicitly; instead it is
applied to an MV-by-N matrix initially stored in the
first MV rows of V.
= βNβ: the matrix V is not computed and the
array V is not
referenced
M
M is INTEGER
The number of rows of the input matrix A.
1/DLAMCH(βEβ) > M >= 0.
N
N is INTEGER
The number of columns of the input matrix A.
M >= N >= 0.
A
A is COMPLEX*16
array, dimension (LDA,N)
On entry, the M-by-N matrix A.
On exit,
If JOBU = βUβ .OR. JOBU = βCβ:
If INFO = 0 :
RANKA orthonormal columns of U are returned in the
leading RANKA columns of the array A. Here RANKA <= N
is the number of computed singular values of A that are
above the underflow threshold DLAMCH(βSβ). The
singular
vectors corresponding to underflowed or zero singular
values are not computed. The value of RANKA is returned
in the array RWORK as RANKA=NINT(RWORK(2)). Also see the
descriptions of SVA and RWORK. The computed columns of U
are mutually numerically orthogonal up to approximately
TOL=SQRT(M)*EPS (default); or TOL=CTOL*EPS (JOBU =
βCβ),
see the description of JOBU.
If INFO > 0,
the procedure ZGESVJ did not converge in the given number
of iterations (sweeps). In that case, the computed
columns of U may not be orthogonal up to TOL. The output
U (stored in A), SIGMA (given by the computed singular
values in SVA(1:N)) and V is still a decomposition of the
input matrix A in the sense that the residual
|| A - SCALE * U * SIGMA * VΛ* ||_2 / ||A||_2 is small.
If JOBU = βNβ:
If INFO = 0 :
Note that the left singular vectors are βfor
freeβ in the
one-sided Jacobi SVD algorithm. However, if only the
singular values are needed, the level of numerical
orthogonality of U is not an issue and iterations are
stopped when the columns of the iterated matrix are
numerically orthogonal up to approximately M*EPS. Thus,
on exit, A contains the columns of U scaled with the
corresponding singular values.
If INFO > 0:
the procedure ZGESVJ did not converge in the given number
of iterations (sweeps).
LDA
LDA is INTEGER
The leading dimension of the array A. LDA >=
max(1,M).
SVA
SVA is DOUBLE
PRECISION array, dimension (N)
On exit,
If INFO = 0 :
depending on the value SCALE = RWORK(1), we have:
If SCALE = ONE:
SVA(1:N) contains the computed singular values of A.
During the computation SVA contains the Euclidean column
norms of the iterated matrices in the array A.
If SCALE .NE. ONE:
The singular values of A are SCALE*SVA(1:N), and this
factored representation is due to the fact that some of the
singular values of A might underflow or overflow.
If INFO > 0:
the procedure ZGESVJ did not converge in the given number of
iterations (sweeps) and SCALE*SVA(1:N) may not be
accurate.
MV
MV is INTEGER
If JOBV = βAβ, then the product of Jacobi
rotations in ZGESVJ
is applied to the first MV rows of V. See the description of
JOBV.
V
V is COMPLEX*16
array, dimension (LDV,N)
If JOBV = βVβ, then V contains on exit the
N-by-N matrix of
the right singular vectors;
If JOBV = βAβ, then V contains the product of
the computed right
singular vector matrix and the initial matrix in
the array V.
If JOBV = βNβ, then V is not referenced.
LDV
LDV is INTEGER
The leading dimension of the array V, LDV >= 1.
If JOBV = βVβ, then LDV >= MAX(1,N).
If JOBV = βAβ, then LDV >= MAX(1,MV) .
CWORK
CWORK is
COMPLEX*16 array, dimension (MAX(1,LWORK))
Used as workspace.
LWORK
LWORK is
INTEGER.
Length of CWORK.
LWORK >= 1, if MIN(M,N) = 0, and LWORK >= M+N,
otherwise.
If on entry
LWORK = -1, then a workspace query is assumed and
no computation is done; CWORK(1) is set to the minial (and
optimal)
length of CWORK.
RWORK
RWORK is DOUBLE
PRECISION array, dimension (max(6,LRWORK))
On entry,
If JOBU = βCβ :
RWORK(1) = CTOL, where CTOL defines the threshold for
convergence.
The process stops if all columns of A are mutually
orthogonal up to CTOL*EPS, EPS=DLAMCH(βEβ).
It is required that CTOL >= ONE, i.e. it is not
allowed to force the routine to obtain orthogonality
below EPSILON.
On exit,
RWORK(1) = SCALE is the scaling factor such that
SCALE*SVA(1:N)
are the computed singular values of A.
(See description of SVA().)
RWORK(2) = NINT(RWORK(2)) is the number of the computed
nonzero
singular values.
RWORK(3) = NINT(RWORK(3)) is the number of the computed
singular
values that are larger than the underflow threshold.
RWORK(4) = NINT(RWORK(4)) is the number of sweeps of Jacobi
rotations needed for numerical convergence.
RWORK(5) = max_{i.NE.j} |COS(A(:,i),A(:,j))| in the last
sweep.
This is useful information in cases when ZGESVJ did
not converge, as it can be used to estimate whether
the output is still useful and for post festum analysis.
RWORK(6) = the largest absolute value over all sines of the
Jacobi rotation angles in the last sweep. It can be
useful for a post festum analysis.
LRWORK
LRWORK is
INTEGER
Length of RWORK.
LRWORK >= 1, if MIN(M,N) = 0, and LRWORK >= MAX(6,N),
otherwise.
If on entry
LRWORK = -1, then a workspace query is assumed and
no computation is done; RWORK(1) is set to the minial (and
optimal)
length of RWORK.
INFO
INFO is INTEGER
= 0: successful exit.
< 0: if INFO = -i, then the i-th argument had an illegal
value
> 0: ZGESVJ did not converge in the maximal allowed
number
(NSWEEP=30) of sweeps. The output may still be useful.
See the description of RWORK.
Author
Univ. of Tennessee
Univ. of California Berkeley
Univ. of Colorado Denver
NAG Ltd.
Further Details:
The orthogonal
N-by-N matrix V is obtained as a product of Jacobi plane
rotations. In the case of underflow of the tangent of the
Jacobi angle, a
modified Jacobi transformation of Drmac [3] is used. Pivot
strategy uses
column interchanges of de Rijk [1]. The relative accuracy of
the computed
singular values and the accuracy of the computed singular
vectors (in
angle metric) is as guaranteed by the theory of Demmel and
Veselic [2].
The condition number that determines the accuracy in the
full rank case
is essentially min_{D=diag} kappa(A*D), where kappa(.) is
the
spectral condition number. The best performance of this
Jacobi SVD
procedure is achieved if used in an accelerated version of
Drmac and
Veselic [4,5], and it is the kernel routine in the SIGMA
library [6].
Some tuning parameters (marked with [TP]) are available for
the
implementer.
The computational range for the nonzero singular values is
the machine
number interval ( UNDERFLOW , OVERFLOW ). In extreme cases,
even
denormalized singular values can be computed with the
corresponding
gradual loss of accurate digits.
Contributor:
============
Zlatko Drmac (Zagreb, Croatia)
References:
[1] P. P. M. De
Rijk: A one-sided Jacobi algorithm for computing the
singular value decomposition on a vector computer.
SIAM J. Sci. Stat. Comp., Vol. 10 (1998), pp. 359-371.
[2] J. Demmel and K. Veselic: Jacobi method is more accurate
than QR.
[3] Z. Drmac: Implementation of Jacobi rotations for
accurate singular
value computation in floating point arithmetic.
SIAM J. Sci. Comp., Vol. 18 (1997), pp. 1200-1222.
[4] Z. Drmac and K. Veselic: New fast and accurate Jacobi
SVD algorithm I.
SIAM J. Matrix Anal. Appl. Vol. 35, No. 2 (2008), pp.
1322-1342.
LAPACK Working note 169.
[5] Z. Drmac and K. Veselic: New fast and accurate Jacobi
SVD algorithm II.
SIAM J. Matrix Anal. Appl. Vol. 35, No. 2 (2008), pp.
1343-1362.
LAPACK Working note 170.
[6] Z. Drmac: SIGMA - mathematical software library for
accurate SVD, PSV,
QSVD, (H,K)-SVD computations.
Department of Mathematics, University of Zagreb, 2008,
2015.
Bugs, examples and comments:
===========================
Please report all bugs and send interesting test examples
and comments to
drmac@math.hr. Thank you.
Author
Generated automatically by Doxygen for LAPACK from the source code.