home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Geek Gadgets 1
/
ADE-1.bin
/
ade-dist
/
octave-1.1.1p1-src.tgz
/
tar.out
/
fsf
/
octave
/
libcruft
/
minpack
/
qrfac.f
< prev
next >
Wrap
Text File
|
1996-09-28
|
5KB
|
165 lines
SUBROUTINE QRFAC(M,N,A,LDA,PIVOT,IPVT,LIPVT,SIGMA,ACNORM,WA)
INTEGER M,N,LDA,LIPVT
INTEGER IPVT(LIPVT)
LOGICAL PIVOT
DOUBLE PRECISION A(LDA,N),SIGMA(N),ACNORM(N),WA(N)
C **********
C
C SUBROUTINE QRFAC
C
C THIS SUBROUTINE USES HOUSEHOLDER TRANSFORMATIONS WITH COLUMN
C PIVOTING (OPTIONAL) TO COMPUTE A QR FACTORIZATION OF THE
C M BY N MATRIX A. THAT IS, QRFAC DETERMINES AN ORTHOGONAL
C MATRIX Q, A PERMUTATION MATRIX P, AND AN UPPER TRAPEZOIDAL
C MATRIX R WITH DIAGONAL ELEMENTS OF NONINCREASING MAGNITUDE,
C SUCH THAT A*P = Q*R. THE HOUSEHOLDER TRANSFORMATION FOR
C COLUMN K, K = 1,2,...,MIN(M,N), IS OF THE FORM
C
C T
C I - (1/U(K))*U*U
C
C WHERE U HAS ZEROS IN THE FIRST K-1 POSITIONS. THE FORM OF
C THIS TRANSFORMATION AND THE METHOD OF PIVOTING FIRST
C APPEARED IN THE CORRESPONDING LINPACK SUBROUTINE.
C
C THE SUBROUTINE STATEMENT IS
C
C SUBROUTINE QRFAC(M,N,A,LDA,PIVOT,IPVT,LIPVT,SIGMA,ACNORM,WA)
C
C WHERE
C
C M IS A POSITIVE INTEGER INPUT VARIABLE SET TO THE NUMBER
C OF ROWS OF A.
C
C N IS A POSITIVE INTEGER INPUT VARIABLE SET TO THE NUMBER
C OF COLUMNS OF A.
C
C A IS AN M BY N ARRAY. ON INPUT A CONTAINS THE MATRIX FOR
C WHICH THE QR FACTORIZATION IS TO BE COMPUTED. ON OUTPUT
C THE STRICT UPPER TRAPEZOIDAL PART OF A CONTAINS THE STRICT
C UPPER TRAPEZOIDAL PART OF R, AND THE LOWER TRAPEZOIDAL
C PART OF A CONTAINS A FACTORED FORM OF Q (THE NON-TRIVIAL
C ELEMENTS OF THE U VECTORS DESCRIBED ABOVE).
C
C LDA IS A POSITIVE INTEGER INPUT VARIABLE NOT LESS THAN M
C WHICH SPECIFIES THE LEADING DIMENSION OF THE ARRAY A.
C
C PIVOT IS A LOGICAL INPUT VARIABLE. IF PIVOT IS SET TRUE,
C THEN COLUMN PIVOTING IS ENFORCED. IF PIVOT IS SET FALSE,
C THEN NO COLUMN PIVOTING IS DONE.
C
C IPVT IS AN INTEGER OUTPUT ARRAY OF LENGTH LIPVT. IPVT
C DEFINES THE PERMUTATION MATRIX P SUCH THAT A*P = Q*R.
C COLUMN J OF P IS COLUMN IPVT(J) OF THE IDENTITY MATRIX.
C IF PIVOT IS FALSE, IPVT IS NOT REFERENCED.
C
C LIPVT IS A POSITIVE INTEGER INPUT VARIABLE. IF PIVOT IS FALSE,
C THEN LIPVT MAY BE AS SMALL AS 1. IF PIVOT IS TRUE, THEN
C LIPVT MUST BE AT LEAST N.
C
C SIGMA IS AN OUTPUT ARRAY OF LENGTH N WHICH CONTAINS THE
C DIAGONAL ELEMENTS OF R.
C
C ACNORM IS AN OUTPUT ARRAY OF LENGTH N WHICH CONTAINS THE
C NORMS OF THE CORRESPONDING COLUMNS OF THE INPUT MATRIX A.
C IF THIS INFORMATION IS NOT NEEDED, THEN ACNORM CAN COINCIDE
C WITH SIGMA.
C
C WA IS A WORK ARRAY OF LENGTH N. IF PIVOT IS FALSE, THEN WA
C CAN COINCIDE WITH SIGMA.
C
C SUBPROGRAMS CALLED
C
C MINPACK-SUPPLIED ... DPMPAR,ENORM
C
C FORTRAN-SUPPLIED ... DMAX1,DSQRT,MIN0
C
C MINPACK. VERSION OF DECEMBER 1978.
C BURTON S. GARBOW, KENNETH E. HILLSTROM, JORGE J. MORE
C
C **********
INTEGER I,J,JP1,K,KMAX,MINMN
DOUBLE PRECISION AJNORM,EPSMCH,ONE,P05,SUM,TEMP,ZERO
DOUBLE PRECISION DPMPAR,ENORM
DATA ONE,P05,ZERO /1.0D0,5.0D-2,0.0D0/
C
C EPSMCH IS THE MACHINE PRECISION.
C
EPSMCH = DPMPAR(1)
C
C COMPUTE THE INITIAL COLUMN NORMS AND INITIALIZE SEVERAL ARRAYS.
C
DO 10 J = 1, N
ACNORM(J) = ENORM(M,A(1,J))
SIGMA(J) = ACNORM(J)
WA(J) = SIGMA(J)
IF (PIVOT) IPVT(J) = J
10 CONTINUE
C
C REDUCE A TO R WITH HOUSEHOLDER TRANSFORMATIONS.
C
MINMN = MIN0(M,N)
DO 110 J = 1, MINMN
IF (.NOT.PIVOT) GO TO 40
C
C BRING THE COLUMN OF LARGEST NORM INTO THE PIVOT POSITION.
C
KMAX = J
DO 20 K = J, N
IF (SIGMA(K) .GT. SIGMA(KMAX)) KMAX = K
20 CONTINUE
IF (KMAX .EQ. J) GO TO 40
DO 30 I = 1, M
TEMP = A(I,J)
A(I,J) = A(I,KMAX)
A(I,KMAX) = TEMP
30 CONTINUE
SIGMA(KMAX) = SIGMA(J)
WA(KMAX) = WA(J)
K = IPVT(J)
IPVT(J) = IPVT(KMAX)
IPVT(KMAX) = K
40 CONTINUE
C
C COMPUTE THE HOUSEHOLDER TRANSFORMATION TO REDUCE THE
C J-TH COLUMN OF A TO A MULTIPLE OF THE J-TH UNIT VECTOR.
C
AJNORM = ENORM(M-J+1,A(J,J))
IF (AJNORM .EQ. ZERO) GO TO 100
IF (A(J,J) .LT. ZERO) AJNORM = -AJNORM
DO 50 I = J, M
A(I,J) = A(I,J)/AJNORM
50 CONTINUE
A(J,J) = A(J,J) + ONE
C
C APPLY THE TRANSFORMATION TO THE REMAINING COLUMNS
C AND UPDATE THE NORMS.
C
JP1 = J + 1
IF (N .LT. JP1) GO TO 100
DO 90 K = JP1, N
SUM = ZERO
DO 60 I = J, M
SUM = SUM + A(I,J)*A(I,K)
60 CONTINUE
TEMP = SUM/A(J,J)
DO 70 I = J, M
A(I,K) = A(I,K) - TEMP*A(I,J)
70 CONTINUE
IF (.NOT.PIVOT .OR. SIGMA(K) .EQ. ZERO) GO TO 80
TEMP = A(J,K)/SIGMA(K)
SIGMA(K) = SIGMA(K)*DSQRT(DMAX1(ZERO,ONE-TEMP**2))
IF (P05*(SIGMA(K)/WA(K))**2 .GT. EPSMCH) GO TO 80
SIGMA(K) = ENORM(M-J,A(JP1,K))
WA(K) = SIGMA(K)
80 CONTINUE
90 CONTINUE
100 CONTINUE
SIGMA(J) = -AJNORM
110 CONTINUE
RETURN
C
C LAST CARD OF SUBROUTINE QRFAC.
C
END