Work on MATRIX and MCONVERT commands.
[pspp] / tests / language / stats / matrix.at
1 AT_BANNER([MATRIX])
2
3 AT_SETUP([MATRIX - empty matrices])
4 AT_DATA([matrix.sps], [dnl
5 MATRIX.
6 COMPUTE a={}.
7 PRINT a.
8 COMPUTE b={a; 1; 2; 3}.
9 PRINT b.
10 COMPUTE c={a, 1, 2, 3}.
11 PRINT c.
12 END MATRIX.
13 ])
14 AT_CHECK([pspp matrix.sps], [0], [dnl
15 a
16
17 b
18   1
19   2
20   3
21
22 c
23   1  2  3
24 ])
25 AT_CLEANUP
26
27 AT_SETUP([MATRIX - submatrices as rvalues - all columns or all rows])
28 AT_DATA([matrix.sps], [dnl
29 MATRIX.
30 PRINT {1, 2, 3; 4, 5, 6; 7, 8, 9}(1, :).
31 PRINT {1, 2, 3; 4, 5, 6; 7, 8, 9}({1}, :).
32 PRINT {1, 2, 3; 4, 5, 6; 7, 8, 9}({1, 2}, :).
33 PRINT {1, 2, 3; 4, 5, 6; 7, 8, 9}({1, 2, 3}, :).
34 PRINT {1, 2, 3; 4, 5, 6; 7, 8, 9}({1; 3; 2}, :).
35 PRINT {1, 2, 3; 4, 5, 6; 7, 8, 9}({1, 3, 3}, :).
36 PRINT {1, 2, 3; 4, 5, 6; 7, 8, 9}(1:2, :).
37 PRINT {1, 2, 3; 4, 5, 6; 7, 8, 9}(1:3, :).
38 PRINT {1, 2, 3; 4, 5, 6; 7, 8, 9}({}, :).
39
40 PRINT {1, 2, 3; 4, 5, 6; 7, 8, 9}(:, 1).
41 PRINT {1, 2, 3; 4, 5, 6; 7, 8, 9}(:, {1}).
42 PRINT {1, 2, 3; 4, 5, 6; 7, 8, 9}(:, {1, 2}).
43 PRINT {1, 2, 3; 4, 5, 6; 7, 8, 9}(:, {1, 2, 3}).
44 PRINT {1, 2, 3; 4, 5, 6; 7, 8, 9}(:, {1; 3; 2}).
45 PRINT {1, 2, 3; 4, 5, 6; 7, 8, 9}(:, {1, 3, 3}).
46 PRINT {1, 2, 3; 4, 5, 6; 7, 8, 9}(:, 1:2).
47 PRINT {1, 2, 3; 4, 5, 6; 7, 8, 9}(:, 1:3).
48 PRINT {1, 2, 3; 4, 5, 6; 7, 8, 9}(:, {}).
49
50 PRINT {1, 2, 3; 4, 5, 6; 7, 8, 9}(:, :).
51
52 PRINT {1, 2, 3; 4, 5, 6; 7, 8, 9}(0, :).
53 PRINT {1, 2, 3; 4, 5, 6; 7, 8, 9}(:, 0).
54 PRINT {1, 2, 3; 4, 5, 6; 7, 8, 9}(4, :).
55 PRINT {1, 2, 3; 4, 5, 6; 7, 8, 9}(:, 4).
56
57 PRINT {}(:,{}).
58 PRINT {}({},:).
59 PRINT {}({},{}).
60
61 PRINT {1, 2, 3, 4}({1, 2; 3, 4}, :).
62 PRINT {1, 2, 3, 4}(:, {1, 2; 3, 4}).
63 END MATRIX.
64 ])
65 AT_CHECK([pspp matrix.sps], [1], [dnl
66 {1, 2, 3; 4, 5, 6; 7, 8, 9}(1, :)
67   1  2  3
68
69 {1, 2, 3; 4, 5, 6; 7, 8, 9}({1}, :)
70   1  2  3
71
72 {1, 2, 3; 4, 5, 6; 7, 8, 9}({1, 2}, :)
73   1  2  3
74   4  5  6
75
76 {1, 2, 3; 4, 5, 6; 7, 8, 9}({1, 2, 3}, :)
77   1  2  3
78   4  5  6
79   7  8  9
80
81 {1, 2, 3; 4, 5, 6; 7, 8, 9}({1; 3; 2}, :)
82   1  2  3
83   7  8  9
84   4  5  6
85
86 {1, 2, 3; 4, 5, 6; 7, 8, 9}({1, 3, 3}, :)
87   1  2  3
88   7  8  9
89   7  8  9
90
91 {1, 2, 3; 4, 5, 6; 7, 8, 9}(1:2, :)
92   1  2  3
93   4  5  6
94
95 {1, 2, 3; 4, 5, 6; 7, 8, 9}(1:3, :)
96   1  2  3
97   4  5  6
98   7  8  9
99
100 {1, 2, 3; 4, 5, 6; 7, 8, 9}({}, :)
101
102 {1, 2, 3; 4, 5, 6; 7, 8, 9}(:, 1)
103   1
104   4
105   7
106
107 {1, 2, 3; 4, 5, 6; 7, 8, 9}(:, {1})
108   1
109   4
110   7
111
112 {1, 2, 3; 4, 5, 6; 7, 8, 9}(:, {1, 2})
113   1  2
114   4  5
115   7  8
116
117 {1, 2, 3; 4, 5, 6; 7, 8, 9}(:, {1, 2, 3})
118   1  2  3
119   4  5  6
120   7  8  9
121
122 {1, 2, 3; 4, 5, 6; 7, 8, 9}(:, {1; 3; 2})
123   1  3  2
124   4  6  5
125   7  9  8
126
127 {1, 2, 3; 4, 5, 6; 7, 8, 9}(:, {1, 3, 3})
128   1  3  3
129   4  6  6
130   7  9  9
131
132 {1, 2, 3; 4, 5, 6; 7, 8, 9}(:, 1:2)
133   1  2
134   4  5
135   7  8
136
137 {1, 2, 3; 4, 5, 6; 7, 8, 9}(:, 1:3)
138   1  2  3
139   4  5  6
140   7  8  9
141
142 {1, 2, 3; 4, 5, 6; 7, 8, 9}(:, {})
143
144
145
146 {1, 2, 3; 4, 5, 6; 7, 8, 9}(:, :)
147   1  2  3
148   4  5  6
149   7  8  9
150
151 matrix.sps:24: error: MATRIX: 0 is not a valid row index for a matrix with
152 dimensions (3,3).
153
154 matrix.sps:25: error: MATRIX: 0 is not a valid column index for a matrix with
155 dimensions (3,3).
156
157 matrix.sps:26: error: MATRIX: 4 is not a valid row index for a matrix with
158 dimensions (3,3).
159
160 matrix.sps:27: error: MATRIX: 4 is not a valid column index for a matrix with
161 dimensions (3,3).
162
163 {}(:,{})
164
165 {}({},:)
166
167 {}({},{})
168
169 matrix.sps:33: error: MATRIX: Matrix row index must be scalar or vector, not a
170 matrix with dimensions (2,2).
171
172 matrix.sps:34: error: MATRIX: Matrix column index must be scalar or vector, not
173 a matrix with dimensions (2,2).
174 ])
175 AT_CLEANUP
176
177 AT_SETUP([MATRIX - COMPUTE submatrices as lvalues])
178 AT_DATA([matrix.sps], [dnl
179 MATRIX.
180 COMPUTE y={1, 2, 3; 4, 5, 6; 7, 8, 9}.
181
182 COMPUTE x1=y.
183 COMPUTE x1(1, :) = {11, 12, 13}.
184 PRINT x1.
185
186 COMPUTE x2=y.
187 COMPUTE x2(2, :) = {14, 15, 16}.
188 PRINT x2.
189
190 COMPUTE x3=y.
191 COMPUTE x3(3, :) = {17, 18, 19}.
192 PRINT x3.
193
194 COMPUTE x4=y.
195 COMPUTE x4(:, 1) = {11; 14; 17}.
196 PRINT x4.
197
198 COMPUTE x5=y.
199 COMPUTE x5(:, 2) = {12; 15; 18}.
200 PRINT x5.
201
202 COMPUTE x6=y.
203 COMPUTE x6(:, 3) = {13; 16; 19}.
204 PRINT x6.
205
206 COMPUTE x7=y.
207 COMPUTE x7(1, 1) = 11.
208 PRINT x7.
209
210 COMPUTE x8=y.
211 COMPUTE x8(1:2, 2:3) = {12, 13; 15, 16}.
212 PRINT x8.
213
214 COMPUTE x9=y.
215 COMPUTE x9({3, 1}, {2; 3}) = {18, 19; 12, 13}.
216 PRINT x9.
217 END MATRIX.
218 ])
219 AT_CHECK([pspp matrix.sps], [0], [dnl
220 x1
221   11  12  13
222    4   5   6
223    7   8   9
224
225 x2
226    1   2   3
227   14  15  16
228    7   8   9
229
230 x3
231    1   2   3
232    4   5   6
233   17  18  19
234
235 x4
236   11   2   3
237   14   5   6
238   17   8   9
239
240 x5
241    1  12   3
242    4  15   6
243    7  18   9
244
245 x6
246    1   2  13
247    4   5  16
248    7   8  19
249
250 x7
251   11   2   3
252    4   5   6
253    7   8   9
254
255 x8
256    1  12  13
257    4  15  16
258    7   8   9
259
260 x9
261    1  12  13
262    4   5   6
263    7  18  19
264 ])
265 AT_CLEANUP
266
267 AT_SETUP([MATRIX - COMPUTE submatrices as lvalues - negative])
268 AT_DATA([matrix.sps], [dnl
269 MATRIX.
270 COMPUTE x={1, 2, 3; 4, 5, 6; 7, 8, 9}.
271 COMPUTE x(1, :) = {}.
272 COMPUTE x(1, :) = 15.
273 COMPUTE x(1, :) = {11, 12}.
274 COMPUTE x(1, :) = {11, 12, 13, 14}.
275 COMPUTE x(:, 1) = {}.
276 COMPUTE x(:, 1) = 15.
277 COMPUTE x(:, 1) = {11, 12}.
278 COMPUTE x(:, 1) = {11, 12, 13, 14}.
279 COMPUTE x(:) = 1.
280 COMPUTE x(0, 1) = 1.
281 COMPUTE x(1, 0) = 1.
282 COMPUTE x({1, 0, 2}, 1) = {1; 2; 3}.
283 COMPUTE x(4, 3) = 1.
284 COMPUTE x(3, 4) = 1.
285 COMPUTE x({1, 2; 3, 4}, 5) = 1.
286 COMPUTE x(3, {1, 2; 3, 4}) = 1.
287 PRINT x.
288 END MATRIX.
289 ])
290 AT_CHECK([pspp matrix.sps], [1], [dnl
291 matrix.sps:3: error: MATRIX: Row index vector for assignment to x has 1
292 elements but source matrix has 0 rows.
293
294 matrix.sps:4: error: MATRIX: Column index vector for assignment to x has 3
295 elements but source matrix has 1 columns.
296
297 matrix.sps:5: error: MATRIX: Column index vector for assignment to x has 3
298 elements but source matrix has 2 columns.
299
300 matrix.sps:6: error: MATRIX: Column index vector for assignment to x has 3
301 elements but source matrix has 4 columns.
302
303 matrix.sps:7: error: MATRIX: Row index vector for assignment to x has 3
304 elements but source matrix has 0 rows.
305
306 matrix.sps:8: error: MATRIX: Row index vector for assignment to x has 3
307 elements but source matrix has 1 rows.
308
309 matrix.sps:9: error: MATRIX: Row index vector for assignment to x has 3
310 elements but source matrix has 1 rows.
311
312 matrix.sps:10: error: MATRIX: Row index vector for assignment to x has 3
313 elements but source matrix has 1 rows.
314
315 matrix.sps:11: error: MATRIX: Can't use vector indexing on matrix x with
316 dimensions (3,3).
317
318 matrix.sps:12: error: MATRIX: 0 is not a valid row index for a matrix with
319 dimensions (3,3).
320
321 matrix.sps:13: error: MATRIX: 0 is not a valid column index for a matrix with
322 dimensions (3,3).
323
324 matrix.sps:14: error: MATRIX: 0 is not a valid row index for a matrix with
325 dimensions (3,3).
326
327 matrix.sps:15: error: MATRIX: 4 is not a valid row index for a matrix with
328 dimensions (3,3).
329
330 matrix.sps:16: error: MATRIX: 4 is not a valid column index for a matrix with
331 dimensions (3,3).
332
333 matrix.sps:17: error: MATRIX: Matrix row index must be scalar or vector, not a
334 matrix with dimensions (2,2).
335
336 matrix.sps:18: error: MATRIX: Matrix column index must be scalar or vector, not
337 a matrix with dimensions (2,2).
338  
339 x
340   1  2  3
341   4  5  6
342   7  8  9
343 ])
344 AT_CLEANUP
345
346 AT_SETUP([MATRIX - subvectors as rvalues])
347 AT_DATA([matrix.sps], [dnl
348 MATRIX.
349 PRINT {10, 20, 30}({}).
350 PRINT {10, 20, 30}(2).
351 PRINT {10, 20, 30}({2}).
352 PRINT {10, 20, 30}({1,3}).
353 PRINT {10, 20, 30}({2,3}).
354 PRINT {10, 20, 30}({1;3}).
355 PRINT {10, 20, 30}({2;3}).
356 PRINT {10, 20, 30}(2:3).
357 PRINT {10, 20, 30}(:).
358
359 PRINT {10; 20; 30}({}).
360 PRINT {10; 20; 30}(2).
361 PRINT {10; 20; 30}({2}).
362 PRINT {10; 20; 30}({1,3}).
363 PRINT {10; 20; 30}({2,3}).
364 PRINT {10; 20; 30}({1;3}).
365 PRINT {10; 20; 30}({2;3}).
366 PRINT {10; 20; 30}(2:3).
367 PRINT {10; 20; 30}(:).
368
369 PRINT {}({}).
370
371 PRINT {1, 2; 3, 4}(:).
372 PRINT {1, 2, 3, 4}({1, 2; 3, 4}).
373 PRINT {1, 2, 3, 4}(0).
374 PRINT {1, 2, 3, 4}(5).
375 END MATRIX.
376 ])
377 AT_CHECK([pspp matrix.sps], [1], [dnl
378 {10, 20, 30}({})
379
380 {10, 20, 30}(2)
381   20
382
383 {10, 20, 30}({2})
384   20
385
386 {10, 20, 30}({1,3})
387   10  30
388
389 {10, 20, 30}({2,3})
390   20  30
391
392 {10, 20, 30}({1;3})
393   10  30
394
395 {10, 20, 30}({2;3})
396   20  30
397
398 {10, 20, 30}(2:3)
399   20  30
400
401 {10, 20, 30}(:)
402   10  20  30
403
404 {10; 20; 30}({})
405
406 {10; 20; 30}(2)
407   20
408
409 {10; 20; 30}({2})
410   20
411
412 {10; 20; 30}({1,3})
413   10
414   30
415
416 {10; 20; 30}({2,3})
417   20
418   30
419
420 {10; 20; 30}({1;3})
421   10
422   30
423
424 {10; 20; 30}({2;3})
425   20
426   30
427
428 {10; 20; 30}(2:3)
429   20
430   30
431
432 {10; 20; 30}(:)
433   10
434   20
435   30
436
437 {}({})
438
439 matrix.sps:24: error: MATRIX: Vector index operator must be applied to vector,
440 not a matrix with dimensions (2,2).
441
442 matrix.sps:25: error: MATRIX: Vector index must be scalar or vector, not a
443 matrix with dimensions (2,2).
444
445 matrix.sps:26: error: MATRIX: Index 0 is out of range for vector with 4
446 elements.
447
448 matrix.sps:27: error: MATRIX: Index 5 is out of range for vector with 4
449 elements.
450 ])
451 AT_CLEANUP
452
453 AT_SETUP([MATRIX - COMPUTE subvectors as lvalues])
454 AT_DATA([matrix.sps], [dnl
455 MATRIX.
456 COMPUTE r={1, 2, 3, 4, 5, 6, 7, 8, 9}.
457
458 COMPUTE r1=r.
459 COMPUTE r1(:) = {11, 12, 13, 14, 15, 16, 17, 18, 19}.
460 PRINT r1.
461
462 COMPUTE r2=r.
463 COMPUTE r2(:) = {11; 12; 13; 14; 15; 16; 17; 18; 19}.
464 PRINT r2.
465
466 COMPUTE r3=r.
467 COMPUTE r3(1) = 11.
468 PRINT r3.
469
470 COMPUTE r4=r.
471 COMPUTE r4(1:2) = {11:12}.
472 PRINT r4.
473
474 COMPUTE r5=r.
475 COMPUTE r5({8;9}) = {18:19}.
476 PRINT r5.
477
478 COMPUTE c={1, 2, 3, 4, 5, 6, 7, 8, 9}.
479
480 COMPUTE c1=c.
481 COMPUTE c1(:) = {11, 12, 13, 14, 15, 16, 17, 18, 19}.
482 PRINT c1.
483
484 COMPUTE c2=c.
485 COMPUTE c2(:) = {11; 12; 13; 14; 15; 16; 17; 18; 19}.
486 PRINT c2.
487
488 COMPUTE c3=c.
489 COMPUTE c3(1) = 11.
490 PRINT c3.
491
492 COMPUTE c4=c.
493 COMPUTE c4(1:2) = {11:12}.
494 PRINT c4.
495
496 COMPUTE c5=c.
497 COMPUTE c5(8:9) = {18:19}.
498 PRINT c5.
499 END MATRIX.
500 ])
501 AT_CHECK([pspp matrix.sps], [0], [dnl
502 r1
503   11  12  13  14  15  16  17  18  19
504
505 r2
506   11  12  13  14  15  16  17  18  19
507
508 r3
509   11   2   3   4   5   6   7   8   9
510
511 r4
512   11  12   3   4   5   6   7   8   9
513
514 r5
515    1   2   3   4   5   6   7  18  19
516
517 c1
518   11  12  13  14  15  16  17  18  19
519
520 c2
521   11  12  13  14  15  16  17  18  19
522
523 c3
524   11   2   3   4   5   6   7   8   9
525
526 c4
527   11  12   3   4   5   6   7   8   9
528
529 c5
530    1   2   3   4   5   6   7  18  19
531 ])
532 AT_CLEANUP
533
534 AT_SETUP([MATRIX - COMPUTE subvectors as lvalues - negative])
535 AT_DATA([matrix.sps], [dnl
536 MATRIX.
537 COMPUTE r={1, 2, 3, 4, 5, 6, 7, 8, 9}.
538 COMPUTE r(1:3) = {1, 2; 3, 4}.
539 COMPUTE r(1:3) = {}.
540 COMPUTE r(1:3) = {1}.
541 COMPUTE r(1:3) = {1, 2}.
542 COMPUTE r(1:3) = {1, 2, 3, 4}.
543 COMPUTE r(1:3) = {}.
544 COMPUTE r(1:3) = {1}.
545 COMPUTE r(1:3) = {1; 2}.
546 COMPUTE r(1:3) = {1; 2; 3; 4}.
547 COMPUTE r(:) = {1; 2; 3; 4}.
548 COMPUTE r(0) = 5.
549 COMPUTE r(10) = 5.
550 COMPUTE r({1, 2; 3, 4}) = 1.
551
552 COMPUTE c={1, 2, 3, 4, 5, 6, 7, 8, 9}.
553 COMPUTE c(1:3) = {1, 2; 3, 4}.
554 COMPUTE c(1:3) = {}.
555 COMPUTE c(1:3) = {1}.
556 COMPUTE c(1:3) = {1, 2}.
557 COMPUTE c(1:3) = {1, 2, 3, 4}.
558 COMPUTE c(1:3) = {}.
559 COMPUTE c(1:3) = {1}.
560 COMPUTE c(1:3) = {1; 2}.
561 COMPUTE c(1:3) = {1; 2; 3; 4}.
562 COMPUTE c(:) = {1; 2; 3; 4}.
563 COMPUTE c(0) = 5.
564 COMPUTE c(10) = 5.
565 COMPUTE c({1, 2; 3, 4}) = 1.
566
567 COMPUTE m = {1, 2; 3, 4}.
568 COMPUTE m(5) = 1.
569 COMPUTE m(:) = 1.
570 END MATRIX.
571 ])
572 AT_CHECK([pspp matrix.sps], [1], [dnl
573 matrix.sps:3: error: MATRIX: Can't assign matrix with dimensions (2,2) to
574 subvector.
575
576 matrix.sps:4: error: MATRIX: Can't assign vector with 0 elements to subvector
577 with 3.
578
579 matrix.sps:5: error: MATRIX: Can't assign vector with 1 elements to subvector
580 with 3.
581
582 matrix.sps:6: error: MATRIX: Can't assign vector with 2 elements to subvector
583 with 3.
584
585 matrix.sps:7: error: MATRIX: Can't assign vector with 4 elements to subvector
586 with 3.
587
588 matrix.sps:8: error: MATRIX: Can't assign vector with 0 elements to subvector
589 with 3.
590
591 matrix.sps:9: error: MATRIX: Can't assign vector with 1 elements to subvector
592 with 3.
593
594 matrix.sps:10: error: MATRIX: Can't assign vector with 2 elements to subvector
595 with 3.
596
597 matrix.sps:11: error: MATRIX: Can't assign vector with 4 elements to subvector
598 with 3.
599
600 matrix.sps:12: error: MATRIX: Can't assign vector with 4 elements to subvector
601 with 9.
602
603 matrix.sps:13: error: MATRIX: Index 0 is out of range for vector with 9
604 elements.
605
606 matrix.sps:14: error: MATRIX: Index 10 is out of range for vector with 9
607 elements.
608
609 matrix.sps:15: error: MATRIX: Vector index must be scalar or vector, not a
610 matrix with dimensions (2,2).
611
612 matrix.sps:18: error: MATRIX: Can't assign matrix with dimensions (2,2) to
613 subvector.
614
615 matrix.sps:19: error: MATRIX: Can't assign vector with 0 elements to subvector
616 with 3.
617
618 matrix.sps:20: error: MATRIX: Can't assign vector with 1 elements to subvector
619 with 3.
620
621 matrix.sps:21: error: MATRIX: Can't assign vector with 2 elements to subvector
622 with 3.
623
624 matrix.sps:22: error: MATRIX: Can't assign vector with 4 elements to subvector
625 with 3.
626
627 matrix.sps:23: error: MATRIX: Can't assign vector with 0 elements to subvector
628 with 3.
629
630 matrix.sps:24: error: MATRIX: Can't assign vector with 1 elements to subvector
631 with 3.
632
633 matrix.sps:25: error: MATRIX: Can't assign vector with 2 elements to subvector
634 with 3.
635
636 matrix.sps:26: error: MATRIX: Can't assign vector with 4 elements to subvector
637 with 3.
638
639 matrix.sps:27: error: MATRIX: Can't assign vector with 4 elements to subvector
640 with 9.
641
642 matrix.sps:28: error: MATRIX: Index 0 is out of range for vector with 9
643 elements.
644
645 matrix.sps:29: error: MATRIX: Index 10 is out of range for vector with 9
646 elements.
647
648 matrix.sps:30: error: MATRIX: Vector index must be scalar or vector, not a
649 matrix with dimensions (2,2).
650
651 matrix.sps:33: error: MATRIX: Can't use vector indexing on matrix m with
652 dimensions (2,2).
653
654 matrix.sps:34: error: MATRIX: Can't use vector indexing on matrix m with
655 dimensions (2,2).
656 ])
657 AT_CLEANUP
658
659 AT_SETUP([MATRIX - COMPUTE - negative])
660 AT_DATA([matrix.sps], [dnl
661 MATRIX.
662 COMPUTE x.
663 COMPUTE x=.
664 COMPUTE x(5)=1.
665 COMPUTE y(5)=1.
666 END MATRIX.
667 ])
668 AT_CHECK([pspp matrix.sps], [1], [dnl
669 matrix.sps:2.10: error: COMPUTE: Syntax error at end of command: expecting `='.
670
671 matrix.sps:3.11: error: COMPUTE: Syntax error at end of command.
672
673 matrix.sps:4: error: MATRIX: Undefined variable x.
674
675 matrix.sps:5: error: COMPUTE: Undefined variable y.
676 ])
677 AT_CLEANUP
678
679 AT_SETUP([MATRIX - elementwise arithmetic operators])
680 AT_DATA([matrix.sps], [dnl
681 MATRIX.
682 PRINT (-(5)).
683 PRINT (-{1,2;3,4}).
684
685 PRINT ({1,2;3,4} + {5,6;7,8}).
686 PRINT ({1,2;3,4} + 5).
687 PRINT (5 + {5,6;7,8}).
688 PRINT ({1,2;3,4} + {5,6}).
689
690 PRINT ({1,2;3,4} - {5,6;7,8}).
691 PRINT ({1,2;3,4} - 5).
692 PRINT (5 - {5,6;7,8}).
693 PRINT ({1,2;3,4} - {5,6}).
694
695 PRINT ({1,2;3,4} * 5).
696 PRINT (5 * {5,6;7,8}).
697
698 PRINT ({2,4;6,8} / 2).
699 PRINT (12 / {1,2;3,4}).
700 PRINT ({2,8;18,32} / {1,2;3,4}).
701
702 PRINT ({1,2;3,4} &* {5,6;7,8}).
703 PRINT ({1,2;3,4} &* 5).
704 PRINT (5 &* {5,6;7,8}).
705 PRINT ({1,2;3,4} &* {5,6}).
706
707 PRINT ({2,4;6,8} &/ 2).
708 PRINT (12 &/ {1,2;3,4}).
709 PRINT ({2,8;18,32} &/ {1,2;3,4}).
710
711 PRINT ({1,2;3,4} &** 2).
712 PRINT (2 &** {1,2;3,4}).
713 PRINT ({1,2;3,4} &** {2,3;4,5}).
714 PRINT ({1,2;3,4} &** {5,6}).
715 END MATRIX.
716 ])
717 AT_CHECK([pspp matrix.sps], [1], [dnl
718 (-(5))
719  -5
720
721 (-{1,2;3,4})
722  -1 -2
723  -3 -4
724
725 ({1,2;3,4} + {5,6;7,8})
726    6   8
727   10  12
728
729 ({1,2;3,4} + 5)
730   6  7
731   8  9
732
733 (5 + {5,6;7,8})
734   10  11
735   12  13
736
737 matrix.sps:8: error: MATRIX: Operands to + must have the same dimensions or one
738 must be a scalar, not matrices with dimensions (2,2) and (1,2).
739
740 ({1,2;3,4} - {5,6;7,8})
741  -4 -4
742  -4 -4
743
744 ({1,2;3,4} - 5)
745  -4 -3
746  -2 -1
747
748 (5 - {5,6;7,8})
749   0 -1
750  -2 -3
751
752 matrix.sps:13: error: MATRIX: Operands to - must have the same dimensions or
753 one must be a scalar, not matrices with dimensions (2,2) and (1,2).
754
755 ({1,2;3,4} * 5)
756    5  10
757   15  20
758
759 (5 * {5,6;7,8})
760   25  30
761   35  40
762
763 ({2,4;6,8} / 2)
764   1  2
765   3  4
766
767 (12 / {1,2;3,4})
768   12   6
769    4   3
770
771 ({2,8;18,32} / {1,2;3,4})
772   2  4
773   6  8
774
775 ({1,2;3,4} &* {5,6;7,8})
776    5  12
777   21  32
778
779 ({1,2;3,4} &* 5)
780    5  10
781   15  20
782
783 (5 &* {5,6;7,8})
784   25  30
785   35  40
786
787 matrix.sps:25: error: MATRIX: Operands to &* must have the same dimensions or
788 one must be a scalar, not matrices with dimensions (2,2) and (1,2).
789
790 ({2,4;6,8} &/ 2)
791   1  2
792   3  4
793
794 (12 &/ {1,2;3,4})
795   12   6
796    4   3
797
798 ({2,8;18,32} &/ {1,2;3,4})
799   2  4
800   6  8
801
802 ({1,2;3,4} &** 2)
803    1   4
804    9  16
805
806 (2 &** {1,2;3,4})
807    2   4
808    8  16
809
810 ({1,2;3,4} &** {2,3;4,5})
811      1     8
812     81  1024
813
814 matrix.sps:34: error: MATRIX: Operands to &** must have the same dimensions or
815 one must be a scalar, not matrices with dimensions (2,2) and (1,2).
816 ])
817 AT_CLEANUP
818
819 AT_SETUP([MATRIX - relational operators])
820 AT_DATA([matrix.sps], [dnl
821 MATRIX.
822 PRINT ({1, 1; 2, 2} > {1, 2; 1, 2}).
823 PRINT ({1, 1; 2, 2} > 1).
824 PRINT (2 > {1, 2; 1, 2}).
825 PRINT ({1, 2} > {1; 2}).
826
827 PRINT ({1, 1; 2, 2} < {1, 2; 1, 2}).
828 PRINT ({1, 1; 2, 2} < 2).
829 PRINT (1 < {1, 2; 1, 2}).
830 PRINT ({1, 2} < {1; 2}).
831
832 PRINT ({1, 1; 2, 2} <> {1, 2; 1, 2}).
833 PRINT ({1, 1; 2, 2} <> 2).
834 PRINT (1 <> {1, 2; 1, 2}).
835 PRINT ({1, 2} <> {1; 2}).
836
837 PRINT ({1, 1; 2, 2} >= {1, 2; 1, 2}).
838 PRINT ({1, 1; 2, 2} >= 2).
839 PRINT (1 >= {1, 2; 1, 2}).
840 PRINT ({1, 2} >= {1; 2}).
841
842 PRINT ({1, 1; 2, 2} <= {1, 2; 1, 2}).
843 PRINT ({1, 1; 2, 2} <= 2).
844 PRINT (1 <= {1, 2; 1, 2}).
845 PRINT ({1, 2} <= {1; 2}).
846
847 PRINT ({1, 1; 2, 2} = {1, 2; 1, 2}).
848 PRINT ({1, 1; 2, 2} = 2).
849 PRINT (1 = {1, 2; 1, 2}).
850 PRINT ({1, 2} = {1; 2}).
851 END MATRIX.
852 ])
853 AT_CHECK([pspp matrix.sps], [1], [dnl
854 ({1, 1; 2, 2} > {1, 2; 1, 2})
855   0  0
856   1  0
857
858 ({1, 1; 2, 2} > 1)
859   0  0
860   1  1
861
862 (2 > {1, 2; 1, 2})
863   1  0
864   1  0
865
866 matrix.sps:5: error: MATRIX: Operands to > must have the same dimensions or one
867 must be a scalar, not matrices with dimensions (1,2) and (2,1).
868
869 ({1, 1; 2, 2} < {1, 2; 1, 2})
870   0  1
871   0  0
872
873 ({1, 1; 2, 2} < 2)
874   1  1
875   0  0
876
877 (1 < {1, 2; 1, 2})
878   0  1
879   0  1
880
881 matrix.sps:10: error: MATRIX: Operands to < must have the same dimensions or
882 one must be a scalar, not matrices with dimensions (1,2) and (2,1).
883
884 ({1, 1; 2, 2} <> {1, 2; 1, 2})
885   0  1
886   1  0
887
888 ({1, 1; 2, 2} <> 2)
889   1  1
890   0  0
891
892 (1 <> {1, 2; 1, 2})
893   0  1
894   0  1
895
896 matrix.sps:15: error: MATRIX: Operands to <> must have the same dimensions or
897 one must be a scalar, not matrices with dimensions (1,2) and (2,1).
898
899 ({1, 1; 2, 2} >= {1, 2; 1, 2})
900   1  0
901   1  1
902
903 ({1, 1; 2, 2} >= 2)
904   0  0
905   1  1
906
907 (1 >= {1, 2; 1, 2})
908   1  0
909   1  0
910
911 matrix.sps:20: error: MATRIX: Operands to >= must have the same dimensions or
912 one must be a scalar, not matrices with dimensions (1,2) and (2,1).
913
914 ({1, 1; 2, 2} <= {1, 2; 1, 2})
915   1  1
916   0  1
917
918 ({1, 1; 2, 2} <= 2)
919   1  1
920   1  1
921
922 (1 <= {1, 2; 1, 2})
923   1  1
924   1  1
925
926 matrix.sps:25: error: MATRIX: Operands to <= must have the same dimensions or
927 one must be a scalar, not matrices with dimensions (1,2) and (2,1).
928
929 ({1, 1; 2, 2} = {1, 2; 1, 2})
930   1  0
931   0  1
932
933 ({1, 1; 2, 2} = 2)
934   0  0
935   1  1
936
937 (1 = {1, 2; 1, 2})
938   1  0
939   1  0
940
941 matrix.sps:30: error: MATRIX: Operands to = must have the same dimensions or
942 one must be a scalar, not matrices with dimensions (1,2) and (2,1).
943 ])
944 AT_CLEANUP
945
946 AT_SETUP([MATRIX - logical operators])
947 AT_DATA([matrix.sps], [dnl
948 MATRIX.
949 PRINT (NOT {-1, 0, 1}).
950
951 PRINT ({-1, 0, 1; -1, 0, 1; -1, 0, 1} AND {-1, -1, -1; 0, 0, 0; 1, 1, 1}).
952 PRINT ({-1, 0, 1} AND -1).
953 PRINT ({-1, 0, 1} AND 0).
954 PRINT ({-1, 0, 1} AND 1).
955 PRINT ({-1, 0} AND {2; 3}).
956
957 PRINT ({-1, 0, 1; -1, 0, 1; -1, 0, 1} OR {-1, -1, -1; 0, 0, 0; 1, 1, 1}).
958 PRINT ({-1, 0, 1} OR -1).
959 PRINT ({-1, 0, 1} OR 0).
960 PRINT ({-1, 0, 1} OR 1).
961 PRINT ({-1, 0} OR {2; 3}).
962
963 PRINT ({-1, 0, 1; -1, 0, 1; -1, 0, 1} XOR {-1, -1, -1; 0, 0, 0; 1, 1, 1}).
964 PRINT ({-1, 0, 1} XOR -1).
965 PRINT ({-1, 0, 1} XOR 0).
966 PRINT ({-1, 0, 1} XOR 1).
967 PRINT ({-1, 0} XOR {2; 3}).
968 END MATRIX.
969 ])
970 AT_CHECK([pspp matrix.sps], [1], [dnl
971 (NOT {-1, 0, 1})
972   1  1  0
973
974 ({-1, 0, 1; -1, 0, 1; -1, 0, 1} AND {-1, -1, -1; 0, 0, 0; 1, 1, 1})
975   0  0  0
976   0  0  0
977   0  0  1
978
979 ({-1, 0, 1} AND -1)
980  0 0 0
981
982 ({-1, 0, 1} AND 0)
983  0 0 0
984
985 ({-1, 0, 1} AND 1)
986   0  0  1
987
988 matrix.sps:8: error: MATRIX: Operands to AND must have the same dimensions or
989 one must be a scalar, not matrices with dimensions (1,2) and (2,1).
990
991 ({-1, 0, 1; -1, 0, 1; -1, 0, 1} OR {-1, -1, -1; 0, 0, 0; 1, 1, 1})
992   0  0  1
993   0  0  1
994   1  1  1
995
996 ({-1, 0, 1} OR -1)
997   0  0  1
998
999 ({-1, 0, 1} OR 0)
1000   0  0  1
1001
1002 ({-1, 0, 1} OR 1)
1003   1  1  1
1004
1005 matrix.sps:14: error: MATRIX: Operands to OR must have the same dimensions or
1006 one must be a scalar, not matrices with dimensions (1,2) and (2,1).
1007
1008 ({-1, 0, 1; -1, 0, 1; -1, 0, 1} XOR {-1, -1, -1; 0, 0, 0; 1, 1, 1})
1009   0  0  1
1010   0  0  1
1011   1  1  0
1012
1013 ({-1, 0, 1} XOR -1)
1014   0  0  1
1015
1016 ({-1, 0, 1} XOR 0)
1017   0  0  1
1018
1019 ({-1, 0, 1} XOR 1)
1020   1  1  0
1021
1022 matrix.sps:20: error: MATRIX: Operands to XOR must have the same dimensions or
1023 one must be a scalar, not matrices with dimensions (1,2) and (2,1).
1024 ])
1025 AT_CLEANUP
1026
1027 AT_SETUP([MATRIX - matrix operators])
1028 AT_DATA([matrix.sps], [dnl
1029 MATRIX.
1030 PRINT ({0, 1; 0, 0} * {0, 0; 1, 0}).
1031 PRINT ({0, 0; 1, 0} * {0, 1; 0, 0}).
1032 PRINT ({1, 2, 3; 4, 5, 6} * {7, 8; 9, 10; 11, 12}).
1033 PRINT ({3, 4, 2} * {13, 9, 7, 15; 8, 7, 4, 6; 6, 4, 0, 3}).
1034 COMPUTE m = {0, 1, 0, 0; 1, 0, 1, 0; 0, 1, 0, 1; 0, 0, 1, 0}.
1035 PRINT m**-2.
1036 PRINT m**-1.
1037 PRINT m**0.
1038 PRINT m**1.
1039 PRINT m**2.
1040 PRINT m**3.
1041 PRINT m**5.
1042 PRINT {3, 3.5; 3.2, 3.6}**-1/FORMAT F6.2.
1043
1044 PRINT ({1, 2, 3} * {1, 2}).
1045 PRINT {1, 2, 3}**2.
1046 PRINT m**{1, 2}.
1047 PRINT m**1.5.
1048 END MATRIX.
1049 ])
1050 AT_CHECK([pspp matrix.sps], [1], [dnl
1051 ({0, 1; 0, 0} * {0, 0; 1, 0})
1052   1  0
1053   0  0
1054
1055 ({0, 0; 1, 0} * {0, 1; 0, 0})
1056   0  0
1057   0  1
1058
1059 ({1, 2, 3; 4, 5, 6} * {7, 8; 9, 10; 11, 12})
1060    58   64
1061   139  154
1062
1063 ({3, 4, 2} * {13, 9, 7, 15; 8, 7, 4, 6; 6, 4, 0, 3})
1064   83  63  37  75
1065
1066 m**-2
1067   2  0 -1  0
1068   0  1  0 -1
1069  -1  0  1  0
1070   0 -1  0  2
1071
1072 m**-1
1073   0  1  0 -1
1074   1  0  0  0
1075   0  0  0  1
1076  -1  0  1  0
1077
1078 m**0
1079   1  0  0  0
1080   0  1  0  0
1081   0  0  1  0
1082   0  0  0  1
1083
1084 m**1
1085   0  1  0  0
1086   1  0  1  0
1087   0  1  0  1
1088   0  0  1  0
1089
1090 m**2
1091   1  0  1  0
1092   0  2  0  1
1093   1  0  2  0
1094   0  1  0  1
1095
1096 m**3
1097   0  2  0  1
1098   2  0  3  0
1099   0  3  0  2
1100   1  0  2  0
1101
1102 m**5
1103   0  5  0  3
1104   5  0  8  0
1105   0  8  0  5
1106   3  0  5  0
1107
1108 {3, 3.5; 3.2, 3.6}**-1
1109   -9.00   8.75
1110    8.00  -7.50
1111
1112 matrix.sps:16: error: MATRIX: Matrices with dimensions (1,3) and (1,2) are not
1113 conformable for multiplication.
1114
1115 matrix.sps:17: error: MATRIX: Matrix exponentation with ** requires a square
1116 matrix on the left-hand size, not one with dimensions (1,3).
1117
1118 matrix.sps:18: error: MATRIX: Matrix exponentiation with ** requires a scalar
1119 on the right-hand side, not a matrix with dimensions (1,2).
1120
1121 matrix.sps:19: error: MATRIX: Exponent 1.5 in matrix multiplication is non-
1122 integer or outside the valid range.
1123 ])
1124 AT_CLEANUP
1125
1126 AT_SETUP([MATRIX - sequences and construction])
1127 AT_DATA([matrix.sps], [dnl
1128 MATRIX.
1129 PRINT {1:3:-1}.
1130 PRINT {1:3}.
1131 PRINT {1:10:2}.
1132 PRINT {1:11:2}.
1133
1134 PRINT {-1:-3}.
1135 PRINT {-1:-3:-1}.
1136 PRINT {-1:-10:-2}.
1137 PRINT {-1:-11:-2}.
1138
1139 PRINT {1:3:0}.
1140 PRINT {-1:-3:0}.
1141
1142 PRINT {1, 2; 3}.
1143 PRINT {{2; 5}, 3}.
1144 END MATRIX.
1145 ])
1146 AT_CHECK([pspp matrix.sps], [1], [dnl
1147 {1:3:-1}
1148
1149 {1:3}
1150   1  2  3
1151
1152 {1:10:2}
1153   1  3  5  7  9
1154
1155 {1:11:2}
1156    1   3   5   7   9  11
1157
1158 {-1:-3}
1159
1160 {-1:-3:-1}
1161  -1 -2 -3
1162
1163 {-1:-10:-2}
1164  -1 -3 -5 -7 -9
1165
1166 {-1:-11:-2}
1167   -1  -3  -5  -7  -9 -11
1168
1169 matrix.sps:12: error: MATRIX: The increment operand to : must be nonzero.
1170
1171 matrix.sps:13: error: MATRIX: The increment operand to : must be nonzero.
1172
1173 matrix.sps:15: error: MATRIX: All rows in a matrix must have the same number of
1174 columns, but this tries to stack matrices with 2 and 1 columns.
1175
1176 matrix.sps:16: error: MATRIX: All columns in a matrix must have the same number
1177 of rows, but this tries to paste matrices with 2 and 1 rows.
1178 ])
1179 AT_CLEANUP
1180
1181 AT_SETUP([MATRIX - comments])
1182 AT_DATA([matrix.sps], [dnl
1183 MATRIX.
1184 * Comment one.
1185 PRINT (1+2).
1186 COMMENT Comment two.
1187 PRINT (3+4).
1188 END MATRIX.
1189 ])
1190 AT_CHECK([pspp matrix.sps], [0], [dnl
1191 (1+2)
1192   3
1193
1194 (3+4)
1195   7
1196 ])
1197 AT_CLEANUP
1198
1199 AT_SETUP([MATRIX - string matrices])
1200 AT_DATA([matrix.sps], [dnl
1201 MATRIX.
1202 COMPUTE m={'This is', 'a string', 'matrix', 'including', 'some', 'long strings'}.
1203 PRINT m/FORMAT=A8.
1204 END MATRIX.
1205 ])
1206 AT_CHECK([pspp matrix.sps], [0], [dnl
1207 m
1208  This is a string matrix includin some long str
1209 ])
1210 AT_CLEANUP
1211
1212 AT_SETUP([MATRIX - ABS ALL ANY ARSIN ARTAN])
1213 AT_DATA([matrix.sps], [dnl
1214 MATRIX.
1215 PRINT ABS({-1, 0, 1}).
1216
1217 PRINT ALL({0, 0, 0}).
1218 PRINT ALL({-1, 1}).
1219 PRINT ALL({-1, 0, 1}).
1220
1221 PRINT ANY({0, 0, 0}).
1222 PRINT ANY({-1, 1}).
1223 PRINT ANY({-1, 0, 1}).
1224
1225 PRINT ARSIN({-1, 0, 1})/FORMAT=F5.2.
1226
1227 PRINT ARTAN({-5, -1, 0, 1, 5})/FORMAT=F5.2.
1228 END MATRIX.
1229 ])
1230 AT_CHECK([pspp matrix.sps], [0], [dnl
1231 ABS({-1, 0, 1})
1232   1  0  1
1233
1234 ALL({0, 0, 0})
1235  0
1236
1237 ALL({-1, 1})
1238   1
1239
1240 ALL({-1, 0, 1})
1241  0
1242
1243 ANY({0, 0, 0})
1244  0
1245
1246 ANY({-1, 1})
1247   1
1248
1249 ANY({-1, 0, 1})
1250   1
1251
1252 ARSIN({-1, 0, 1})
1253  -1.57   .00  1.57
1254
1255 ARTAN({-5, -1, 0, 1, 5})
1256  -1.37  -.79   .00   .79  1.37
1257 ])
1258 AT_CLEANUP
1259
1260 AT_SETUP([MATRIX - BLOCK CHOL CMAX CMIN COS])
1261 AT_DATA([matrix.sps], [dnl
1262 MATRIX.
1263 PRINT BLOCK({1, 2; 3, 4}, 5, {7; 8; 9}, {10, 11}).
1264
1265 COMPUTE b=CHOL({4, 12, -16; 12, 37, -43; -16, -43, 98}).
1266 PRINT b.
1267 PRINT (T(b)*b).
1268
1269 PRINT CMAX({9, 3, 4; 5, 8, 6; 7, 4, 11}).
1270
1271 PRINT CMIN({9, 3, 4; 5, 8, 6; 7, 4, 11}).
1272
1273 PRINT COS({0.785, 1.57; 3.14, 1.57 + 3.14}) /FORMAT=F5.2.
1274
1275 END MATRIX.
1276 ])
1277 AT_CHECK([pspp matrix.sps], [0], [dnl
1278 BLOCK({1, 2; 3, 4}, 5, {7; 8; 9}, {10, 11})
1279    1   2   0   0   0   0
1280    3   4   0   0   0   0
1281    0   0   5   0   0   0
1282    0   0   0   7   0   0
1283    0   0   0   8   0   0
1284    0   0   0   9   0   0
1285    0   0   0   0  10  11
1286
1287 b
1288   2  6 -8
1289   0  1  5
1290   0  0  3
1291
1292 (T(b)*b)
1293    4  12 -16
1294   12  37 -43
1295  -16 -43  98
1296
1297 CMAX({9, 3, 4; 5, 8, 6; 7, 4, 11})
1298    9   8  11
1299
1300 CMIN({9, 3, 4; 5, 8, 6; 7, 4, 11})
1301   5  3  4
1302
1303 COS({0.785, 1.57; 3.14, 1.57 + 3.14})
1304    .71   .00
1305  -1.00   .00
1306 ])
1307 AT_CLEANUP
1308
1309 AT_SETUP([MATRIX - CSSQ CSUM DESIGN DET DIAG])
1310 AT_DATA([matrix.sps], [dnl
1311 MATRIX.
1312 PRINT CSSQ({1, 2, 3; 4, 5, 6; 7, 8, 9}).
1313 PRINT CSUM({1, 2, 3; 4, 5, 6; 7, 8, 9}).
1314 PRINT DESIGN({1, 2, 0; 2, 1, 0; 3, 0, 1}).
1315 PRINT DESIGN({1, 2, 0; 2, 2, 0; 3, 2, 1}).
1316 PRINT DET({1, 2, 3; 4, 5, 6; 7, 8, 9}) /FORMAT F4.1.
1317 PRINT DIAG({1, 2, 3, 4; 4, 5, 6, 7; 7, 8, 9, 10}).
1318 END MATRIX.
1319 ])
1320 AT_CHECK([pspp matrix.sps], [0], [dnl
1321 CSSQ({1, 2, 3; 4, 5, 6; 7, 8, 9})
1322    66   93  126
1323
1324 CSUM({1, 2, 3; 4, 5, 6; 7, 8, 9})
1325   12  15  18
1326
1327 DESIGN({1, 2, 0; 2, 1, 0; 3, 0, 1})
1328   1  0  0  0  0  1  1  0
1329   0  1  0  0  1  0  1  0
1330   0  0  1  1  0  0  0  1
1331
1332 warning: Column 2 in DESIGN argument has constant value.
1333
1334 DESIGN({1, 2, 0; 2, 2, 0; 3, 2, 1})
1335   1  0  0  1  0
1336   0  1  0  1  0
1337   0  0  1  0  1
1338
1339 DET({1, 2, 3; 4, 5, 6; 7, 8, 9})
1340    .0
1341
1342 DIAG({1, 2, 3, 4; 4, 5, 6, 7; 7, 8, 9, 10})
1343   1
1344   5
1345   9
1346 ])
1347 AT_CLEANUP
1348
1349 AT_SETUP([MATRIX - EVAL EXP GINV GRADE GSCH])
1350 AT_DATA([matrix.sps], [dnl
1351 MATRIX.
1352 PRINT EVAL({2, 0, 0; 0, 3, 4; 0, 4, 9}).
1353
1354 PRINT EXP({2, 3; 4, 5})/FORMAT F5.2.
1355
1356 PRINT GINV({1, 2})/FORMAT F5.2.
1357 COMPUTE a={1, 2, 3; 4, 5, 6; 7, 8, 9}.
1358 COMPUTE g=GINV(a).
1359 PRINT (a*g*a)/FORMAT F5.2.
1360
1361 PRINT GRADE({1, 0, 3; 3, 1, 2; 3, 0, 5}).
1362 COMPUTE x={26, 690, 323, 208, 671, 818, 732, 711, 585, 792}.
1363 COMPUTE asort=x.
1364 COMPUTE asort(GRADE(asort))=asort.
1365 PRINT asort.
1366 COMPUTE dsort=x.
1367 COMPUTE dsort(GRADE(-dsort))=dsort.
1368 PRINT dsort.
1369
1370 PRINT (GSCH({3, 2; 1, 2}) * SQRT(10))/FORMAT F5.2.
1371 PRINT (GSCH({0, 3, 6, 2; 0, 1, 2, 2}) * SQRT(10))/FORMAT F5.2.
1372 PRINT GSCH({0; 0}).
1373 PRINT GSCH({0, 0, 0; 0, 0, 0}).
1374 END MATRIX.
1375 ])
1376 AT_CHECK([pspp matrix.sps], [1], [dnl
1377 EVAL({2, 0, 0; 0, 3, 4; 0, 4, 9})
1378  11.0000000000
1379   2.0000000000
1380   1.0000000000
1381
1382 EXP({2, 3; 4, 5})
1383   7.39 20.09
1384  54.60 148.4
1385
1386 GINV({1, 2})
1387    .20
1388    .40
1389
1390 (a*g*a)
1391   1.00  2.00  3.00
1392   4.00  5.00  6.00
1393   7.00  8.00  9.00
1394
1395 GRADE({1, 0, 3; 3, 1, 2; 3, 0, 5})
1396   3  1  6
1397   7  4  5
1398   8  2  9
1399
1400 asort
1401    26  208  323  585  671  690  711  732  792  818
1402
1403 dsort
1404   818  792  732  711  690  671  585  323  208   26
1405
1406 (GSCH({3, 2; 1, 2}) * SQRT(10))
1407   3.00 -1.00
1408   1.00  3.00
1409
1410 (GSCH({0, 3, 6, 2; 0, 1, 2, 2}) * SQRT(10))
1411   3.00 -1.00
1412   1.00  3.00
1413
1414 matrix.sps:22: error: MATRIX: GSCH requires its argument to have at least as
1415 many columns as rows, but it has dimensions (2,1).
1416
1417 matrix.sps:23: error: MATRIX: Argument to GSCH with dimensions (2,3) contains
1418 only 0 linearly independent columns.
1419 ])
1420 AT_CLEANUP
1421
1422 AT_SETUP([MATRIX - IDENT INV KRONEKER LG10 LN])
1423 AT_DATA([matrix.sps], [dnl
1424 MATRIX.
1425 PRINT IDENT(1).
1426 PRINT IDENT(2).
1427 PRINT IDENT(3,5).
1428 PRINT IDENT(5,3).
1429
1430 PRINT INV({3, 3.5; 3.2, 3.6})/FORMAT F8.2.
1431 PRINT INV({4, 7; 2, 6})/FORMAT F8.2.
1432 PRINT (INV({4, -2, 1; 5, 0, 3; -1, 2, 6})*52)/FORMAT F8.2.
1433
1434 PRINT KRONEKER({1, 2; 3, 4}, {0, 5; 6, 7}).
1435
1436 PRINT LG10({1, 10, 100, 1000}).
1437
1438 PRINT LN({1, 2; 3, 4})/FORMAT F5.2.
1439 END MATRIX.
1440 ])
1441 AT_CHECK([pspp matrix.sps], [0], [dnl
1442 IDENT(1)
1443   1
1444
1445 IDENT(2)
1446   1  0
1447   0  1
1448
1449 IDENT(3,5)
1450   1  0  0  0  0
1451   0  1  0  0  0
1452   0  0  1  0  0
1453
1454 IDENT(5,3)
1455   1  0  0
1456   0  1  0
1457   0  0  1
1458   0  0  0
1459   0  0  0
1460
1461 INV({3, 3.5; 3.2, 3.6})
1462     -9.00     8.75
1463      8.00    -7.50
1464
1465 INV({4, 7; 2, 6})
1466       .60     -.70
1467      -.20      .40
1468
1469 (INV({4, -2, 1; 5, 0, 3; -1, 2, 6})*52)
1470     -6.00    14.00    -6.00
1471    -33.00    25.00    -7.00
1472     10.00    -6.00    10.00
1473
1474 KRONEKER({1, 2; 3, 4}, {0, 5; 6, 7})
1475    0   5   0  10
1476    6   7  12  14
1477    0  15   0  20
1478   18  21  24  28
1479
1480 LG10({1, 10, 100, 1000})
1481   0  1  2  3
1482
1483 LN({1, 2; 3, 4})
1484    .00   .69
1485   1.10  1.39
1486 ])
1487 AT_CLEANUP
1488
1489 AT_SETUP([MATRIX - MAGIC])
1490 AT_DATA([matrix.sps], [dnl
1491 MATRIX.
1492
1493 LOOP n=3 to 10.
1494     COMPUTE m=MAGIC(n).
1495     COMPUTE total=n*(n**2 + 1) / 2.
1496     COMPUTE tb={MSUM(DIAG(T(m))), CSUM(m), MSUM(DIAG(m))} - total.
1497     COMPUTE lr=RSUM(m) - total.
1498     PRINT {tb; lr, m, lr; tb}/FORMAT F4.0.
1499 END LOOP.
1500 END MATRIX.
1501 ])
1502 AT_CHECK([pspp matrix.sps], [0], [dnl
1503 {tb; lr, m, lr; tb}
1504     0    0    0    0    0
1505     0    8    1    6    0
1506     0    3    5    7    0
1507     0    4    9    2    0
1508     0    0    0    0    0
1509 {tb; lr, m, lr; tb}
1510     0    0    0    0    0    0
1511     0    1    5   12   16    0
1512     0   15   11    6    2    0
1513     0   14    8    9    3    0
1514     0    4   10    7   13    0
1515     0    0    0    0    0    0
1516 {tb; lr, m, lr; tb}
1517     0    0    0    0    0    0    0
1518     0   17   24    1    8   15    0
1519     0   23    5    7   14   16    0
1520     0    4    6   13   20   22    0
1521     0   10   12   19   21    3    0
1522     0   11   18   25    2    9    0
1523     0    0    0    0    0    0    0
1524 {tb; lr, m, lr; tb}
1525     0    0    0    0    0    0    0    0
1526     0    1    5    9   28   32   36    0
1527     0   35   30   27   10    7    2    0
1528     0   24   14   22   18   17   16    0
1529     0   13   23   15   19   20   21    0
1530     0   34   31   26   11    6    3    0
1531     0    4    8   12   25   29   33    0
1532     0    0    0    0    0    0    0    0
1533 {tb; lr, m, lr; tb}
1534     0    0    0    0    0    0    0    0    0
1535     0   30   39   48    1   10   19   28    0
1536     0   38   47    7    9   18   27   29    0
1537     0   46    6    8   17   26   35   37    0
1538     0    5   14   16   25   34   36   45    0
1539     0   13   15   24   33   42   44    4    0
1540     0   21   23   32   41   43    3   12    0
1541     0   22   31   40   49    2   11   20    0
1542     0    0    0    0    0    0    0    0    0
1543 {tb; lr, m, lr; tb}
1544     0    0    0    0    0    0    0    0    0    0
1545     0    1    9   17   25   40   48   56   64    0
1546     0   63   55   47   39   26   18   10    2    0
1547     0    3   11   19   27   38   46   54   62    0
1548     0   61   53   45   37   28   20   12    4    0
1549     0   60   52   44   32   33   21   13    5    0
1550     0    6   14   22   30   35   43   51   59    0
1551     0   58   50   42   34   31   23   15    7    0
1552     0    8   16   24   36   29   41   49   57    0
1553     0    0    0    0    0    0    0    0    0    0
1554 {tb; lr, m, lr; tb}
1555     0    0    0    0    0    0    0    0    0    0    0
1556     0   47   58   69   80    1   12   23   34   45    0
1557     0   57   68   79    9   11   22   33   44   46    0
1558     0   67   78    8   10   21   32   43   54   56    0
1559     0   77    7   18   20   31   42   53   55   66    0
1560     0    6   17   19   30   41   52   63   65   76    0
1561     0   16   27   29   40   51   62   64   75    5    0
1562     0   26   28   39   50   61   72   74    4   15    0
1563     0   36   38   49   60   71   73    3   14   25    0
1564     0   37   48   59   70   81    2   13   24   35    0
1565     0    0    0    0    0    0    0    0    0    0    0
1566 {tb; lr, m, lr; tb}
1567     0    0    0    0    0    0    0    0    0    0    0    0
1568     0    1    9   17   25   33   68   76   84   92  100    0
1569     0   99   91   83   75   67   34   26   18   10    2    0
1570     0    3   11   19   27   35   66   74   82   90   98    0
1571     0   97   89   81   72   65   36   29   20   12    4    0
1572     0   60   42   58   44   56   50   49   53   47   46    0
1573     0   41   59   43   57   45   51   52   48   54   55    0
1574     0   96   88   80   73   64   37   28   21   13    5    0
1575     0    6   14   22   30   38   63   71   79   87   95    0
1576     0   94   86   78   70   62   39   31   23   15    7    0
1577     0    8   16   24   32   40   61   69   77   85   93    0
1578     0    0    0    0    0    0    0    0    0    0    0    0
1579 ])
1580 AT_CLEANUP
1581
1582 AT_SETUP([MATRIX - MAKE MDIAG MMAX MMIN MOD])
1583 AT_DATA([matrix.sps], [dnl
1584 MATRIX.
1585 PRINT MAKE(1, 2, 3).
1586 PRINT MAKE(2, 1, 4).
1587 PRINT MAKE(2, 3, 5).
1588
1589 PRINT MDIAG({1, 2, 3, 4}).
1590 PRINT MDIAG({1; 2; 3; 4}).
1591 PRINT MDIAG({1, 2; 3, 4}).
1592
1593 PRINT MMAX({55, 44; 66, 11}).
1594
1595 PRINT MMIN({55, 44; 66, 11}).
1596
1597 PRINT MOD({5, 4, 3, 2, 1, 0}, 3).
1598 PRINT MOD({5, 4, 3, 2, 1, 0}, -3).
1599 PRINT MOD({-5, -4, -3, -2, -1, 0}, 3).
1600 PRINT MOD({-5, -4, -3, -2, -1, 0}, -3).
1601 PRINT MOD({5, 4, 3, 2, 1, 0}, 1.5) /FORMAT F5.1.
1602 PRINT MOD({5, 4, 3, 2, 1, 0}, 0).
1603 END MATRIX.
1604 ])
1605 AT_CHECK([pspp matrix.sps], [1], [dnl
1606 MAKE(1, 2, 3)
1607   3  3
1608
1609 MAKE(2, 1, 4)
1610   4
1611   4
1612
1613 MAKE(2, 3, 5)
1614   5  5  5
1615   5  5  5
1616
1617 MDIAG({1, 2, 3, 4})
1618   1  0  0  0
1619   0  2  0  0
1620   0  0  3  0
1621   0  0  0  4
1622
1623 MDIAG({1; 2; 3; 4})
1624   1  0  0  0
1625   0  2  0  0
1626   0  0  3  0
1627   0  0  0  4
1628
1629 matrix.sps:8: error: MATRIX: Function MDIAG argument 1 must be a vector, but it
1630 has dimensions (2,2).
1631
1632 MMAX({55, 44; 66, 11})
1633   66
1634
1635 MMIN({55, 44; 66, 11})
1636   11
1637
1638 MOD({5, 4, 3, 2, 1, 0}, 3)
1639   2  1  0  2  1  0
1640
1641 MOD({5, 4, 3, 2, 1, 0}, -3)
1642   2  1  0  2  1  0
1643
1644 MOD({-5, -4, -3, -2, -1, 0}, 3)
1645  -2 -1  0 -2 -1  0
1646
1647 MOD({-5, -4, -3, -2, -1, 0}, -3)
1648  -2 -1  0 -2 -1  0
1649
1650 MOD({5, 4, 3, 2, 1, 0}, 1.5)
1651     .5   1.0    .0    .5   1.0    .0
1652
1653 matrix.sps:19: error: MATRIX: Divisor argument to MOD function must be nonzero.
1654 ])
1655 AT_CLEANUP
1656
1657 AT_SETUP([MATRIX - MSSQ MSUM NCOL NROW RANK])
1658 AT_DATA([matrix.sps], [dnl
1659 MATRIX.
1660 PRINT MSSQ({1, 0, 1; -2, -3, 1; 3, 3, 0}).
1661
1662 PRINT MSUM({1, 0, 1; -2, -3, 1; 3, 3, 0}).
1663
1664 PRINT NCOL({1, 0; -2, -3; 3, 3}).
1665
1666 PRINT NROW({1, 0; -2, -3; 3, 3}).
1667
1668 PRINT RANK({1, 0, 1; -2, -3, 1; 3, 3, 0}).
1669 PRINT RANK({1, 1, 0, 2; -1, -1, 0, -2}).
1670 PRINT RANK({1, -1; 1, -1; 0, 0; 2, -2}).
1671 PRINT RANK({1, 2, 1; -2, -3, 1; 3, 5, 0}).
1672 PRINT RANK({1, 0, 2; 2, 1, 0; 3, 2, 1}).
1673 END MATRIX.
1674 ])
1675 AT_CHECK([pspp matrix.sps], [0], [dnl
1676 MSSQ({1, 0, 1; -2, -3, 1; 3, 3, 0})
1677   34
1678
1679 MSUM({1, 0, 1; -2, -3, 1; 3, 3, 0})
1680   4
1681
1682 NCOL({1, 0; -2, -3; 3, 3})
1683   2
1684
1685 NROW({1, 0; -2, -3; 3, 3})
1686   3
1687
1688 RANK({1, 0, 1; -2, -3, 1; 3, 3, 0})
1689   2
1690
1691 RANK({1, 1, 0, 2; -1, -1, 0, -2})
1692   1
1693
1694 RANK({1, -1; 1, -1; 0, 0; 2, -2})
1695   1
1696
1697 RANK({1, 2, 1; -2, -3, 1; 3, 5, 0})
1698   2
1699
1700 RANK({1, 0, 2; 2, 1, 0; 3, 2, 1})
1701   3
1702 ])
1703 AT_CLEANUP
1704
1705 AT_SETUP([MATRIX - RESHAPE RMAX RMIN RND RNKORDER])
1706 AT_DATA([matrix.sps], [dnl
1707 MATRIX.
1708 PRINT RESHAPE({1, 2, 3; 4, 5, 6; 7, 8, 9; 10, 11, 12}, 1, 12).
1709 PRINT RESHAPE({1, 2, 3; 4, 5, 6; 7, 8, 9; 10, 11, 12}, 2, 6).
1710 PRINT RESHAPE({1, 2, 3; 4, 5, 6; 7, 8, 9; 10, 11, 12}, 3, 4).
1711 PRINT RESHAPE({1, 2, 3; 4, 5, 6; 7, 8, 9; 10, 11, 12}, 4, 3).
1712 PRINT RESHAPE({1, 2, 3; 4, 5, 6; 7, 8, 9; 10, 11, 12}, 6, 2).
1713 PRINT RESHAPE({1, 2, 3; 4, 5, 6; 7, 8, 9; 10, 11, 12}, 12, 1).
1714
1715 PRINT RMAX({1, 0, 1; -2, -3, 1; 3, 3, 0}).
1716
1717 PRINT RMIN({1, 0, 1; -2, -3, 1; 3, 3, 0}).
1718
1719 PRINT RND({-1.6, -1.5, -1.4;
1720            -.6, -.5, -.4;
1721            .4, .5, .6;
1722            1.4, 1.5, 1.6})/FORMAT F5.1.
1723
1724 PRINT RNKORDER({1, 0, 3; 3, 1, 2; 3, 0, 5}) /FORMAT F5.1.
1725 END MATRIX.
1726 ])
1727 AT_CHECK([pspp matrix.sps], [0], [dnl
1728 RESHAPE({1, 2, 3; 4, 5, 6; 7, 8, 9; 10, 11, 12}, 1, 12)
1729    1   2   3   4   5   6   7   8   9  10  11  12
1730
1731 RESHAPE({1, 2, 3; 4, 5, 6; 7, 8, 9; 10, 11, 12}, 2, 6)
1732    1   2   3   4   5   6
1733    7   8   9  10  11  12
1734
1735 RESHAPE({1, 2, 3; 4, 5, 6; 7, 8, 9; 10, 11, 12}, 3, 4)
1736    1   2   3   4
1737    5   6   7   8
1738    9  10  11  12
1739
1740 RESHAPE({1, 2, 3; 4, 5, 6; 7, 8, 9; 10, 11, 12}, 4, 3)
1741    1   2   3
1742    4   5   6
1743    7   8   9
1744   10  11  12
1745
1746 RESHAPE({1, 2, 3; 4, 5, 6; 7, 8, 9; 10, 11, 12}, 6, 2)
1747    1   2
1748    3   4
1749    5   6
1750    7   8
1751    9  10
1752   11  12
1753
1754 RESHAPE({1, 2, 3; 4, 5, 6; 7, 8, 9; 10, 11, 12}, 12, 1)
1755    1
1756    2
1757    3
1758    4
1759    5
1760    6
1761    7
1762    8
1763    9
1764   10
1765   11
1766   12
1767
1768 RMAX({1, 0, 1; -2, -3, 1; 3, 3, 0})
1769   1
1770   1
1771   3
1772
1773 RMIN({1, 0, 1; -2, -3, 1; 3, 3, 0})
1774   0
1775  -3
1776   0
1777
1778 RND({-1.6, -1.5, -1.4;
1779            -.6, -.5, -.4;
1780            .4, .5, .6;
1781            1.4, 1.5, 1.6})
1782   -2.0  -2.0  -1.0
1783   -1.0    .0    .0
1784     .0    .0   1.0
1785    1.0   2.0   2.0
1786
1787 RNKORDER({1, 0, 3; 3, 1, 2; 3, 0, 5})
1788    3.5   1.5   7.0
1789    7.0   3.5   5.0
1790    7.0   1.5   9.0
1791 ])
1792 AT_CLEANUP
1793
1794 AT_SETUP([MATRIX - RSSQ RSUM SIN SOLVE SQRT])
1795 AT_DATA([matrix.sps], [dnl
1796 MATRIX.
1797 PRINT RSSQ({1, 2, 3; 4, 5, 6; 7, 8, 9}).
1798 PRINT RSUM({1, 2, 3; 4, 5, 6; 7, 8, 9}).
1799
1800 PRINT SIN({0, .78, 1.57, 2.35, 3.14}) /FORMAT F5.2.
1801
1802 PRINT SOLVE({2, 3; 4, 9}, {6, 2; 15, 5}) /FORMAT=F6.2.
1803 PRINT SOLVE({1, 3, -2; 3, 5, 6; 2, 4, 3}, {5; 7; 8}) /FORMAT=F6.2.
1804 PRINT SOLVE({2, 1, -1; -3, -1, 2; -2, 1, 2}, {8; -11; -3}) /FORMAT=F6.2.
1805 PRINT SOLVE({1, 2; 3, 4}, {1, 2}).
1806
1807 PRINT SQRT({0, 1, 2, 3, 4, 9, 81}) /FORMAT=F5.2.
1808 PRINT SQRT(-1).
1809 END MATRIX.
1810 ])
1811 AT_CHECK([pspp matrix.sps], [1], [dnl
1812 RSSQ({1, 2, 3; 4, 5, 6; 7, 8, 9})
1813    14
1814    77
1815   194
1816
1817 RSUM({1, 2, 3; 4, 5, 6; 7, 8, 9})
1818    6
1819   15
1820   24
1821
1822 SIN({0, .78, 1.57, 2.35, 3.14})
1823    .00   .70  1.00   .71   .00
1824
1825 SOLVE({2, 3; 4, 9}, {6, 2; 15, 5})
1826    1.50    .50
1827    1.00    .33
1828
1829 SOLVE({1, 3, -2; 3, 5, 6; 2, 4, 3}, {5; 7; 8})
1830  -15.00
1831    8.00
1832    2.00
1833
1834 SOLVE({2, 1, -1; -3, -1, 2; -2, 1, 2}, {8; -11; -3})
1835    2.00
1836    3.00
1837   -1.00
1838
1839 matrix.sps:10: error: MATRIX: SOLVE requires its arguments to have the same
1840 number of rows, but the first argument has dimensions (2,2) and the second
1841 (1,2).
1842
1843 SQRT({0, 1, 2, 3, 4, 9, 81})
1844    .00  1.00  1.41  1.73  2.00  3.00  9.00
1845
1846 matrix.sps:13: error: MATRIX: Argument to SQRT must be nonnegative.
1847 ])
1848 AT_CLEANUP
1849
1850 AT_SETUP([MATRIX - SSCP SVAL SWEEP TRACE TRANSPOS TRUNC])
1851 AT_DATA([matrix.sps], [dnl
1852 MATRIX.
1853 COMPUTE m={1, 2, 3; 4, 5, 6}
1854 COMPUTE sscp1=SSCP(m).
1855 COMPUTE sscp2=T(m)*m.
1856 PRINT sscp1.
1857 PRINT (sscp1 <> sscp2).
1858
1859 PRINT SVAL({1, 1; 0, 0})/FORMAT F5.2.
1860 PRINT SVAL({1, 0, 1; 0, 1, 1; 0, 0, 0})/FORMAT F5.2.
1861 PRINT SVAL({1, 0, 0, 0, 2; 0, 0, 3, 0, 0; 0, 0, 0, 0, 0; 0, 2, 0, 0, 0})
1862     /FORMAT F5.2.
1863 PRINT SVAL({2, 4; 1, 3; 0, 0; 0, 0})/FORMAT F5.2.
1864
1865 COMPUTE s0 = {6, 12, 0, 12; 12, 28, 0, 25; 0, 0, 6, 2; 12, 25, 2, 28}.
1866 PRINT SWEEP(s0, 1)/FORMAT F5.2.
1867 PRINT SWEEP(SWEEP(s0, 1), 2)/FORMAT F5.2.
1868 PRINT SWEEP(SWEEP(SWEEP(s0, 1), 2), 3)/FORMAT F5.2.
1869
1870 COMPUTE s1 = {6, 12, 0, 12; 12, 0, 0, 25; 0, 0, 6, 2; 12, 25, 2, 28}.
1871 PRINT SWEEP(s1, 2).
1872
1873 PRINT TRACE(s0).
1874
1875 PRINT T(s0).
1876 PRINT TRANSPOS(s0).
1877 PRINT ALL(T(T(s0)) = s0).
1878
1879 PRINT TRUNC(SVAL({2, 4; 1, 3; 0, 0; 0, 0})).
1880 PRINT TRUNC(-SVAL({2, 4; 1, 3; 0, 0; 0, 0})).
1881 END MATRIX.
1882 ])
1883 AT_CHECK([pspp matrix.sps], [0], [dnl
1884 sscp1
1885   17  22  27
1886   22  29  36
1887   27  36  45
1888
1889 (sscp1 <> sscp2)
1890  0 0 0
1891  0 0 0
1892  0 0 0
1893
1894 SVAL({1, 1; 0, 0})
1895   1.41
1896    .00
1897
1898 SVAL({1, 0, 1; 0, 1, 1; 0, 0, 0})
1899   1.73
1900   1.00
1901    .00
1902
1903 SVAL({1, 0, 0, 0, 2; 0, 0, 3, 0, 0; 0, 0, 0, 0, 0; 0, 2, 0, 0, 0})
1904   3.00
1905   2.24
1906   2.00
1907    .00
1908
1909 SVAL({2, 4; 1, 3; 0, 0; 0, 0})
1910   5.46
1911    .37
1912
1913 SWEEP(s0, 1)
1914    .17  2.00   .00  2.00
1915  -2.00  4.00   .00  1.00
1916    .00   .00  6.00  2.00
1917  -2.00  1.00  2.00  4.00
1918
1919 SWEEP(SWEEP(s0, 1), 2)
1920   1.17  -.50   .00  1.50
1921   -.50   .25   .00   .25
1922    .00   .00  6.00  2.00
1923  -1.50  -.25  2.00  3.75
1924
1925 SWEEP(SWEEP(SWEEP(s0, 1), 2), 3)
1926   1.17  -.50   .00  1.50
1927   -.50   .25   .00   .25
1928    .00   .00   .17   .33
1929  -1.50  -.25  -.33  3.08
1930
1931 SWEEP(s1, 2)
1932    6   0   0  12
1933    0   0   0   0
1934    0   0   6   2
1935   12   0   2  28
1936
1937 TRACE(s0)
1938   68
1939
1940 T(s0)
1941    6  12   0  12
1942   12  28   0  25
1943    0   0   6   2
1944   12  25   2  28
1945
1946 TRANSPOS(s0)
1947    6  12   0  12
1948   12  28   0  25
1949    0   0   6   2
1950   12  25   2  28
1951
1952 ALL(T(T(s0)) = s0)
1953   1
1954
1955 TRUNC(SVAL({2, 4; 1, 3; 0, 0; 0, 0}))
1956   5
1957   0
1958
1959 TRUNC(-SVAL({2, 4; 1, 3; 0, 0; 0, 0}))
1960  -5
1961   0
1962 ])
1963 AT_CLEANUP
1964
1965 AT_SETUP([MATRIX - UNIFORM])
1966 AT_DATA([matrix.sps], [dnl
1967 SET SEED=10.
1968 MATRIX.
1969 PRINT (UNIFORM(4, 5)*10)/FORMAT F5.2.
1970 END MATRIX.
1971 ])
1972 AT_CHECK([pspp matrix.sps], [0], [dnl
1973 (UNIFORM(4, 5)*10)
1974   7.71  2.99   .21  4.95  6.34
1975   4.43  7.49  8.32  4.99  5.83
1976   2.25   .25  1.98  7.09  7.61
1977   2.66  1.69  2.64   .88  1.50
1978 ])
1979 AT_CLEANUP
1980
1981 AT_SETUP([MATRIX - CALL SETDIAG])
1982 AT_DATA([matrix.sps], [dnl
1983 MATRIX.
1984 COMPUTE x={1, 2, 3; 4, 5, 6; 7, 8, 9}.
1985
1986 COMPUTE x1=x.
1987 CALL SETDIAG(x1, 10).
1988 PRINT x1.
1989
1990 COMPUTE x2=x.
1991 CALL SETDIAG(x2, {10, 11}).
1992 PRINT x2.
1993
1994 COMPUTE x3=x.
1995 CALL SETDIAG(x3, {10, 11, 12}).
1996 PRINT x3.
1997
1998 COMPUTE x4=x.
1999 CALL SETDIAG(x4, {10, 11, 12, 13}).
2000 PRINT x4.
2001
2002 COMPUTE x5=x.
2003 CALL SETDIAG(x5, {10, 11; 12, 13}).
2004 PRINT x5.
2005
2006 END MATRIX.
2007 ])
2008 AT_CHECK([pspp matrix.sps], [1], [dnl
2009 x1
2010   10   2   3
2011    4  10   6
2012    7   8  10
2013
2014 x2
2015   10   2   3
2016    4  11   6
2017    7   8   9
2018
2019 x3
2020   10   2   3
2021    4  11   6
2022    7   8  12
2023
2024 x4
2025   10   2   3
2026    4  11   6
2027    7   8  12
2028
2029 matrix.sps:21: error: MATRIX: SETDIAG argument 2 must be a scalar or a vector
2030 but it has dimensions (2,2).
2031
2032 x5
2033   1  2  3
2034   4  5  6
2035   7  8  9
2036 ])
2037 AT_CLEANUP
2038
2039 dnl I have some doubts about the correctness of the results below.
2040 AT_SETUP([MATRIX - CALL EIGEN])
2041 AT_DATA([matrix.sps], [dnl
2042 MATRIX.
2043 CALL EIGEN({1, 0; 0, 1}, evec, eval).
2044 PRINT evec.
2045 PRINT eval.
2046
2047 CALL EIGEN({3, 2, 4; 2, 0, 2; 4, 2, 3}, evec, eval).
2048 PRINT evec.
2049 PRINT eval.
2050 END MATRIX.
2051 ])
2052 AT_CHECK([pspp matrix.sps], [0], [dnl
2053 evec
2054   1  0
2055   0  1
2056
2057 eval
2058   1
2059   1
2060
2061 evec
2062   -.6666666667   .0000000000   .7453559925
2063   -.3333333333  -.8944271910  -.2981423970
2064   -.6666666667   .4472135955  -.5962847940
2065
2066 eval
2067   8.0000000000
2068  -1.0000000000
2069  -1.0000000000
2070 ])
2071 AT_CLEANUP
2072
2073 AT_SETUP([MATRIX - CALL SVD])
2074 AT_DATA([matrix.sps], [dnl
2075 MATRIX.
2076 CALL SVD({3, 2, 2; 2, 3, -2}, u, s, v).
2077 PRINT (u * s * T(v))/FORMAT F5.1.
2078
2079 CALL SVD({2, 4; 1, 3; 0, 0; 0, 0}, u, s, v).
2080 PRINT (u*s*T(v))/FORMAT F5.1.
2081
2082 CALL SVD({-3, 1; 6, -2; 6, -2}, u, s, v).
2083 PRINT (u*s*T(v))/FORMAT F5.1.
2084 END MATRIX.
2085 ])
2086 AT_CHECK([pspp matrix.sps], [0], [dnl
2087 (u * s * T(v))
2088    3.0   2.0   2.0
2089    2.0   3.0  -2.0
2090
2091 (u*s*T(v))
2092    2.0   4.0
2093    1.0   3.0
2094     .0    .0
2095     .0    .0
2096
2097 (u*s*T(v))
2098   -3.0   1.0
2099    6.0  -2.0
2100    6.0  -2.0
2101 ])
2102 AT_CLEANUP
2103
2104 AT_SETUP([MATRIX - PRINT])
2105 AT_DATA([matrix.sps], [dnl
2106 MATRIX.
2107 PRINT/TITLE="title 1".
2108 PRINT/SPACE=2/TITLE="title 2".
2109
2110 COMPUTE m={1, 2, 3; 3, 4, 5; 6, 7, 8}.
2111 PRINT m/RLABELS=123, a b c, long name.
2112 PRINT m/RNAMES={'123', 'a b c', 'long name'}.
2113 PRINT m/CLABELS=col1, col2, long column name.
2114 PRINT m/CNAMES={'col1', 'col2', 'long column name'}.
2115 PRINT m/RLABELS=123, a b c, long name
2116        /CLABELS=col1, col2, long column name.
2117 PRINT m/RNAMES={'123', 'a b c', 'long name'}
2118        /CNAMES={'col1', 'col2', 'long column name'}.
2119 PRINT {123e10, 456e10, 500}.
2120 END MATRIX.
2121 ])
2122
2123 AT_DATA([matrix-tables.sps], [dnl
2124 SET MDISPLAY=TABLES.
2125 INCLUDE 'matrix.sps'.
2126 ])
2127
2128 AT_CHECK([pspp matrix.sps], [0], [dnl
2129 title 1
2130
2131
2132
2133 title 2
2134
2135 m
2136 123       1  2  3
2137 a b c     3  4  5
2138 long nam  6  7  8
2139
2140 m
2141 123       1  2  3
2142 a b c     3  4  5
2143 long nam  6  7  8
2144
2145 m
2146      col1     col2 long col
2147         1        2        3
2148         3        4        5
2149         6        7        8
2150
2151 m
2152      col1     col2 long col
2153         1        2        3
2154         3        4        5
2155         6        7        8
2156
2157 m
2158              col1     col2 long col
2159 123             1        2        3
2160 a b c           3        4        5
2161 long nam        6        7        8
2162
2163 m
2164              col1     col2 long col
2165 123             1        2        3
2166 a b c           3        4        5
2167 long nam        6        7        8
2168
2169 {123e10, 456e10, 500}
2170   10 ** 12   X
2171   1.2300000000  4.5600000000   .0000000005
2172 ])
2173
2174 AT_CHECK([pspp matrix-tables.sps], [0], [dnl
2175 title 1
2176
2177
2178
2179 title 2
2180
2181         m
2182 +---------+-----+
2183 |123      |1 2 3|
2184 |a b c    |3 4 5|
2185 |long name|6 7 8|
2186 +---------+-----+
2187
2188         m
2189 +--------+-----+
2190 |123     |1 2 3|
2191 |a b c   |3 4 5|
2192 |long nam|6 7 8|
2193 +--------+-----+
2194
2195               m
2196 +----+----+----------------+
2197 |col1|col2|long column name|
2198 +----+----+----------------+
2199 |   1|   2|               3|
2200 |   3|   4|               5|
2201 |   6|   7|               8|
2202 +----+----+----------------+
2203
2204           m
2205 +----+----+--------+
2206 |col1|col2|long col|
2207 +----+----+--------+
2208 |   1|   2|       3|
2209 |   3|   4|       5|
2210 |   6|   7|       8|
2211 +----+----+--------+
2212
2213                    m
2214 +---------+----+----+----------------+
2215 |         |col1|col2|long column name|
2216 +---------+----+----+----------------+
2217 |123      |   1|   2|               3|
2218 |a b c    |   3|   4|               5|
2219 |long name|   6|   7|               8|
2220 +---------+----+----+----------------+
2221
2222               m
2223 +--------+----+----+--------+
2224 |        |col1|col2|long col|
2225 +--------+----+----+--------+
2226 |123     |   1|   2|       3|
2227 |a b c   |   3|   4|       5|
2228 |long nam|   6|   7|       8|
2229 +--------+----+----+--------+
2230
2231               {123e10, 456e10, 500}
2232 +----------------------------------------------+
2233 |1.2300000000[[a]] 4.5600000000[[a]] .0000000005[[a]]|
2234 +----------------------------------------------+
2235 a. Ã— 10**12
2236 ])
2237 AT_CLEANUP
2238
2239 AT_SETUP([MATRIX - DO IF])
2240 AT_DATA([matrix.sps], [dnl
2241 MATRIX.
2242 DO IF 1.
2243 PRINT/TITLE '1'.
2244 END IF.
2245
2246 DO IF 0.
2247 PRINT/TITLE '2'.
2248 ELSE IF 1.
2249 PRINT/TITLE '3'.
2250 END IF.
2251
2252 DO IF -1.
2253 PRINT/TITLE '4'.
2254 ELSE IF 0.
2255 PRINT/TITLE '5'.
2256 ELSE.
2257 PRINT/TITLE '6'.
2258 END IF.
2259
2260 DO IF {1, 2}.
2261 END IF.
2262
2263 DO IF 0.
2264 ELSE IF {}.
2265 END IF.
2266 END MATRIX.
2267 ])
2268 AT_CHECK([pspp matrix.sps], [1], [dnl
2269 1
2270
2271 3
2272
2273 6
2274
2275 matrix.sps:21: error: MATRIX: Expression for DO IF must evaluate to scalar, not
2276 a matrix with dimensions (1,2).
2277
2278 matrix.sps:25: error: MATRIX: Expression for ELSE IF must evaluate to scalar,
2279 not a matrix with dimensions (0,0).
2280 ])
2281 AT_CLEANUP
2282
2283 AT_SETUP([MATRIX - unbounded LOOP])
2284 AT_DATA([matrix.sps], [dnl
2285 MATRIX.
2286 * Truly unbounded loop.
2287 COMPUTE x=0.
2288 COMPUTE y={}.
2289 LOOP.
2290 COMPUTE x=x+1.
2291 COMPUTE y={y, x}.
2292 END LOOP.
2293 PRINT x.
2294 PRINT y.
2295
2296 * Unbounded loop terminates with BREAK.
2297 COMPUTE x=0.
2298 COMPUTE y={}.
2299 LOOP.
2300 COMPUTE x=x+1.
2301 COMPUTE y={y, x}.
2302 DO IF x >= 20.
2303     BREAK.
2304 END IF.
2305 END LOOP.
2306 PRINT x.
2307 PRINT y.
2308
2309 END MATRIX.
2310 ])
2311 AT_CHECK([pspp matrix.sps], [0], [dnl
2312 x
2313   40
2314
2315 y
2316    1   2   3   4   5   6   7   8   9  10  11  12  13  14  15  16  17  18  19
2317 20  21  22  23  24  25  26  27  28  29  30  31  32  33  34  35  36  37  38  39
2318 40
2319
2320 x
2321   20
2322
2323 y
2324    1   2   3   4   5   6   7   8   9  10  11  12  13  14  15  16  17  18  19
2325 20
2326 ])
2327 AT_CLEANUP
2328
2329 AT_SETUP([MATRIX - indexed or conditional LOOP])
2330 AT_DATA([matrix.sps], [dnl
2331 MATRIX.
2332 * Indexed loop terminates based on index.
2333 COMPUTE y={}.
2334 LOOP x=1 TO 20.
2335 COMPUTE y={y, x}.
2336 END LOOP.
2337 PRINT x.
2338 PRINT y.
2339
2340 * Indexed loop terminates based on MXLOOPS.
2341 COMPUTE y={}.
2342 LOOP x=1 TO 50.
2343 COMPUTE y={y, x}.
2344 END LOOP.
2345 PRINT x.
2346 PRINT y.
2347
2348 * Indexed loop terminates with BREAK.
2349 COMPUTE y={}.
2350 LOOP x=1 TO 50.
2351 COMPUTE y={y, x}.
2352 DO IF x >= 20.
2353     BREAK.
2354 END IF.
2355 END LOOP.
2356 PRINT x.
2357 PRINT y.
2358
2359 * Indexed loop terminates with top IF.
2360 COMPUTE y={}.
2361 LOOP x=1 TO 50 IF NCOL(y) < 15.
2362 COMPUTE y={y, x}.
2363 END LOOP.
2364 PRINT x.
2365 PRINT y.
2366
2367 * Indexed loop terminates with bottom IF.
2368 COMPUTE y={}.
2369 LOOP x=1 TO 50.
2370 COMPUTE y={y, x}.
2371 END LOOP IF NCOL(y) >= 22.
2372 PRINT x.
2373 PRINT y.
2374
2375 * Index behavior.
2376 COMPUTE indexing={
2377     1, 10, 1;
2378     1, 10, 2;
2379     1, 10, 3;
2380     1, 10, -1;
2381     1, 10, 0;
2382     10, 1, -1;
2383     10, 1, -2;
2384     10, 1, -3;
2385     10, 1, 1;
2386     10, 1, 0
2387 }.
2388 LOOP i=1 TO NROW(indexing).
2389     COMPUTE y={}.
2390     LOOP j=indexing(i, 1) TO indexing(i, 2) BY indexing(i, 3).
2391         COMPUTE y={y, j}.
2392     END LOOP.
2393     PRINT {indexing(i, :), y}.
2394 END LOOP.
2395
2396 LOOP i={} TO 5.
2397 END LOOP.
2398         
2399 LOOP i=5 TO {}.
2400 END LOOP.
2401
2402 LOOP i=5 TO 8 BY {}.
2403 END LOOP.
2404
2405 LOOP IF {}.
2406 END LOOP.
2407
2408 LOOP.
2409 END LOOP IF {}.
2410
2411 LOOP i=1e100 to 1e200.
2412 END LOOP.
2413 END MATRIX.
2414 ])
2415 AT_CHECK([pspp matrix.sps], [1], [dnl
2416 x
2417   20
2418
2419 y
2420    1   2   3   4   5   6   7   8   9  10  11  12  13  14  15  16  17  18  19
2421 20
2422
2423 x
2424   40
2425
2426 y
2427    1   2   3   4   5   6   7   8   9  10  11  12  13  14  15  16  17  18  19
2428 20  21  22  23  24  25  26  27  28  29  30  31  32  33  34  35  36  37  38  39
2429 40
2430
2431 x
2432   20
2433
2434 y
2435    1   2   3   4   5   6   7   8   9  10  11  12  13  14  15  16  17  18  19
2436 20
2437
2438 x
2439   16
2440
2441 y
2442    1   2   3   4   5   6   7   8   9  10  11  12  13  14  15
2443
2444 x
2445   22
2446
2447 y
2448    1   2   3   4   5   6   7   8   9  10  11  12  13  14  15  16  17  18  19
2449 20  21  22
2450
2451 {indexing(i, :), y}
2452    1  10   1   1   2   3   4   5   6   7   8   9  10
2453 {indexing(i, :), y}
2454    1  10   2   1   3   5   7   9
2455 {indexing(i, :), y}
2456    1  10   3   1   4   7  10
2457 {indexing(i, :), y}
2458    1  10  -1
2459 {indexing(i, :), y}
2460    1  10   0
2461 {indexing(i, :), y}
2462   10   1  -1  10   9   8   7   6   5   4   3   2   1
2463 {indexing(i, :), y}
2464   10   1  -2  10   8   6   4   2
2465 {indexing(i, :), y}
2466   10   1  -3  10   7   4   1
2467 {indexing(i, :), y}
2468   10   1   1
2469 {indexing(i, :), y}
2470   10   1   0
2471
2472 matrix.sps:67: error: MATRIX: Expression for LOOP must evaluate to scalar, not
2473 a matrix with dimensions (0,0).
2474
2475 matrix.sps:70: error: MATRIX: Expression for TO must evaluate to scalar, not a
2476 matrix with dimensions (0,0).
2477
2478 matrix.sps:73: error: MATRIX: Expression for BY must evaluate to scalar, not a
2479 matrix with dimensions (0,0).
2480
2481 matrix.sps:76: error: MATRIX: Expression for LOOP IF must evaluate to scalar,
2482 not a matrix with dimensions (0,0).
2483
2484 matrix.sps:79: error: MATRIX: Expression for END LOOP IF must evaluate to
2485 scalar, not a matrix with dimensions (0,0).
2486
2487 matrix.sps:82: error: MATRIX: Expression for LOOP is outside the integer range.
2488 ])
2489 AT_CLEANUP
2490
2491 AT_SETUP([MATRIX - BREAK outside LOOP])
2492 AT_DATA([matrix.sps], [dnl
2493 MATRIX.
2494 BREAK.
2495 END MATRIX.
2496 ])
2497 AT_CHECK([pspp matrix.sps], [1], [dnl
2498 matrix.sps:2: error: BREAK: BREAK not inside LOOP.
2499 ])
2500 AT_CLEANUP
2501
2502 AT_SETUP([MATRIX - READ])
2503 AT_DATA([matrix.txt], [dnl
2504 1 2 3
2505 4 5 6
2506 7 8 9
2507 10 11 12,13
2508 14, 15 ,16 , 17
2509 18
2510 19
2511 20 21 22 23
2512     12        34
2513 5    6
2514     78        89
2515 10   11
2516 ])
2517 AT_DATA([matrix2.txt], [dnl
2518 2, 3, 5, 7
2519 11, 13, 17, 19
2520 23, 29, 31, 37
2521 41, 43, 47, 53
2522 ])
2523 AT_DATA([matrix.sps], [dnl
2524 MATRIX.
2525 READ x/FILE='matrix.txt'/SIZE={3,3}/FIELD=1 TO 80.
2526 PRINT x.
2527 READ x/SIZE={2,4}/FIELD=1 TO 80.
2528 PRINT x.
2529 READ x(:,2)/FILE='matrix.txt'/FIELD=1 TO 80.
2530 PRINT x.
2531 READ x(1,:)/SIZE={1,4}/FIELD=1 TO 80.
2532 PRINT x.
2533
2534 READ x/SIZE={2,6}/FIELD=1 TO 20 BY 5.
2535 PRINT x.
2536
2537 COMPUTE y={}.
2538 LOOP IF NOT EOF('matrix2.txt').
2539 READ x/FILE='matrix2.txt'/SIZE={1,4}/FIELD=1 TO 80.
2540 COMPUTE y={y; x}.
2541 END LOOP.
2542 PRINT y.
2543 END MATRIX.
2544 ])
2545 AT_CHECK([pspp matrix.sps], [0], [dnl
2546 x
2547   1  2  3
2548   4  5  6
2549   7  8  9
2550
2551 x
2552   10  11  12  13
2553   14  15  16  17
2554
2555 x
2556   10  18  12  13
2557   14  19  16  17
2558
2559 x
2560   20  21  22  23
2561   14  19  16  17
2562
2563 x
2564    1   2   3   4   5   6
2565    7   8   8   9  10  11
2566
2567 y
2568    2   3   5   7
2569   11  13  17  19
2570   23  29  31  37
2571   41  43  47  53
2572 ])
2573 AT_CLEANUP