Annotation of OpenXM_contrib/PHC/Ada/Math_Lib/Matrices/ts_qrd.adb, Revision 1.1.1.1
1.1 maekawa 1: with text_io,integer_io; use text_io,integer_io;
2: with Standard_Floating_Numbers; use Standard_Floating_Numbers;
3: with Standard_Floating_Numbers_io; use Standard_Floating_Numbers_io;
4: with Standard_Complex_Numbers; use Standard_Complex_Numbers;
5: with Standard_Natural_Vectors;
6: with Standard_Natural_Vectors_io; use Standard_Natural_Vectors_io;
7: with Standard_Floating_Vectors;
8: with Standard_Floating_Vectors_io; use Standard_Floating_Vectors_io;
9: with Standard_Floating_Matrices;
10: with Standard_Floating_Matrices_io; use Standard_Floating_Matrices_io;
11: with Standard_Random_Vectors; use Standard_Random_Vectors;
12: with Standard_Random_Matrices; use Standard_Random_Matrices;
13: with Standard_Floating_QR_Decomposition; use Standard_Floating_QR_Decomposition;
14: with Standard_Floating_Least_Squares; use Standard_Floating_Least_Squares;
15: with Standard_Complex_Vectors;
16: with Standard_Complex_Vectors_io; use Standard_Complex_Vectors_io;
17: with Standard_Complex_Matrices;
18: with Standard_Complex_Matrices_io; use Standard_Complex_Matrices_io;
19: with Standard_Complex_QR_Decomposition; use Standard_Complex_QR_Decomposition;
20: with Standard_Complex_Least_Squares; use Standard_Complex_Least_Squares;
21:
22: procedure ts_qrd is
23:
24: -- DESCRIPTION :
25: -- This program tests the implementation of the QR decomposition
26: -- and least squares approximation.
27:
28: -- GENERAL TESTS ON QR DECOMPOSITION :
29:
30: function Extract_Upper_Triangular
31: ( a : Standard_Floating_Matrices.Matrix )
32: return Standard_Floating_Matrices.Matrix is
33:
34: -- DESCRIPTION :
35: -- Returns the upper triangular part of the matrix a.
36:
37: res : Standard_Floating_Matrices.Matrix(a'range(1),a'range(2));
38:
39: begin
40: for i in a'range(1) loop
41: for j in a'first(2)..(i-1) loop
42: res(i,j) := 0.0;
43: end loop;
44: for j in i..a'last(2) loop
45: res(i,j) := a(i,j);
46: end loop;
47: end loop;
48: return res;
49: end Extract_Upper_Triangular;
50:
51: function Extract_Upper_Triangular
52: ( a : Standard_Complex_Matrices.Matrix )
53: return Standard_Complex_Matrices.Matrix is
54:
55: -- DESCRIPTION :
56: -- Returns the upper triangular part of the matrix a.
57:
58: res : Standard_Complex_Matrices.Matrix(a'range(1),a'range(2));
59:
60: begin
61: for i in a'range(1) loop
62: for j in a'first(2)..(i-1) loop
63: res(i,j) := Create(0.0);
64: end loop;
65: for j in i..a'last(2) loop
66: res(i,j) := a(i,j);
67: end loop;
68: end loop;
69: return res;
70: end Extract_Upper_Triangular;
71:
72: function Differences ( a,b : in Standard_Floating_Matrices.Matrix )
73: return double_float is
74:
75: -- DESCRIPTION :
76: -- Returns the sum of the differences of all elements |a(i,j)-b(i,j)|.
77:
78: sum : double_float := 0.0;
79:
80: begin
81: for i in a'range(1) loop
82: for j in a'range(2) loop
83: sum := sum + abs(a(i,j)-b(i,j));
84: end loop;
85: end loop;
86: return sum;
87: end Differences;
88:
89: function Differences ( a,b : in Standard_Complex_Matrices.Matrix )
90: return double_float is
91:
92: -- DESCRIPTION :
93: -- Returns the sum of the differences of all elements |a(i,j)-b(i,j)|.
94:
95: sum : double_float := 0.0;
96:
97: begin
98: for i in a'range(1) loop
99: for j in a'range(2) loop
100: sum := sum + AbsVal(a(i,j)-b(i,j));
101: end loop;
102: end loop;
103: return sum;
104: end Differences;
105:
106: procedure Orthogonality ( q : in Standard_Floating_Matrices.Matrix ) is
107:
108: -- DESCRIPTION :
109: -- Tests whether the columns are orthogonal w.r.t. each other.
110:
111: sum,ip : double_float;
112:
113: begin
114: sum := 0.0;
115: for j in q'range(2) loop
116: for k in j+1..q'last(2) loop
117: ip := 0.0;
118: for i in q'range(1) loop
119: ip := ip + q(i,j)*q(i,k);
120: end loop;
121: sum := sum + abs(ip);
122: end loop;
123: end loop;
124: put("Orthogonality check : "); put(sum,3,3,3); new_line;
125: end Orthogonality;
126:
127: procedure Orthogonality ( q : in Standard_Complex_Matrices.Matrix ) is
128:
129: -- DESCRIPTION :
130: -- Tests whether the columns are orthogonal w.r.t. each other.
131:
132: sum : double_float := 0.0;
133: ip : Complex_Number;
134:
135: begin
136: for j in q'range(2) loop
137: for k in j+1..q'last(2) loop
138: ip := Create(0.0);
139: for i in q'range(1) loop
140: ip := ip + Conjugate(q(i,j))*q(i,k);
141: end loop;
142: sum := sum + AbsVal(ip);
143: end loop;
144: end loop;
145: put("Orthogonality check : "); put(sum,3,3,3); new_line;
146: end Orthogonality;
147:
148: procedure Test_QRD ( a,q,r : in Standard_Floating_Matrices.Matrix ) is
149:
150: wrk : Standard_Floating_Matrices.Matrix(a'range(1),a'range(2));
151: use Standard_Floating_Matrices;
152:
153: begin
154: put_line("The upper triangular part R :"); put(r,3);
155: wrk := q*r;
156: put_line("q*r :"); put(wrk,3);
157: put("Difference in 1-norm between the matrix and q*r: ");
158: put(Differences(a,wrk),3,3,3); new_line;
159: Orthogonality(q);
160: end Test_QRD;
161:
162: procedure Test_QRD ( a,q,r : in Standard_Complex_Matrices.Matrix ) is
163:
164: wrk : Standard_Complex_Matrices.Matrix(a'range(1),a'range(2));
165: use Standard_Complex_Matrices;
166:
167: begin
168: put_line("The upper triangular part R :"); put(r,3);
169: wrk := q*r;
170: put_line("q*r :"); put(wrk,3);
171: put("Difference in 1-norm between the matrix and q*r : ");
172: put(Differences(a,wrk),3,3,3); new_line;
173: Orthogonality(q);
174: end Test_QRD;
175:
176: -- REAL TEST DRIVERS :
177:
178: procedure Real_LS_Test ( n,m : in natural; piv : in boolean;
179: a : in Standard_Floating_Matrices.Matrix;
180: b : in Standard_Floating_Vectors.Vector ) is
181:
182: wrk : Standard_Floating_Matrices.Matrix(1..n,1..m) := a;
183: qraux : Standard_Floating_Vectors.Vector(1..m) := (1..m => 0.0);
184: jpvt : Standard_Natural_Vectors.Vector(1..m) := (1..m => 0);
185: sol : Standard_Floating_Vectors.Vector(1..m);
186: rsd,dum : Standard_Floating_Vectors.Vector(1..n);
187: info : integer;
188: use Standard_Floating_Matrices;
189: use Standard_Floating_Vectors;
190:
191: begin
192: put_line("The matrix : "); put(a,3);
193: QRD(wrk,qraux,jpvt,piv);
194: put_line("The matrix after QR : "); put(wrk,3);
195: put_line("The vector qraux : "); put(qraux,3); new_line;
196: if piv
197: then put("The vector jpvt : "); put(jpvt); new_line;
198: Permute_Columns(wrk,jpvt);
199: end if;
200: QRLS(wrk,n,n,m,qraux,b,dum,dum,sol,rsd,dum,110,info);
201: if piv
202: then Permute(sol,jpvt);
203: end if;
204: put_line("The solution : "); put(sol,3); new_line;
205: put_line("The residual : "); put(rsd,3); new_line;
206: dum := b - a*sol;
207: put_line("right-hand size - matrix*solution : "); put(dum,3); new_line;
208: end Real_LS_Test;
209:
210: procedure Real_QR_Test ( n,m : in natural; piv : in boolean;
211: a : in Standard_Floating_Matrices.Matrix ) is
212:
213: wrk : Standard_Floating_Matrices.Matrix(1..n,1..m) := a;
214: bas : Standard_Floating_Matrices.Matrix(1..n,1..n);
215: qraux : Standard_Floating_Vectors.Vector(1..m) := (1..m => 0.0);
216: jpvt : Standard_Natural_Vectors.Vector(1..m) := (1..m => 0);
217:
218: begin
219: put_line("The matrix : "); put(a,3);
220: QRD(wrk,qraux,jpvt,piv);
221: put_line("The matrix after QR : "); put(wrk,3);
222: put_line("The vector qraux : "); put(qraux,3); new_line;
223: if piv
224: then put("The vector jpvt : "); put(jpvt); new_line;
225: Permute_Columns(wrk,jpvt);
226: end if;
227: for i in wrk'range(1) loop
228: for j in wrk'range(2) loop
229: bas(i,j) := wrk(i,j);
230: end loop;
231: for j in n+1..m loop
232: bas(i,j) := 0.0;
233: end loop;
234: end loop;
235: Basis(bas,a);
236: put_line("The orthogonal part Q of QR :"); put(bas,3);
237: Test_QRD(a,bas,Extract_Upper_Triangular(wrk));
238: end Real_QR_Test;
239:
240: procedure Interactive_Real_QR_Test ( n,m : in natural; piv : in boolean ) is
241:
242: a : Standard_Floating_Matrices.Matrix(1..n,1..m);
243:
244: begin
245: put("Give a "); put(n,1); put("x"); put(m,1);
246: put_line(" matrix : "); get(a);
247: Real_QR_Test(n,m,piv,a);
248: end Interactive_Real_QR_Test;
249:
250: procedure Interactive_Real_LS_Test ( n,m : in natural; piv : in boolean ) is
251:
252: a : Standard_Floating_Matrices.Matrix(1..n,1..m);
253: b : Standard_Floating_Vectors.Vector(1..n);
254:
255: begin
256: put("Give a "); put(n,1); put("x"); put(m,1);
257: put_line(" matrix : "); get(a);
258: put("Give right-hand size "); put(n,1);
259: put_line("-vector : "); get(b);
260: Real_LS_Test(n,m,piv,a,b);
261: end Interactive_Real_LS_Test;
262:
263: procedure Random_Real_QR_Test ( n,m : in natural; piv : in boolean ) is
264:
265: a : Standard_Floating_Matrices.Matrix(1..n,1..m) := Random_Matrix(n,m);
266:
267: begin
268: Real_QR_Test(n,m,piv,a);
269: end Random_Real_QR_Test;
270:
271: procedure Random_Real_LS_Test ( n,m : in natural; piv : in boolean ) is
272:
273: a : Standard_Floating_Matrices.Matrix(1..n,1..m) := Random_Matrix(n,m);
274: b : Standard_Floating_Vectors.Vector(1..n) := Random_Vector(n);
275:
276: begin
277: Real_LS_Test(n,m,piv,a,b);
278: end Random_Real_LS_Test;
279:
280: -- COMPLEX TEST DRIVERS :
281:
282: procedure Complex_QR_Test ( n,m : in natural; piv : in boolean;
283: a : Standard_Complex_Matrices.Matrix ) is
284:
285: wrk : Standard_Complex_Matrices.Matrix(1..n,1..m) := a;
286: bas : Standard_Complex_Matrices.Matrix(1..n,1..n);
287: qraux : Standard_Complex_Vectors.Vector(1..m) := (1..m => Create(0.0));
288: jpvt : Standard_Natural_Vectors.Vector(1..m) := (1..m => 0);
289:
290: begin
291: put_line("The matrix : "); put(a,3);
292: QRD(wrk,qraux,jpvt,piv);
293: put_line("The matrix after QR : "); put(wrk,3);
294: put_line("The vector qraux : "); put(qraux,3); new_line;
295: -- put("The vector jpvt : "); put(jpvt); new_line;
296: if not piv
297: then for i in wrk'range(1) loop
298: for j in wrk'range(2) loop
299: bas(i,j) := wrk(i,j);
300: end loop;
301: for j in n+1..m loop
302: bas(i,j) := Create(0.0);
303: end loop;
304: end loop;
305: Basis(bas,a);
306: put_line("The orthogonal part Q of QR :"); put(bas,3);
307: Test_QRD(a,bas,Extract_Upper_Triangular(wrk));
308: end if;
309: end Complex_QR_Test;
310:
311: procedure Complex_LS_Test ( n,m : in natural; piv : in boolean;
312: a : Standard_Complex_Matrices.Matrix;
313: b : Standard_Complex_Vectors.Vector ) is
314:
315: wrk : Standard_Complex_Matrices.Matrix(1..n,1..m) := a;
316: qraux : Standard_Complex_Vectors.Vector(1..m) := (1..m => Create(0.0));
317: jpvt : Standard_Natural_Vectors.Vector(1..m) := (1..m => 0);
318: sol : Standard_Complex_Vectors.Vector(1..m);
319: rsd,dum : Standard_Complex_Vectors.Vector(1..n);
320: info : integer;
321: use Standard_Complex_Matrices;
322: use Standard_Complex_Vectors;
323:
324: begin
325: put_line("The matrix : "); put(a,3);
326: QRD(wrk,qraux,jpvt,piv);
327: put_line("The matrix after QR : "); put(wrk,3);
328: put_line("The vector qraux : "); put(qraux,3); new_line;
329: -- put("The vector jpvt : "); put(jpvt); new_line;
330: QRLS(wrk,n,n,m,qraux,b,dum,dum,sol,rsd,dum,110,info);
331: put_line("The solution : "); put(sol,3); new_line;
332: put_line("The residual : "); put(rsd,3); new_line;
333: dum := b - a*sol;
334: put_line("right-hand size - matrix*solution : "); put(dum,3); new_line;
335: end Complex_LS_Test;
336:
337: procedure Interactive_Complex_QR_Test
338: ( n,m : in natural; piv : in boolean ) is
339:
340: a : Standard_Complex_Matrices.Matrix(1..n,1..m);
341:
342: begin
343: put("Give a "); put(n,1); put("x"); put(m,1);
344: put_line(" matrix : "); get(a);
345: Complex_QR_Test(n,m,piv,a);
346: end Interactive_Complex_QR_Test;
347:
348: procedure Interactive_Complex_LS_Test
349: ( n,m : in natural; piv : in boolean ) is
350:
351: a : Standard_Complex_Matrices.Matrix(1..n,1..m);
352: b : Standard_Complex_Vectors.Vector(1..n);
353:
354: begin
355: put("Give a "); put(n,1); put("x"); put(m,1);
356: put_line(" matrix : "); get(a);
357: put("Give right-hand size "); put(n,1);
358: put_line("-vector : "); get(b);
359: Complex_LS_Test(n,m,piv,a,b);
360: end Interactive_Complex_LS_Test;
361:
362: procedure Random_Complex_QR_Test ( n,m : in natural; piv : in boolean ) is
363:
364: a : Standard_Complex_Matrices.Matrix(1..n,1..m) := Random_Matrix(n,m);
365:
366: begin
367: Complex_QR_Test(n,m,piv,a);
368: end Random_Complex_QR_Test;
369:
370: procedure Random_Complex_LS_Test ( n,m : in natural; piv : in boolean ) is
371:
372: a : Standard_Complex_Matrices.Matrix(1..n,1..m) := Random_Matrix(n,m);
373: b : Standard_Complex_Vectors.Vector(1..n) := Random_Vector(n);
374:
375: begin
376: Complex_LS_Test(n,m,piv,a,b);
377: end Random_Complex_LS_Test;
378:
379: -- MAIN PROGRAM :
380:
381: procedure Main is
382:
383: n,m : natural;
384: ans,choice : character;
385: piv : boolean := false;
386:
387: begin
388: new_line;
389: put_line("Test on the QR decomposition and Least Squares.");
390: loop
391: new_line;
392: put_line("Choose one of the following : ");
393: put_line(" 0. Exit this program.");
394: put_line(" 1. QR-decomposition on user-given floating-point matrix.");
395: put_line(" 2. complex matrix.");
396: put_line(" 3. on random floating-point matrix.");
397: put_line(" 4. complex matrix.");
398: put_line(" 5. Least Squares on user-given floating-point matrix.");
399: put_line(" 6. complex matrix.");
400: put_line(" 7. on random floating-point matrix.");
401: put_line(" 8. complex matrix.");
402: put("Make your choice (0,1,2,3,4,5,6,7 or 8) : "); get(choice);
403: exit when (choice = '0');
404: put("Give the number of rows : "); get(n);
405: put("Give the number of columns : "); get(m);
406: put("Do you want pivoting ? (y/n) "); get(ans);
407: piv := (ans = 'y');
408: case choice is
409: when '1' => Interactive_Real_QR_Test(n,m,piv);
410: when '2' => Interactive_Complex_QR_Test(n,m,piv);
411: when '3' => Random_Real_QR_Test(n,m,piv);
412: when '4' => Random_Complex_QR_Test(n,m,piv);
413: when '5' => Interactive_Real_LS_Test(n,m,piv);
414: when '6' => Interactive_Complex_LS_Test(n,m,piv);
415: when '7' => Random_Real_LS_Test(n,m,piv);
416: when '8' => Random_Complex_LS_Test(n,m,piv);
417: when others => null;
418: end case;
419: end loop;
420: end Main;
421:
422: begin
423: Main;
424: end ts_qrd;
FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>