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