但在linux用fortran lapack得到的结果如下:
主函数:
* DGESVD Example Program Text
* NAG Copyright 2005.
* .. Parameters ..
INTEGER NIN, NOUT
PARAMETER (NIN=5,NOUT=6)
INTEGER MMAX, NB, NMAX, IERR
PARAMETER (MMAX=10,NB=64,NMAX=8)
INTEGER LDA, LDVT, LWORK
PARAMETER (LDA=MMAX,LDVT=NMAX,
+ LWORK=MMAX+4*NMAX+NB*(MMAX+NMAX))
* .. Local Scalars ..
DOUBLE PRECISION EPS, SERRBD
INTEGER I, IFAIL, INFO, J, LWKOPT, M, N
* .. Local Arrays ..
DOUBLE PRECISION A(LDA,NMAX), DUMMY(1,1), RCONDU(NMAX),
+ RCONDV(NMAX), S(NMAX), UERRBD(NMAX),
+ VERRBD(NMAX), VT(LDVT,NMAX), WORK(LWORK)
* .. External Functions ..
DOUBLE PRECISION DLAMCH
EXTERNAL DLAMCH
* .. External Subroutines ..
EXTERNAL DDISNA, DGESVD, X04CAF
* .. Executable Statements ..
OPEN(NIN,FILE='dgesvd-ex.d',STATUS='OLD',IOSTAT=IERR)
OPEN(NOUT,FILE='dgesvd-ex.r',STATUS='REPLACE',IOSTAT=IERR)
WRITE (NOUT,*) 'DGESVD Example Program Results'
WRITE (NOUT,*)
* Skip heading in data file
READ (NIN,*)
READ (NIN,*) M, N
IF (M.LE.MMAX .AND. N.LE.NMAX) THEN
*
* Read the m by n matrix A from data file
*
READ (NIN,*) ((A(I,J),J=1,N),I=1,M)
*
* Compute the singular values and left and right singular vectors
* of A (A = U*S*(V**T), m.ge.n)
*
CALL DGESVD('Overwrite A by U','Singular vectors (V)',M,N,A,
+ LDA,S,DUMMY,1,VT,LDVT,WORK,LWORK,INFO)
LWKOPT = WORK(1)
*
IF (INFO.EQ.0) THEN
*
* Print solution
*
WRITE (NOUT,*) 'Singular values'
WRITE (NOUT,99999) (S(J),J=1,N)
*
IFAIL = 0
CALL X04CAF('General',' ',M,N,A,LDA,
+ 'Left singular vectors (first n columns of U)',
+ IFAIL)
WRITE (NOUT,*)
CALL X04CAF('General',' ',N,N,VT,LDVT,
+ 'Right singular vectors by row (V**T)',IFAIL)
*
* Get the machine precision, EPS and compute the approximate
* error bound for the computed singular values. Note that for
* the 2-norm, S(1) = norm(A)
*
EPS = DLAMCH('Eps')
SERRBD = EPS*S(1)
*
* Call DDISNA (F08FLF) to estimate reciprocal condition
* numbers for the singular vectors
*
CALL DDISNA('Left',M,N,S,RCONDU,INFO)
CALL DDISNA('Right',M,N,S,RCONDV,INFO)
*
* Compute the error estimates for the singular vectors
*
DO 20 I = 1, N
UERRBD(I) = SERRBD/RCONDU(I)
VERRBD(I) = SERRBD/RCONDV(I)
20 CONTINUE
*
* Print the approximate error bounds for the singular values
* and vectors
*
WRITE (NOUT,*)
WRITE (NOUT,*) 'Error estimate for the singular values'
WRITE (NOUT,99998) SERRBD
WRITE (NOUT,*)
WRITE (NOUT,*)
+ 'Error estimates for the left singular vectors'
WRITE (NOUT,99998) (UERRBD(I),I=1,N)
WRITE (NOUT,*)
WRITE (NOUT,*)
+ 'Error estimates for the right singular vectors'
WRITE (NOUT,99998) (VERRBD(I),I=1,N)
ELSE
WRITE (NOUT,99997) 'Failure in DGESVD. INFO =', INFO
END IF
*
* Print workspace information
*
IF (LWORK.LT.LWKOPT) THEN
WRITE (NOUT,*)
WRITE (NOUT,99996) 'Optimum workspace required = ', LWKOPT,
+ 'Workspace provided = ', LWORK
END IF
ELSE
WRITE (NOUT,*) 'MMAX and/or NMAX too small'
END IF
STOP
*
99999 FORMAT (3X,(8F8.4))
99998 FORMAT (4X,1P,6E11.1)
99997 FORMAT (1X,A,I4)
99996 FORMAT (1X,A,I5,/1X,A,I5)
END
输入文件dgesvd-ex.d为:
DGESVD Example Program Data
6 4 :Values of M and N
2.27 -1.54 1.15 -1.94
0.28 -1.67 0.94 -0.78
-0.48 -3.09 0.99 -0.21
1.07 1.22 0.79 0.63
-2.35 2.93 -1.45 2.30
0.62 -7.39 1.03 -2.57 :End of matrix A
输出结果文件dgesvd-ex.r为:
DGESVD Example Program Results