1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137
|
SUBROUTINE EREDUC(E, M, N, Q, Z, ISTAIR, RANKE, TOL)
C PURPOSE:
C
C Given an M x N matrix E (not necessarily regular) the subroutine
C EREDUC computes a unitary transformed matrix Q*E*Z which is in
C column echelon form (trapezoidal form). Furthermore the rank of
C matrix E is determined.
C
C CONTRIBUTOR: Th.G.J. Beelen (Philips Glass Eindhoven).
C Copyright SLICOT
C
C REVISIONS: 1988, January 29.
C
C Specification of the parameters.
C
C .. Scalar arguments ..
C
INTEGER LDE, LDQ, LDZ, M, N, RANKE
DOUBLE PRECISION TOL
C
C .. Array arguments ..
C
INTEGER ISTAIR(M)
C DOUBLE PRECISION E(LDE,N), Q(LDQ,M), Z(LDZ,N)
C SET E(M,N) Q(M,M) Z(N,N)
DOUBLE PRECISION E(M,N), Q(M,M), Z(N,N)
C Local variables.
C
INTEGER I, J, JMX, K, KM1, L, LK, MNK, NR1
DOUBLE PRECISION EMXNRM, EMX, SC, SS
LOGICAL LZERO
C
LDE=M
LDQ=M
LDZ=N
do 991 i=1,m
do 991 j=1,m
q(i,j)=0.d0
991 continue
do 992 i=1,m
q(i,i)=1.0d0
992 continue
do 993 i=1,n
do 993 j=1,n
z(i,j)=0.d0
993 continue
do 994 i=1,n
z(i,i)=1.0d0
994 continue
RANKE = MIN0(M,N)
C
K = N
LZERO = .FALSE.
C
C WHILE ((K > 0) AND (NOT a zero submatrix encountered) DO
10 IF ((K .GT. 0) .AND. (.NOT.LZERO)) THEN
C
C
MNK = M - N + K
EMXNRM = 0.0D0
LK = MNK
DO 20 L = MNK, 1, -1
JMX = IDAMAX(K, E(L,1), LDE)
EMX = DABS(E(L,JMX))
IF (EMX .GT. EMXNRM) THEN
EMXNRM = EMX
LK = L
END IF
20 CONTINUE
C
IF (EMXNRM .LT. TOL) THEN
C
C Set submatrix Ek to zero.
C
DO 40 J = 1, K
DO 30 L = 1, MNK
E(L,J) = 0.0D0
30 CONTINUE
40 CONTINUE
LZERO = .TRUE.
RANKE = N - K
ELSE
C
C Submatrix Ek is not considered to be identically zero.
C Check whether rows have to be interchanged.
C
IF (LK .NE. MNK) THEN
C
C Interchange rows lk and m-n+k in whole E-matrix and
C update the row transformation matrix Q.
C (# elements involved = m)
C
CALL DSWAP(N, E(LK,1), LDE, E(MNK,1), LDE)
CALL DSWAP(M, Q(LK,1), LDQ, Q(MNK,1), LDQ)
END IF
C
KM1 = K - 1
DO 50 J = 1, KM1
C
C Determine the column Givens transformation to annihilate
C E(m-n+k,j) using E(m-n+k,k) as pivot.
C Apply the transformation to the columns of Ek.
C (# elements involved = m-n+k)
C Update the column transformation matrix Z.
C (# elements involved = n)
C
CALL DGIV(E(MNK,K), E(MNK,J), SC, SS)
CALL DROT(MNK, E(1,K), 1, E(1,J), 1, SC, SS)
E(MNK, J) = 0.0D0
CALL DROT(N, Z(1,K), 1, Z(1,J), 1, SC, SS)
50 CONTINUE
C
K = K - 1
END IF
GOTO 10
END IF
C END WHILE 10
C
C Initialise administration staircase form, i.e.,
C ISTAIR(i) = j if E(i,j) is a nonzero corner point
C = -j if E(i,j) is on the boundary but is no corner pt.
C Thus,
C ISTAIR(m-k) = n-k for k=0,...,rank(E)-1
C = -(n-rank(E)+1) for k=rank(E),...,m-1.
C
DO 60 I = 1, RANKE
ISTAIR(M - I + 1) = N - I + 1
60 CONTINUE
C
NR1 = N - RANKE + 1
DO 70 I = RANKE, M - 1
ISTAIR(M-I) = -NR1
70 CONTINUE
C
RETURN
C *** Last line of EREDUC *********************************************
END
|