dsvdc.f 15 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487
  1. *DECK DSVDC
  2. SUBROUTINE DSVDC (X, LDX, N, P, S, E, U, LDU, V, LDV, WORK, JOB,
  3. + INFO)
  4. C***BEGIN PROLOGUE DSVDC
  5. C***PURPOSE Perform the singular value decomposition of a rectangular
  6. C matrix.
  7. C***LIBRARY SLATEC (LINPACK)
  8. C***CATEGORY D6
  9. C***TYPE DOUBLE 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)
  13. C***DESCRIPTION
  14. C
  15. C DSVDC is a subroutine to reduce a double precision NxP matrix X
  16. C by orthogonal transformations U and V to diagonal form. The
  17. C diagonal elements S(I) are the singular values of X. The
  18. C columns of U are the corresponding left singular vectors,
  19. C and the columns of V the right singular vectors.
  20. C
  21. C On Entry
  22. C
  23. C X DOUBLE PRECISION(LDX,P), where LDX .GE. N.
  24. C X contains the matrix whose singular value
  25. C decomposition is to be computed. X is
  26. C destroyed by DSVDC.
  27. C
  28. C LDX INTEGER.
  29. C LDX is the leading dimension of the array X.
  30. C
  31. C N INTEGER.
  32. C N is the number of rows of the matrix X.
  33. C
  34. C P INTEGER.
  35. C P is the number of columns of the matrix X.
  36. C
  37. C LDU INTEGER.
  38. C LDU is the leading dimension of the array U.
  39. C (See below).
  40. C
  41. C LDV INTEGER.
  42. C LDV is the leading dimension of the array V.
  43. C (See below).
  44. C
  45. C WORK DOUBLE PRECISION(N).
  46. C WORK is a scratch array.
  47. C
  48. C JOB INTEGER.
  49. C JOB controls the computation of the singular
  50. C vectors. It has the decimal expansion AB
  51. C with the following meaning
  52. C
  53. C A .EQ. 0 do not compute the left singular
  54. C vectors.
  55. C A .EQ. 1 return the N left singular vectors
  56. C in U.
  57. C A .GE. 2 return the first MIN(N,P) singular
  58. C vectors in U.
  59. C B .EQ. 0 do not compute the right singular
  60. C vectors.
  61. C B .EQ. 1 return the right singular vectors
  62. C in V.
  63. C
  64. C On Return
  65. C
  66. C S DOUBLE PRECISION(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
  69. C order of magnitude.
  70. C
  71. C E DOUBLE PRECISION(P).
  72. C E ordinarily contains zeros. However see the
  73. C discussion of INFO for exceptions.
  74. C
  75. C U DOUBLE PRECISION(LDU,K), where LDU .GE. N.
  76. C If JOBA .EQ. 1, then K .EQ. N.
  77. C If JOBA .GE. 2, then K .EQ. MIN(N,P).
  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.
  82. C
  83. C V DOUBLE PRECISION(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
  87. C subroutine call.
  88. C
  89. C INFO INTEGER.
  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.
  100. C
  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 DAXPY, DDOT, DNRM2, DROT, DROTG, DSCAL, DSWAP
  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.
  110. C (WRB)
  111. C 920501 Reformatted the REFERENCES section. (WRB)
  112. C***END PROLOGUE DSVDC
  113. INTEGER LDX,N,P,LDU,LDV,JOB,INFO
  114. DOUBLE PRECISION X(LDX,*),S(*),E(*),U(LDU,*),V(LDV,*),WORK(*)
  115. C
  116. C
  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
  119. DOUBLE PRECISION DDOT,T
  120. DOUBLE PRECISION B,C,CS,EL,EMM1,F,G,DNRM2,SCALE,SHIFT,SL,SM,SN,
  121. 1 SMM1,T1,TEST,ZTEST
  122. LOGICAL WANTU,WANTV
  123. C***FIRST EXECUTABLE STATEMENT DSVDC
  124. C
  125. C SET THE MAXIMUM NUMBER OF ITERATIONS.
  126. C
  127. MAXIT = 30
  128. C
  129. C DETERMINE WHAT IS TO BE COMPUTED.
  130. C
  131. WANTU = .FALSE.
  132. WANTV = .FALSE.
  133. JOBU = MOD(JOB,100)/10
  134. NCU = N
  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.
  138. C
  139. C REDUCE X TO BIDIAGONAL FORM, STORING THE DIAGONAL ELEMENTS
  140. C IN S AND THE SUPER-DIAGONAL ELEMENTS IN E.
  141. C
  142. INFO = 0
  143. NCT = MIN(N-1,P)
  144. NRT = MAX(0,MIN(P-2,N))
  145. LU = MAX(NCT,NRT)
  146. IF (LU .LT. 1) GO TO 170
  147. DO 160 L = 1, LU
  148. LP1 = L + 1
  149. IF (L .GT. NCT) GO TO 20
  150. C
  151. C COMPUTE THE TRANSFORMATION FOR THE L-TH COLUMN AND
  152. C PLACE THE L-TH DIAGONAL IN S(L).
  153. C
  154. S(L) = DNRM2(N-L+1,X(L,L),1)
  155. IF (S(L) .EQ. 0.0D0) GO TO 10
  156. IF (X(L,L) .NE. 0.0D0) S(L) = SIGN(S(L),X(L,L))
  157. CALL DSCAL(N-L+1,1.0D0/S(L),X(L,L),1)
  158. X(L,L) = 1.0D0 + X(L,L)
  159. 10 CONTINUE
  160. S(L) = -S(L)
  161. 20 CONTINUE
  162. IF (P .LT. LP1) GO TO 50
  163. DO 40 J = LP1, P
  164. IF (L .GT. NCT) GO TO 30
  165. IF (S(L) .EQ. 0.0D0) GO TO 30
  166. C
  167. C APPLY THE TRANSFORMATION.
  168. C
  169. T = -DDOT(N-L+1,X(L,L),1,X(L,J),1)/X(L,L)
  170. CALL DAXPY(N-L+1,T,X(L,L),1,X(L,J),1)
  171. 30 CONTINUE
  172. C
  173. C PLACE THE L-TH ROW OF X INTO E FOR THE
  174. C SUBSEQUENT CALCULATION OF THE ROW TRANSFORMATION.
  175. C
  176. E(J) = X(L,J)
  177. 40 CONTINUE
  178. 50 CONTINUE
  179. IF (.NOT.WANTU .OR. L .GT. NCT) GO TO 70
  180. C
  181. C PLACE THE TRANSFORMATION IN U FOR SUBSEQUENT BACK
  182. C MULTIPLICATION.
  183. C
  184. DO 60 I = L, N
  185. U(I,L) = X(I,L)
  186. 60 CONTINUE
  187. 70 CONTINUE
  188. IF (L .GT. NRT) GO TO 150
  189. C
  190. C COMPUTE THE L-TH ROW TRANSFORMATION AND PLACE THE
  191. C L-TH SUPER-DIAGONAL IN E(L).
  192. C
  193. E(L) = DNRM2(P-L,E(LP1),1)
  194. IF (E(L) .EQ. 0.0D0) GO TO 80
  195. IF (E(LP1) .NE. 0.0D0) E(L) = SIGN(E(L),E(LP1))
  196. CALL DSCAL(P-L,1.0D0/E(L),E(LP1),1)
  197. E(LP1) = 1.0D0 + E(LP1)
  198. 80 CONTINUE
  199. E(L) = -E(L)
  200. IF (LP1 .GT. N .OR. E(L) .EQ. 0.0D0) GO TO 120
  201. C
  202. C APPLY THE TRANSFORMATION.
  203. C
  204. DO 90 I = LP1, N
  205. WORK(I) = 0.0D0
  206. 90 CONTINUE
  207. DO 100 J = LP1, P
  208. CALL DAXPY(N-L,E(J),X(LP1,J),1,WORK(LP1),1)
  209. 100 CONTINUE
  210. DO 110 J = LP1, P
  211. CALL DAXPY(N-L,-E(J)/E(LP1),WORK(LP1),1,X(LP1,J),1)
  212. 110 CONTINUE
  213. 120 CONTINUE
  214. IF (.NOT.WANTV) GO TO 140
  215. C
  216. C PLACE THE TRANSFORMATION IN V FOR SUBSEQUENT
  217. C BACK MULTIPLICATION.
  218. C
  219. DO 130 I = LP1, P
  220. V(I,L) = E(I)
  221. 130 CONTINUE
  222. 140 CONTINUE
  223. 150 CONTINUE
  224. 160 CONTINUE
  225. 170 CONTINUE
  226. C
  227. C SET UP THE FINAL BIDIAGONAL MATRIX OR ORDER M.
  228. C
  229. M = MIN(P,N+1)
  230. NCTP1 = NCT + 1
  231. NRTP1 = NRT + 1
  232. IF (NCT .LT. P) S(NCTP1) = X(NCTP1,NCTP1)
  233. IF (N .LT. M) S(M) = 0.0D0
  234. IF (NRTP1 .LT. M) E(NRTP1) = X(NRTP1,M)
  235. E(M) = 0.0D0
  236. C
  237. C IF REQUIRED, GENERATE U.
  238. C
  239. IF (.NOT.WANTU) GO TO 300
  240. IF (NCU .LT. NCTP1) GO TO 200
  241. DO 190 J = NCTP1, NCU
  242. DO 180 I = 1, N
  243. U(I,J) = 0.0D0
  244. 180 CONTINUE
  245. U(J,J) = 1.0D0
  246. 190 CONTINUE
  247. 200 CONTINUE
  248. IF (NCT .LT. 1) GO TO 290
  249. DO 280 LL = 1, NCT
  250. L = NCT - LL + 1
  251. IF (S(L) .EQ. 0.0D0) GO TO 250
  252. LP1 = L + 1
  253. IF (NCU .LT. LP1) GO TO 220
  254. DO 210 J = LP1, NCU
  255. T = -DDOT(N-L+1,U(L,L),1,U(L,J),1)/U(L,L)
  256. CALL DAXPY(N-L+1,T,U(L,L),1,U(L,J),1)
  257. 210 CONTINUE
  258. 220 CONTINUE
  259. CALL DSCAL(N-L+1,-1.0D0,U(L,L),1)
  260. U(L,L) = 1.0D0 + U(L,L)
  261. LM1 = L - 1
  262. IF (LM1 .LT. 1) GO TO 240
  263. DO 230 I = 1, LM1
  264. U(I,L) = 0.0D0
  265. 230 CONTINUE
  266. 240 CONTINUE
  267. GO TO 270
  268. 250 CONTINUE
  269. DO 260 I = 1, N
  270. U(I,L) = 0.0D0
  271. 260 CONTINUE
  272. U(L,L) = 1.0D0
  273. 270 CONTINUE
  274. 280 CONTINUE
  275. 290 CONTINUE
  276. 300 CONTINUE
  277. C
  278. C IF IT IS REQUIRED, GENERATE V.
  279. C
  280. IF (.NOT.WANTV) GO TO 350
  281. DO 340 LL = 1, P
  282. L = P - LL + 1
  283. LP1 = L + 1
  284. IF (L .GT. NRT) GO TO 320
  285. IF (E(L) .EQ. 0.0D0) GO TO 320
  286. DO 310 J = LP1, P
  287. T = -DDOT(P-L,V(LP1,L),1,V(LP1,J),1)/V(LP1,L)
  288. CALL DAXPY(P-L,T,V(LP1,L),1,V(LP1,J),1)
  289. 310 CONTINUE
  290. 320 CONTINUE
  291. DO 330 I = 1, P
  292. V(I,L) = 0.0D0
  293. 330 CONTINUE
  294. V(L,L) = 1.0D0
  295. 340 CONTINUE
  296. 350 CONTINUE
  297. C
  298. C MAIN ITERATION LOOP FOR THE SINGULAR VALUES.
  299. C
  300. MM = M
  301. ITER = 0
  302. 360 CONTINUE
  303. C
  304. C QUIT IF ALL THE SINGULAR VALUES HAVE BEEN FOUND.
  305. C
  306. IF (M .EQ. 0) GO TO 620
  307. C
  308. C IF TOO MANY ITERATIONS HAVE BEEN PERFORMED, SET
  309. C FLAG AND RETURN.
  310. C
  311. IF (ITER .LT. MAXIT) GO TO 370
  312. INFO = M
  313. GO TO 620
  314. 370 CONTINUE
  315. C
  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.
  319. C
  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).
  325. C
  326. DO 390 LL = 1, M
  327. L = M - LL
  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
  332. E(L) = 0.0D0
  333. GO TO 400
  334. 380 CONTINUE
  335. 390 CONTINUE
  336. 400 CONTINUE
  337. IF (L .NE. M - 1) GO TO 410
  338. KASE = 4
  339. GO TO 480
  340. 410 CONTINUE
  341. LP1 = L + 1
  342. MP1 = M + 1
  343. DO 430 LLS = LP1, MP1
  344. LS = M - LLS + LP1
  345. IF (LS .EQ. L) GO TO 440
  346. TEST = 0.0D0
  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
  351. S(LS) = 0.0D0
  352. GO TO 440
  353. 420 CONTINUE
  354. 430 CONTINUE
  355. 440 CONTINUE
  356. IF (LS .NE. L) GO TO 450
  357. KASE = 3
  358. GO TO 470
  359. 450 CONTINUE
  360. IF (LS .NE. M) GO TO 460
  361. KASE = 1
  362. GO TO 470
  363. 460 CONTINUE
  364. KASE = 2
  365. L = LS
  366. 470 CONTINUE
  367. 480 CONTINUE
  368. L = L + 1
  369. C
  370. C PERFORM THE TASK INDICATED BY KASE.
  371. C
  372. GO TO (490,520,540,570), KASE
  373. C
  374. C DEFLATE NEGLIGIBLE S(M).
  375. C
  376. 490 CONTINUE
  377. MM1 = M - 1
  378. F = E(M-1)
  379. E(M-1) = 0.0D0
  380. DO 510 KK = L, MM1
  381. K = MM1 - KK + L
  382. T1 = S(K)
  383. CALL DROTG(T1,F,CS,SN)
  384. S(K) = T1
  385. IF (K .EQ. L) GO TO 500
  386. F = -SN*E(K-1)
  387. E(K-1) = CS*E(K-1)
  388. 500 CONTINUE
  389. IF (WANTV) CALL DROT(P,V(1,K),1,V(1,M),1,CS,SN)
  390. 510 CONTINUE
  391. GO TO 610
  392. C
  393. C SPLIT AT NEGLIGIBLE S(L).
  394. C
  395. 520 CONTINUE
  396. F = E(L-1)
  397. E(L-1) = 0.0D0
  398. DO 530 K = L, M
  399. T1 = S(K)
  400. CALL DROTG(T1,F,CS,SN)
  401. S(K) = T1
  402. F = -SN*E(K)
  403. E(K) = CS*E(K)
  404. IF (WANTU) CALL DROT(N,U(1,K),1,U(1,L-1),1,CS,SN)
  405. 530 CONTINUE
  406. GO TO 610
  407. C
  408. C PERFORM ONE QR STEP.
  409. C
  410. 540 CONTINUE
  411. C
  412. C CALCULATE THE SHIFT.
  413. C
  414. SCALE = MAX(ABS(S(M)),ABS(S(M-1)),ABS(E(M-1)),
  415. 1 ABS(S(L)),ABS(E(L)))
  416. SM = S(M)/SCALE
  417. SMM1 = S(M-1)/SCALE
  418. EMM1 = E(M-1)/SCALE
  419. SL = S(L)/SCALE
  420. EL = E(L)/SCALE
  421. B = ((SMM1 + SM)*(SMM1 - SM) + EMM1**2)/2.0D0
  422. C = (SM*EMM1)**2
  423. SHIFT = 0.0D0
  424. IF (B .EQ. 0.0D0 .AND. C .EQ. 0.0D0) GO TO 550
  425. SHIFT = SQRT(B**2+C)
  426. IF (B .LT. 0.0D0) SHIFT = -SHIFT
  427. SHIFT = C/(B + SHIFT)
  428. 550 CONTINUE
  429. F = (SL + SM)*(SL - SM) - SHIFT
  430. G = SL*EL
  431. C
  432. C CHASE ZEROS.
  433. C
  434. MM1 = M - 1
  435. DO 560 K = L, MM1
  436. CALL DROTG(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)
  440. G = SN*S(K+1)
  441. S(K+1) = CS*S(K+1)
  442. IF (WANTV) CALL DROT(P,V(1,K),1,V(1,K+1),1,CS,SN)
  443. CALL DROTG(F,G,CS,SN)
  444. S(K) = F
  445. F = CS*E(K) + SN*S(K+1)
  446. S(K+1) = -SN*E(K) + CS*S(K+1)
  447. G = SN*E(K+1)
  448. E(K+1) = CS*E(K+1)
  449. IF (WANTU .AND. K .LT. N)
  450. 1 CALL DROT(N,U(1,K),1,U(1,K+1),1,CS,SN)
  451. 560 CONTINUE
  452. E(M-1) = F
  453. ITER = ITER + 1
  454. GO TO 610
  455. C
  456. C CONVERGENCE.
  457. C
  458. 570 CONTINUE
  459. C
  460. C MAKE THE SINGULAR VALUE POSITIVE.
  461. C
  462. IF (S(L) .GE. 0.0D0) GO TO 580
  463. S(L) = -S(L)
  464. IF (WANTV) CALL DSCAL(P,-1.0D0,V(1,L),1)
  465. 580 CONTINUE
  466. C
  467. C ORDER THE SINGULAR VALUE.
  468. C
  469. 590 IF (L .EQ. MM) GO TO 600
  470. IF (S(L) .GE. S(L+1)) GO TO 600
  471. T = S(L)
  472. S(L) = S(L+1)
  473. S(L+1) = T
  474. IF (WANTV .AND. L .LT. P)
  475. 1 CALL DSWAP(P,V(1,L),1,V(1,L+1),1)
  476. IF (WANTU .AND. L .LT. N)
  477. 1 CALL DSWAP(N,U(1,L),1,U(1,L+1),1)
  478. L = L + 1
  479. GO TO 590
  480. 600 CONTINUE
  481. ITER = 0
  482. M = M - 1
  483. 610 CONTINUE
  484. GO TO 360
  485. 620 CONTINUE
  486. RETURN
  487. END