2
SUBROUTINE SSVDC (X, LDX, N, P, S, E, U, LDU, V, LDV, WORK, JOB,
4
C***BEGIN PROLOGUE SSVDC
5
C***PURPOSE Perform the singular value decomposition of a rectangular
7
C***LIBRARY SLATEC (LINPACK)
9
C***TYPE SINGLE PRECISION (SSVDC-S, DSVDC-D, CSVDC-C)
10
C***KEYWORDS LINEAR ALGEBRA, LINPACK, MATRIX,
11
C SINGULAR VALUE DECOMPOSITION
12
C***AUTHOR Stewart, G. W., (U. of Maryland)
15
C SSVDC is a subroutine to reduce a real NxP matrix X by orthogonal
16
C transformations U and V to diagonal form. The elements S(I) are
17
C the singular values of X. The columns of U are the corresponding
18
C left singular vectors, and the columns of V the right singular
23
C X REAL(LDX,P), where LDX .GE. N.
24
C X contains the matrix whose singular value
25
C decomposition is to be computed. X is
29
C LDX is the leading dimension of the array X.
32
C N is the number of rows of the matrix X.
35
C P is the number of columns of the matrix X.
38
C LDU is the leading dimension of the array U.
42
C LDV is the leading dimension of the array V.
46
C work is a scratch array.
49
C JOB controls the computation of the singular
50
C vectors. It has the decimal expansion AB
51
C with the following meaning
53
C A .EQ. 0 Do not compute the left singular
55
C A .EQ. 1 Return the N left singular vectors
57
C A .GE. 2 Return the first MIN(N,P) singular
59
C B .EQ. 0 Do not compute the right singular
61
C B .EQ. 1 Return the right singular vectors
66
C S REAL(MM), where MM=MIN(N+1,P).
67
C The first MIN(N,P) entries of S contain the
68
C singular values of X arranged in descending
72
C E ordinarily contains zeros. However, see the
73
C discussion of INFO for exceptions.
75
C U REAL(LDU,K), where LDU .GE. N. If JOBA .EQ. 1, then
76
C K .EQ. N. If JOBA .GE. 2 , then
78
C U contains the matrix of right singular vectors.
79
C U is not referenced if JOBA .EQ. 0. If N .LE. P
80
C or if JOBA .EQ. 2, then U may be identified with X
81
C in the subroutine call.
83
C V REAL(LDV,P), where LDV .GE. P.
84
C V contains the matrix of right singular vectors.
85
C V is not referenced if JOB .EQ. 0. If P .LE. N,
86
C then V may be identified with X in the
90
C the singular values (and their corresponding
91
C singular vectors) S(INFO+1),S(INFO+2),...,S(M)
92
C are correct (here M=MIN(N,P)). Thus if
93
C INFO .EQ. 0, all the singular values and their
94
C vectors are correct. In any event, the matrix
95
C B = TRANS(U)*X*V is the bidiagonal matrix
96
C with the elements of S on its diagonal and the
97
C elements of E on its super-diagonal (TRANS(U)
98
C is the transpose of U). Thus the singular
99
C values of X and B are the same.
101
C***REFERENCES J. J. Dongarra, J. R. Bunch, C. B. Moler, and G. W.
102
C Stewart, LINPACK Users' Guide, SIAM, 1979.
103
C***ROUTINES CALLED SAXPY, SDOT, SNRM2, SROT, SROTG, SSCAL, SSWAP
104
C***REVISION HISTORY (YYMMDD)
105
C 790319 DATE WRITTEN
106
C 890531 Changed all specific intrinsics to generic. (WRB)
107
C 890531 REVISION DATE from Version 3.2
108
C 891214 Prologue converted to Version 4.0 format. (BAB)
109
C 900326 Removed duplicate information from DESCRIPTION section.
111
C 920501 Reformatted the REFERENCES section. (WRB)
112
C***END PROLOGUE SSVDC
113
INTEGER LDX,N,P,LDU,LDV,JOB,INFO
114
REAL X(LDX,*),S(*),E(*),U(LDU,*),V(LDV,*),WORK(*)
117
INTEGER I,ITER,J,JOBU,K,KASE,KK,L,LL,LLS,LM1,LP1,LS,LU,M,MAXIT,
118
1 MM,MM1,MP1,NCT,NCTP1,NCU,NRT,NRTP1
120
REAL B,C,CS,EL,EMM1,F,G,SNRM2,SCALE,SHIFT,SL,SM,SN,SMM1,T1,TEST,
123
C***FIRST EXECUTABLE STATEMENT SSVDC
125
C SET THE MAXIMUM NUMBER OF ITERATIONS.
129
C DETERMINE WHAT IS TO BE COMPUTED.
133
JOBU = MOD(JOB,100)/10
135
IF (JOBU .GT. 1) NCU = MIN(N,P)
136
IF (JOBU .NE. 0) WANTU = .TRUE.
137
IF (MOD(JOB,10) .NE. 0) WANTV = .TRUE.
139
C REDUCE X TO BIDIAGONAL FORM, STORING THE DIAGONAL ELEMENTS
140
C IN S AND THE SUPER-DIAGONAL ELEMENTS IN E.
144
NRT = MAX(0,MIN(P-2,N))
146
IF (LU .LT. 1) GO TO 170
149
IF (L .GT. NCT) GO TO 20
151
C COMPUTE THE TRANSFORMATION FOR THE L-TH COLUMN AND
152
C PLACE THE L-TH DIAGONAL IN S(L).
154
S(L) = SNRM2(N-L+1,X(L,L),1)
155
IF (S(L) .EQ. 0.0E0) GO TO 10
156
IF (X(L,L) .NE. 0.0E0) S(L) = SIGN(S(L),X(L,L))
157
CALL SSCAL(N-L+1,1.0E0/S(L),X(L,L),1)
158
X(L,L) = 1.0E0 + X(L,L)
162
IF (P .LT. LP1) GO TO 50
164
IF (L .GT. NCT) GO TO 30
165
IF (S(L) .EQ. 0.0E0) GO TO 30
167
C APPLY THE TRANSFORMATION.
169
T = -SDOT(N-L+1,X(L,L),1,X(L,J),1)/X(L,L)
170
CALL SAXPY(N-L+1,T,X(L,L),1,X(L,J),1)
173
C PLACE THE L-TH ROW OF X INTO E FOR THE
174
C SUBSEQUENT CALCULATION OF THE ROW TRANSFORMATION.
179
IF (.NOT.WANTU .OR. L .GT. NCT) GO TO 70
181
C PLACE THE TRANSFORMATION IN U FOR SUBSEQUENT BACK
188
IF (L .GT. NRT) GO TO 150
190
C COMPUTE THE L-TH ROW TRANSFORMATION AND PLACE THE
191
C L-TH SUPER-DIAGONAL IN E(L).
193
E(L) = SNRM2(P-L,E(LP1),1)
194
IF (E(L) .EQ. 0.0E0) GO TO 80
195
IF (E(LP1) .NE. 0.0E0) E(L) = SIGN(E(L),E(LP1))
196
CALL SSCAL(P-L,1.0E0/E(L),E(LP1),1)
197
E(LP1) = 1.0E0 + E(LP1)
200
IF (LP1 .GT. N .OR. E(L) .EQ. 0.0E0) GO TO 120
202
C APPLY THE TRANSFORMATION.
208
CALL SAXPY(N-L,E(J),X(LP1,J),1,WORK(LP1),1)
211
CALL SAXPY(N-L,-E(J)/E(LP1),WORK(LP1),1,X(LP1,J),1)
214
IF (.NOT.WANTV) GO TO 140
216
C PLACE THE TRANSFORMATION IN V FOR SUBSEQUENT
217
C BACK MULTIPLICATION.
227
C SET UP THE FINAL BIDIAGONAL MATRIX OR ORDER M.
232
IF (NCT .LT. P) S(NCTP1) = X(NCTP1,NCTP1)
233
IF (N .LT. M) S(M) = 0.0E0
234
IF (NRTP1 .LT. M) E(NRTP1) = X(NRTP1,M)
237
C IF REQUIRED, GENERATE U.
239
IF (.NOT.WANTU) GO TO 300
240
IF (NCU .LT. NCTP1) GO TO 200
241
DO 190 J = NCTP1, NCU
248
IF (NCT .LT. 1) GO TO 290
251
IF (S(L) .EQ. 0.0E0) GO TO 250
253
IF (NCU .LT. LP1) GO TO 220
255
T = -SDOT(N-L+1,U(L,L),1,U(L,J),1)/U(L,L)
256
CALL SAXPY(N-L+1,T,U(L,L),1,U(L,J),1)
259
CALL SSCAL(N-L+1,-1.0E0,U(L,L),1)
260
U(L,L) = 1.0E0 + U(L,L)
262
IF (LM1 .LT. 1) GO TO 240
278
C IF IT IS REQUIRED, GENERATE V.
280
IF (.NOT.WANTV) GO TO 350
284
IF (L .GT. NRT) GO TO 320
285
IF (E(L) .EQ. 0.0E0) GO TO 320
287
T = -SDOT(P-L,V(LP1,L),1,V(LP1,J),1)/V(LP1,L)
288
CALL SAXPY(P-L,T,V(LP1,L),1,V(LP1,J),1)
298
C MAIN ITERATION LOOP FOR THE SINGULAR VALUES.
304
C QUIT IF ALL THE SINGULAR VALUES HAVE BEEN FOUND.
306
IF (M .EQ. 0) GO TO 620
308
C IF TOO MANY ITERATIONS HAVE BEEN PERFORMED, SET
311
IF (ITER .LT. MAXIT) GO TO 370
316
C THIS SECTION OF THE PROGRAM INSPECTS FOR
317
C NEGLIGIBLE ELEMENTS IN THE S AND E ARRAYS. ON
318
C COMPLETION THE VARIABLES KASE AND L ARE SET AS FOLLOWS.
320
C KASE = 1 IF S(M) AND E(L-1) ARE NEGLIGIBLE AND L.LT.M
321
C KASE = 2 IF S(L) IS NEGLIGIBLE AND L.LT.M
322
C KASE = 3 IF E(L-1) IS NEGLIGIBLE, L.LT.M, AND
323
C S(L), ..., S(M) ARE NOT NEGLIGIBLE (QR STEP).
324
C KASE = 4 IF E(M-1) IS NEGLIGIBLE (CONVERGENCE).
328
IF (L .EQ. 0) GO TO 400
329
TEST = ABS(S(L)) + ABS(S(L+1))
330
ZTEST = TEST + ABS(E(L))
331
IF (ZTEST .NE. TEST) GO TO 380
337
IF (L .NE. M - 1) GO TO 410
343
DO 430 LLS = LP1, MP1
345
IF (LS .EQ. L) GO TO 440
347
IF (LS .NE. M) TEST = TEST + ABS(E(LS))
348
IF (LS .NE. L + 1) TEST = TEST + ABS(E(LS-1))
349
ZTEST = TEST + ABS(S(LS))
350
IF (ZTEST .NE. TEST) GO TO 420
356
IF (LS .NE. L) GO TO 450
360
IF (LS .NE. M) GO TO 460
370
C PERFORM THE TASK INDICATED BY KASE.
372
GO TO (490,520,540,570), KASE
374
C DEFLATE NEGLIGIBLE S(M).
383
CALL SROTG(T1,F,CS,SN)
385
IF (K .EQ. L) GO TO 500
389
IF (WANTV) CALL SROT(P,V(1,K),1,V(1,M),1,CS,SN)
393
C SPLIT AT NEGLIGIBLE S(L).
400
CALL SROTG(T1,F,CS,SN)
404
IF (WANTU) CALL SROT(N,U(1,K),1,U(1,L-1),1,CS,SN)
408
C PERFORM ONE QR STEP.
412
C CALCULATE THE SHIFT.
414
SCALE = MAX(ABS(S(M)),ABS(S(M-1)),ABS(E(M-1)),ABS(S(L)),
421
B = ((SMM1 + SM)*(SMM1 - SM) + EMM1**2)/2.0E0
424
IF (B .EQ. 0.0E0 .AND. C .EQ. 0.0E0) GO TO 550
426
IF (B .LT. 0.0E0) SHIFT = -SHIFT
427
SHIFT = C/(B + SHIFT)
429
F = (SL + SM)*(SL - SM) - SHIFT
436
CALL SROTG(F,G,CS,SN)
437
IF (K .NE. L) E(K-1) = F
438
F = CS*S(K) + SN*E(K)
439
E(K) = CS*E(K) - SN*S(K)
442
IF (WANTV) CALL SROT(P,V(1,K),1,V(1,K+1),1,CS,SN)
443
CALL SROTG(F,G,CS,SN)
445
F = CS*E(K) + SN*S(K+1)
446
S(K+1) = -SN*E(K) + CS*S(K+1)
449
IF (WANTU .AND. K .LT. N)
450
1 CALL SROT(N,U(1,K),1,U(1,K+1),1,CS,SN)
460
C MAKE THE SINGULAR VALUE POSITIVE.
462
IF (S(L) .GE. 0.0E0) GO TO 580
464
IF (WANTV) CALL SSCAL(P,-1.0E0,V(1,L),1)
467
C ORDER THE SINGULAR VALUE.
469
590 IF (L .EQ. MM) GO TO 600
470
IF (S(L) .GE. S(L+1)) GO TO 600
474
IF (WANTV .AND. L .LT. P)
475
1 CALL SSWAP(P,V(1,L),1,V(1,L+1),1)
476
IF (WANTU .AND. L .LT. N)
477
1 CALL SSWAP(N,U(1,L),1,U(1,L+1),1)