123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185 |
- *DECK ORTHOR
- SUBROUTINE ORTHOR (A, N, M, NRDA, IFLAG, IRANK, ISCALE, DIAG,
- + KPIVOT, SCALES, ROWS, RS)
- C***BEGIN PROLOGUE ORTHOR
- C***SUBSIDIARY
- C***PURPOSE Subsidiary to BVSUP
- C***LIBRARY SLATEC
- C***TYPE SINGLE PRECISION (ORTHOR-S, DORTHR-D)
- C***AUTHOR Watts, H. A., (SNLA)
- C***DESCRIPTION
- C
- C Reduction of the matrix A to lower triangular form by a sequence of
- C orthogonal HOUSEHOLDER transformations post-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 N -- Number of rows in the matrix, N greater or equal to 1
- C M -- Number of columns in the matrix, M greater or equal to N
- 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 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 N
- C DIAG,KPIVOT,ROWS -- Arrays of length at least N used internally
- C ,RS,SCALES (except for SCALES which is M)
- 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 lower triangular
- C part and transformation information
- 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 900328 Added TYPE section. (WRB)
- C 910408 Updated the AUTHOR and REFERENCES sections. (WRB)
- C 920501 Reformatted the REFERENCES section. (WRB)
- C***END PROLOGUE ORTHOR
- DIMENSION A(NRDA,*),DIAG(*),KPIVOT(*),ROWS(*),RS(*),SCALES(*)
- C
- C END OF ABSTRACT
- C
- C **********************************************************************
- C
- C MACHINE PRECISION (COMPUTER UNIT ROUNDOFF VALUE) IS DEFINED
- C BY THE FUNCTION R1MACH.
- C
- C **********************************************************************
- C
- C***FIRST EXECUTABLE STATEMENT ORTHOR
- URO = R1MACH(4)
- IF (M .GE. N .AND. N .GE. 1 .AND. NRDA .GE. N) GO TO 1
- IFLAG=2
- CALL XERMSG ('SLATEC', 'ORTHOR', '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 ROW AND A MATRIX NORM
- C
- ANORM=0.
- DO 2 J=1,N
- KPIVOT(J)=J
- ROWS(J)=SDOT(M,A(J,1),NRDA,A(J,1),NRDA)
- RS(J)=ROWS(J)
- ANORM=ANORM+ROWS(J)
- 2 CONTINUE
- C
- C PERFORM COLUMN SCALING ON A WHEN SPECIFIED
- C
- CALL CSCALE(A,NRDA,N,M,SCALES,DUM,ROWS,RS,ANORM,SCALES,ISCALE,1)
- C
- ANORM=SQRT(ANORM)
- C
- C
- C CONSTRUCTION OF LOWER 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 ROW
- C
- DO 10 J=K,N
- IF (ROWS(J) .GE. SRURO*RS(J)) GO TO 5
- ROWS(J)=SDOT(MK,A(J,K),NRDA,A(J,K),NRDA)
- RS(J)=ROWS(J)
- 5 IF (J .EQ. K) GO TO 7
- IF (SIGMA .GE. 0.99*ROWS(J)) GO TO 10
- 7 SIGMA=ROWS(J)
- JROW=J
- 10 CONTINUE
- IF (JROW .EQ. K) GO TO 25
- C
- C PERFORM ROW INTERCHANGE
- C
- L=KPIVOT(K)
- KPIVOT(K)=KPIVOT(JROW)
- KPIVOT(JROW)=L
- ROWS(JROW)=ROWS(K)
- ROWS(K)=SIGMA
- RSS=RS(K)
- RS(K)=RS(JROW)
- RS(JROW)=RSS
- DO 20 L=1,M
- ASAVE=A(K,L)
- A(K,L)=A(JROW,L)
- 20 A(JROW,L)=ASAVE
- C
- C CHECK RANK OF THE MATRIX
- C
- 25 SIG=SDOT(MK,A(K,K),NRDA,A(K,K),NRDA)
- DIAGK=SQRT(SIG)
- IF (DIAGK .GT. ACC*ANORM) GO TO 30
- C
- C RANK DEFICIENT PROBLEM
- IFLAG=3
- IRANK=K-1
- CALL XERMSG ('SLATEC', 'ORTHOR',
- + 'RANK OF MATRIX IS LESS THAN THE NUMBER OF ROWS.', 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),NRDA,A(J,K),NRDA)/SAD
- DO 35 L=K,M
- 35 A(J,L)=A(J,L)+AS*A(K,L)
- 40 ROWS(J)=ROWS(J)-A(J,K)**2
- 50 CONTINUE
- C
- C
- RETURN
- END
|