123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187 |
- *DECK ORTHOL
- SUBROUTINE ORTHOL (A, M, N, NRDA, IFLAG, IRANK, ISCALE, DIAG,
- + KPIVOT, SCALES, COLS, CS)
- C***BEGIN PROLOGUE ORTHOL
- C***SUBSIDIARY
- C***PURPOSE Subsidiary to BVSUP
- C***LIBRARY SLATEC
- C***TYPE SINGLE PRECISION (ORTHOL-S)
- C***AUTHOR Watts, H. A., (SNLA)
- C***DESCRIPTION
- C
- C Reduction of the matrix A to upper triangular form by a sequence of
- C orthogonal HOUSEHOLDER transformations pre-multiplying A
- C
- C Modeled after the ALGOL codes in the articles in the REFERENCES
- C section.
- C
- C **********************************************************************
- C INPUT
- C **********************************************************************
- C
- C A -- Contains the matrix to be decomposed, must be dimensioned
- C NRDA by N
- C M -- Number of rows in the matrix, M greater or equal to N
- C N -- Number of columns in the matrix, N greater or equal to 1
- C IFLAG -- Indicates the uncertainty in the matrix data
- C = 0 when the data is to be treated as exact
- C =-K when the data is assumed to be accurate to about
- C K digits
- C ISCALE -- Scaling indicator
- C =-1 if the matrix A is to be pre-scaled by
- C columns when appropriate.
- C Otherwise no scaling will be attempted
- C NRDA -- Row dimension of A, NRDA greater or equal to M
- C DIAG,KPIVOT,COLS -- Arrays of length at least n used internally
- C ,CS,SCALES
- C
- C **********************************************************************
- C OUTPUT
- C **********************************************************************
- C
- C IFLAG - Status indicator
- C =1 for successful decomposition
- C =2 if improper input is detected
- C =3 if rank of the matrix is less than N
- C A -- Contains the reduced matrix in the strictly upper triangular
- C part and transformation information in the lower part
- C IRANK -- Contains the numerically determined matrix rank
- C DIAG -- Contains the diagonal elements of the reduced
- C triangular matrix
- C KPIVOT -- Contains the pivotal information, the column
- C interchanges performed on the original matrix are
- C recorded here.
- C SCALES -- Contains the column scaling parameters
- C
- C **********************************************************************
- C
- C***SEE ALSO BVSUP
- C***REFERENCES G. Golub, Numerical methods for solving linear least
- C squares problems, Numerische Mathematik 7, (1965),
- C pp. 206-216.
- C P. Businger and G. Golub, Linear least squares
- C solutions by Householder transformations, Numerische
- C Mathematik 7, (1965), pp. 269-276.
- C***ROUTINES CALLED CSCALE, R1MACH, SDOT, XERMSG
- C***REVISION HISTORY (YYMMDD)
- C 750601 DATE WRITTEN
- C 890531 Changed all specific intrinsics to generic. (WRB)
- C 890831 Modified array declarations. (WRB)
- C 891214 Prologue converted to Version 4.0 format. (BAB)
- C 900315 CALLs to XERROR changed to CALLs to XERMSG. (THJ)
- C 900402 Added TYPE section. (WRB)
- C 910408 Updated the AUTHOR and REFERENCES sections. (WRB)
- C 920501 Reformatted the REFERENCES section. (WRB)
- C***END PROLOGUE ORTHOL
- DIMENSION A(NRDA,*),DIAG(*),KPIVOT(*),COLS(*),CS(*),SCALES(*)
- C
- C **********************************************************************
- C
- C MACHINE PRECISION (COMPUTER UNIT ROUNDOFF VALUE) IS DEFINED
- C BY THE FUNCTION R1MACH.
- C
- C***FIRST EXECUTABLE STATEMENT ORTHOL
- URO = R1MACH(3)
- C
- C **********************************************************************
- C
- IF (M .GE. N .AND. N .GE. 1 .AND. NRDA .GE. M) GO TO 1
- IFLAG=2
- CALL XERMSG ('SLATEC', 'ORTHOL', 'INVALID INPUT PARAMETERS.', 2,
- + 1)
- RETURN
- C
- 1 ACC=10.*URO
- IF (IFLAG .LT. 0) ACC=MAX(ACC,10.**IFLAG)
- SRURO=SQRT(URO)
- IFLAG=1
- IRANK=N
- C
- C COMPUTE NORM**2 OF JTH COLUMN AND A MATRIX NORM
- C
- ANORM=0.
- DO 2 J=1,N
- KPIVOT(J)=J
- COLS(J)=SDOT(M,A(1,J),1,A(1,J),1)
- CS(J)=COLS(J)
- ANORM=ANORM+COLS(J)
- 2 CONTINUE
- C
- C PERFORM COLUMN SCALING ON A WHEN SPECIFIED
- C
- CALL CSCALE(A,NRDA,M,N,COLS,CS,DUM,DUM,ANORM,SCALES,ISCALE,0)
- C
- ANORM=SQRT(ANORM)
- C
- C
- C CONSTRUCTION OF UPPER TRIANGULAR MATRIX AND RECORDING OF
- C ORTHOGONAL TRANSFORMATIONS
- C
- C
- DO 50 K=1,N
- MK=M-K+1
- IF (K .EQ. N) GO TO 25
- KP=K+1
- C
- C SEARCHING FOR PIVOTAL COLUMN
- C
- DO 10 J=K,N
- IF (COLS(J) .GE. SRURO*CS(J)) GO TO 5
- COLS(J)=SDOT(MK,A(K,J),1,A(K,J),1)
- CS(J)=COLS(J)
- 5 IF (J .EQ. K) GO TO 7
- IF (SIGMA .GE. 0.99*COLS(J)) GO TO 10
- 7 SIGMA=COLS(J)
- JCOL=J
- 10 CONTINUE
- IF (JCOL .EQ. K) GO TO 25
- C
- C PERFORM COLUMN INTERCHANGE
- C
- L=KPIVOT(K)
- KPIVOT(K)=KPIVOT(JCOL)
- KPIVOT(JCOL)=L
- COLS(JCOL)=COLS(K)
- COLS(K)=SIGMA
- CSS=CS(K)
- CS(K)=CS(JCOL)
- CS(JCOL)=CSS
- SC=SCALES(K)
- SCALES(K)=SCALES(JCOL)
- SCALES(JCOL)=SC
- DO 20 L=1,M
- ASAVE=A(L,K)
- A(L,K)=A(L,JCOL)
- 20 A(L,JCOL)=ASAVE
- C
- C CHECK RANK OF THE MATRIX
- C
- 25 SIG=SDOT(MK,A(K,K),1,A(K,K),1)
- DIAGK=SQRT(SIG)
- IF (DIAGK .GT. ACC*ANORM) GO TO 30
- C
- C RANK DEFICIENT PROBLEM
- IFLAG=3
- IRANK=K-1
- CALL XERMSG ('SLATEC', 'ORTHOL',
- + 'RANK OF MATRIX IS LESS THAN THE NUMBER OF COLUMNS.', 1, 1)
- RETURN
- C
- C CONSTRUCT AND APPLY TRANSFORMATION TO MATRIX A
- C
- 30 AKK=A(K,K)
- IF (AKK .GT. 0.) DIAGK=-DIAGK
- DIAG(K)=DIAGK
- A(K,K)=AKK-DIAGK
- IF (K .EQ. N) GO TO 50
- SAD=DIAGK*AKK-SIG
- DO 40 J=KP,N
- AS=SDOT(MK,A(K,K),1,A(K,J),1)/SAD
- DO 35 L=K,M
- 35 A(L,J)=A(L,J)+AS*A(L,K)
- 40 COLS(J)=COLS(J)-A(K,J)**2
- 50 CONTINUE
- C
- C
- RETURN
- END
|