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
|