More matrix 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:1}.
1126 PRINT {1:1:-1}.
1127
1128 PRINT {1:3:0}.
1129 PRINT {-1:-3:0}.
1130
1131 PRINT {1, 2; 3}.
1132 PRINT {{2; 5}, 3}.
1133 END MATRIX.
1134 ])
1135 AT_CHECK([pspp matrix.sps], [1], [dnl
1136 {1:3:-1}
1137
1138 {1:3}
1139   1  2  3
1140
1141 {1:10:2}
1142   1  3  5  7  9
1143
1144 {1:11:2}
1145    1   3   5   7   9  11
1146
1147 {-1:-3}
1148
1149 {-1:-3:-1}
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:1}
1159   1
1160
1161 {1:1:-1}
1162   1
1163
1164 matrix.sps:12: error: MATRIX: The increment operand to : must be nonzero.
1165
1166 matrix.sps:13: error: MATRIX: The increment operand to : must be nonzero.
1167
1168 matrix.sps:15: error: MATRIX: All rows in a matrix must have the same number of
1169 columns, but this tries to stack matrices with 2 and 1 columns.
1170
1171 matrix.sps:16: error: MATRIX: All columns in a matrix must have the same number
1172 of rows, but this tries to paste matrices with 2 and 1 rows.
1173 ])
1174 AT_CLEANUP
1175
1176 AT_SETUP([MATRIX - comments])
1177 AT_DATA([matrix.sps], [dnl
1178 MATRIX.
1179 * Comment one.
1180 PRINT (1+2).
1181 COMMENT Comment two.
1182 PRINT (3+4).
1183 END MATRIX.
1184 ])
1185 AT_CHECK([pspp matrix.sps], [0], [dnl
1186 (1+2)
1187   3
1188
1189 (3+4)
1190   7
1191 ])
1192 AT_CLEANUP
1193
1194 AT_SETUP([MATRIX - string matrices])
1195 AT_DATA([matrix.sps], [dnl
1196 MATRIX.
1197 COMPUTE m={'This is', 'a string', 'matrix', 'including', 'some', 'long strings'}.
1198 PRINT m/FORMAT=A8.
1199 END MATRIX.
1200 ])
1201 AT_CHECK([pspp matrix.sps], [0], [dnl
1202 m
1203  This is a string matrix includin some long str
1204 ])
1205 AT_CLEANUP
1206
1207 AT_SETUP([MATRIX - ABS ALL ANY ARSIN ARTAN])
1208 AT_DATA([matrix.sps], [dnl
1209 MATRIX.
1210 PRINT ABS({-1, 0, 1}).
1211
1212 PRINT ALL({0, 0, 0}).
1213 PRINT ALL({-1, 1}).
1214 PRINT ALL({-1, 0, 1}).
1215
1216 PRINT ANY({0, 0, 0}).
1217 PRINT ANY({-1, 1}).
1218 PRINT ANY({-1, 0, 1}).
1219
1220 PRINT ARSIN({-1, 0, 1})/FORMAT=F5.2.
1221
1222 PRINT ARTAN({-5, -1, 0, 1, 5})/FORMAT=F5.2.
1223 END MATRIX.
1224 ])
1225 AT_CHECK([pspp matrix.sps], [0], [dnl
1226 ABS({-1, 0, 1})
1227   1  0  1
1228
1229 ALL({0, 0, 0})
1230  0
1231
1232 ALL({-1, 1})
1233   1
1234
1235 ALL({-1, 0, 1})
1236  0
1237
1238 ANY({0, 0, 0})
1239  0
1240
1241 ANY({-1, 1})
1242   1
1243
1244 ANY({-1, 0, 1})
1245   1
1246
1247 ARSIN({-1, 0, 1})
1248  -1.57   .00  1.57
1249
1250 ARTAN({-5, -1, 0, 1, 5})
1251  -1.37  -.79   .00   .79  1.37
1252 ])
1253 AT_CLEANUP
1254
1255 AT_SETUP([MATRIX - BLOCK CHOL CMAX CMIN COS])
1256 AT_DATA([matrix.sps], [dnl
1257 MATRIX.
1258 PRINT BLOCK({1, 2; 3, 4}, 5, {7; 8; 9}, {10, 11}).
1259
1260 COMPUTE b=CHOL({4, 12, -16; 12, 37, -43; -16, -43, 98}).
1261 PRINT b.
1262 PRINT (T(b)*b).
1263
1264 PRINT CMAX({9, 3, 4; 5, 8, 6; 7, 4, 11}).
1265
1266 PRINT CMIN({9, 3, 4; 5, 8, 6; 7, 4, 11}).
1267
1268 PRINT COS({0.785, 1.57; 3.14, 1.57 + 3.14}) /FORMAT=F5.2.
1269
1270 END MATRIX.
1271 ])
1272 AT_CHECK([pspp matrix.sps], [0], [dnl
1273 BLOCK({1, 2; 3, 4}, 5, {7; 8; 9}, {10, 11})
1274    1   2   0   0   0   0
1275    3   4   0   0   0   0
1276    0   0   5   0   0   0
1277    0   0   0   7   0   0
1278    0   0   0   8   0   0
1279    0   0   0   9   0   0
1280    0   0   0   0  10  11
1281
1282 b
1283   2  6 -8
1284   0  1  5
1285   0  0  3
1286
1287 (T(b)*b)
1288    4  12 -16
1289   12  37 -43
1290  -16 -43  98
1291
1292 CMAX({9, 3, 4; 5, 8, 6; 7, 4, 11})
1293    9   8  11
1294
1295 CMIN({9, 3, 4; 5, 8, 6; 7, 4, 11})
1296   5  3  4
1297
1298 COS({0.785, 1.57; 3.14, 1.57 + 3.14})
1299    .71   .00
1300  -1.00   .00
1301 ])
1302 AT_CLEANUP
1303
1304 AT_SETUP([MATRIX - CSSQ CSUM DESIGN DET DIAG])
1305 AT_DATA([matrix.sps], [dnl
1306 MATRIX.
1307 PRINT CSSQ({1, 2, 3; 4, 5, 6; 7, 8, 9}).
1308 PRINT CSUM({1, 2, 3; 4, 5, 6; 7, 8, 9}).
1309 PRINT DESIGN({1, 2, 0; 2, 1, 0; 3, 0, 1}).
1310 PRINT DESIGN({1, 2, 0; 2, 2, 0; 3, 2, 1}).
1311 PRINT DET({1, 2, 3; 4, 5, 6; 7, 8, 9}) /FORMAT F4.1.
1312 PRINT DIAG({1, 2, 3, 4; 4, 5, 6, 7; 7, 8, 9, 10}).
1313 END MATRIX.
1314 ])
1315 AT_CHECK([pspp matrix.sps], [0], [dnl
1316 CSSQ({1, 2, 3; 4, 5, 6; 7, 8, 9})
1317    66   93  126
1318
1319 CSUM({1, 2, 3; 4, 5, 6; 7, 8, 9})
1320   12  15  18
1321
1322 DESIGN({1, 2, 0; 2, 1, 0; 3, 0, 1})
1323   1  0  0  0  0  1  1  0
1324   0  1  0  0  1  0  1  0
1325   0  0  1  1  0  0  0  1
1326
1327 warning: Column 2 in DESIGN argument has constant value.
1328
1329 DESIGN({1, 2, 0; 2, 2, 0; 3, 2, 1})
1330   1  0  0  1  0
1331   0  1  0  1  0
1332   0  0  1  0  1
1333
1334 DET({1, 2, 3; 4, 5, 6; 7, 8, 9})
1335    .0
1336
1337 DIAG({1, 2, 3, 4; 4, 5, 6, 7; 7, 8, 9, 10})
1338   1
1339   5
1340   9
1341 ])
1342 AT_CLEANUP
1343
1344 AT_SETUP([MATRIX - EVAL EXP GINV GRADE GSCH])
1345 AT_DATA([matrix.sps], [dnl
1346 MATRIX.
1347 PRINT EVAL({2, 0, 0; 0, 3, 4; 0, 4, 9}).
1348
1349 PRINT EXP({2, 3; 4, 5})/FORMAT F5.2.
1350
1351 PRINT GINV({1, 2})/FORMAT F5.2.
1352 COMPUTE a={1, 2, 3; 4, 5, 6; 7, 8, 9}.
1353 COMPUTE g=GINV(a).
1354 PRINT (a*g*a)/FORMAT F5.2.
1355
1356 PRINT GRADE({1, 0, 3; 3, 1, 2; 3, 0, 5}).
1357 COMPUTE x={26, 690, 323, 208, 671, 818, 732, 711, 585, 792}.
1358 COMPUTE asort=x.
1359 COMPUTE asort(GRADE(asort))=asort.
1360 PRINT asort.
1361 COMPUTE dsort=x.
1362 COMPUTE dsort(GRADE(-dsort))=dsort.
1363 PRINT dsort.
1364
1365 PRINT (GSCH({3, 2; 1, 2}) * SQRT(10))/FORMAT F5.2.
1366 PRINT (GSCH({0, 3, 6, 2; 0, 1, 2, 2}) * SQRT(10))/FORMAT F5.2.
1367 PRINT GSCH({0; 0}).
1368 PRINT GSCH({0, 0, 0; 0, 0, 0}).
1369 END MATRIX.
1370 ])
1371 AT_CHECK([pspp matrix.sps], [1], [dnl
1372 EVAL({2, 0, 0; 0, 3, 4; 0, 4, 9})
1373  11.0000000000
1374   2.0000000000
1375   1.0000000000
1376
1377 EXP({2, 3; 4, 5})
1378   7.39 20.09
1379  54.60 148.4
1380
1381 GINV({1, 2})
1382    .20
1383    .40
1384
1385 (a*g*a)
1386   1.00  2.00  3.00
1387   4.00  5.00  6.00
1388   7.00  8.00  9.00
1389
1390 GRADE({1, 0, 3; 3, 1, 2; 3, 0, 5})
1391   3  1  6
1392   7  4  5
1393   8  2  9
1394
1395 asort
1396    26  208  323  585  671  690  711  732  792  818
1397
1398 dsort
1399   818  792  732  711  690  671  585  323  208   26
1400
1401 (GSCH({3, 2; 1, 2}) * SQRT(10))
1402   3.00 -1.00
1403   1.00  3.00
1404
1405 (GSCH({0, 3, 6, 2; 0, 1, 2, 2}) * SQRT(10))
1406   3.00 -1.00
1407   1.00  3.00
1408
1409 matrix.sps:22: error: MATRIX: GSCH requires its argument to have at least as
1410 many columns as rows, but it has dimensions (2,1).
1411
1412 matrix.sps:23: error: MATRIX: 2×3 argument to GSCH contains only 0 linearly
1413 independent columns.
1414 ])
1415 AT_CLEANUP
1416
1417 AT_SETUP([MATRIX - IDENT INV KRONEKER LG10 LN])
1418 AT_DATA([matrix.sps], [dnl
1419 MATRIX.
1420 PRINT IDENT(1).
1421 PRINT IDENT(2).
1422 PRINT IDENT(3,5).
1423 PRINT IDENT(5,3).
1424
1425 PRINT INV({3, 3.5; 3.2, 3.6})/FORMAT F8.2.
1426 PRINT INV({4, 7; 2, 6})/FORMAT F8.2.
1427 PRINT (INV({4, -2, 1; 5, 0, 3; -1, 2, 6})*52)/FORMAT F8.2.
1428
1429 PRINT KRONEKER({1, 2; 3, 4}, {0, 5; 6, 7}).
1430
1431 PRINT LG10({1, 10, 100, 1000}).
1432
1433 PRINT LN({1, 2; 3, 4})/FORMAT F5.2.
1434 PRINT LN(0).
1435 END MATRIX.
1436 ])
1437 AT_CHECK([pspp matrix.sps], [0], [dnl
1438 IDENT(1)
1439   1
1440
1441 IDENT(2)
1442   1  0
1443   0  1
1444
1445 IDENT(3,5)
1446   1  0  0  0  0
1447   0  1  0  0  0
1448   0  0  1  0  0
1449
1450 IDENT(5,3)
1451   1  0  0
1452   0  1  0
1453   0  0  1
1454   0  0  0
1455   0  0  0
1456
1457 INV({3, 3.5; 3.2, 3.6})
1458     -9.00     8.75
1459      8.00    -7.50
1460
1461 INV({4, 7; 2, 6})
1462       .60     -.70
1463      -.20      .40
1464
1465 (INV({4, -2, 1; 5, 0, 3; -1, 2, 6})*52)
1466     -6.00    14.00    -6.00
1467    -33.00    25.00    -7.00
1468     10.00    -6.00    10.00
1469
1470 KRONEKER({1, 2; 3, 4}, {0, 5; 6, 7})
1471    0   5   0  10
1472    6   7  12  14
1473    0  15   0  20
1474   18  21  24  28
1475
1476 LG10({1, 10, 100, 1000})
1477   0  1  2  3
1478
1479 LN({1, 2; 3, 4})
1480    .00   .69
1481   1.10  1.39
1482 ])
1483 AT_CLEANUP
1484
1485 AT_SETUP([MATRIX - MAGIC])
1486 AT_DATA([matrix.sps], [dnl
1487 MATRIX.
1488
1489 LOOP n=3 to 10.
1490     COMPUTE m=MAGIC(n).
1491     COMPUTE total=n*(n**2 + 1) / 2.
1492     COMPUTE tb={MSUM(DIAG(T(m))), CSUM(m), MSUM(DIAG(m))} - total.
1493     COMPUTE lr=RSUM(m) - total.
1494     PRINT {tb; lr, m, lr; tb}/FORMAT F4.0.
1495 END LOOP.
1496 END MATRIX.
1497 ])
1498 AT_CHECK([pspp matrix.sps], [0], [dnl
1499 {tb; lr, m, lr; tb}
1500     0    0    0    0    0
1501     0    8    1    6    0
1502     0    3    5    7    0
1503     0    4    9    2    0
1504     0    0    0    0    0
1505 {tb; lr, m, lr; tb}
1506     0    0    0    0    0    0
1507     0    1    5   12   16    0
1508     0   15   11    6    2    0
1509     0   14    8    9    3    0
1510     0    4   10    7   13    0
1511     0    0    0    0    0    0
1512 {tb; lr, m, lr; tb}
1513     0    0    0    0    0    0    0
1514     0   17   24    1    8   15    0
1515     0   23    5    7   14   16    0
1516     0    4    6   13   20   22    0
1517     0   10   12   19   21    3    0
1518     0   11   18   25    2    9    0
1519     0    0    0    0    0    0    0
1520 {tb; lr, m, lr; tb}
1521     0    0    0    0    0    0    0    0
1522     0    1    5    9   28   32   36    0
1523     0   35   30   27   10    7    2    0
1524     0   24   14   22   18   17   16    0
1525     0   13   23   15   19   20   21    0
1526     0   34   31   26   11    6    3    0
1527     0    4    8   12   25   29   33    0
1528     0    0    0    0    0    0    0    0
1529 {tb; lr, m, lr; tb}
1530     0    0    0    0    0    0    0    0    0
1531     0   30   39   48    1   10   19   28    0
1532     0   38   47    7    9   18   27   29    0
1533     0   46    6    8   17   26   35   37    0
1534     0    5   14   16   25   34   36   45    0
1535     0   13   15   24   33   42   44    4    0
1536     0   21   23   32   41   43    3   12    0
1537     0   22   31   40   49    2   11   20    0
1538     0    0    0    0    0    0    0    0    0
1539 {tb; lr, m, lr; tb}
1540     0    0    0    0    0    0    0    0    0    0
1541     0    1    9   17   25   40   48   56   64    0
1542     0   63   55   47   39   26   18   10    2    0
1543     0    3   11   19   27   38   46   54   62    0
1544     0   61   53   45   37   28   20   12    4    0
1545     0   60   52   44   32   33   21   13    5    0
1546     0    6   14   22   30   35   43   51   59    0
1547     0   58   50   42   34   31   23   15    7    0
1548     0    8   16   24   36   29   41   49   57    0
1549     0    0    0    0    0    0    0    0    0    0
1550 {tb; lr, m, lr; tb}
1551     0    0    0    0    0    0    0    0    0    0    0
1552     0   47   58   69   80    1   12   23   34   45    0
1553     0   57   68   79    9   11   22   33   44   46    0
1554     0   67   78    8   10   21   32   43   54   56    0
1555     0   77    7   18   20   31   42   53   55   66    0
1556     0    6   17   19   30   41   52   63   65   76    0
1557     0   16   27   29   40   51   62   64   75    5    0
1558     0   26   28   39   50   61   72   74    4   15    0
1559     0   36   38   49   60   71   73    3   14   25    0
1560     0   37   48   59   70   81    2   13   24   35    0
1561     0    0    0    0    0    0    0    0    0    0    0
1562 {tb; lr, m, lr; tb}
1563     0    0    0    0    0    0    0    0    0    0    0    0
1564     0    1    9   17   25   33   68   76   84   92  100    0
1565     0   99   91   83   75   67   34   26   18   10    2    0
1566     0    3   11   19   27   35   66   74   82   90   98    0
1567     0   97   89   81   72   65   36   29   20   12    4    0
1568     0   60   42   58   44   56   50   49   53   47   46    0
1569     0   41   59   43   57   45   51   52   48   54   55    0
1570     0   96   88   80   73   64   37   28   21   13    5    0
1571     0    6   14   22   30   38   63   71   79   87   95    0
1572     0   94   86   78   70   62   39   31   23   15    7    0
1573     0    8   16   24   32   40   61   69   77   85   93    0
1574     0    0    0    0    0    0    0    0    0    0    0    0
1575 ])
1576 AT_CLEANUP
1577
1578 AT_SETUP([MATRIX - MAKE MDIAG MMAX MMIN MOD])
1579 AT_DATA([matrix.sps], [dnl
1580 MATRIX.
1581 PRINT MAKE(1, 2, 3).
1582 PRINT MAKE(2, 1, 4).
1583 PRINT MAKE(2, 3, 5).
1584
1585 PRINT MDIAG({1, 2, 3, 4}).
1586 PRINT MDIAG({1; 2; 3; 4}).
1587 PRINT MDIAG({1, 2; 3, 4}).
1588
1589 PRINT MMAX({55, 44; 66, 11}).
1590
1591 PRINT MMIN({55, 44; 66, 11}).
1592
1593 PRINT MOD({5, 4, 3, 2, 1, 0}, 3).
1594 PRINT MOD({5, 4, 3, 2, 1, 0}, -3).
1595 PRINT MOD({-5, -4, -3, -2, -1, 0}, 3).
1596 PRINT MOD({-5, -4, -3, -2, -1, 0}, -3).
1597 PRINT MOD({5, 4, 3, 2, 1, 0}, 1.5) /FORMAT F5.1.
1598 PRINT MOD({5, 4, 3, 2, 1, 0}, 0).
1599 END MATRIX.
1600 ])
1601 AT_CHECK([pspp matrix.sps], [1], [dnl
1602 MAKE(1, 2, 3)
1603   3  3
1604
1605 MAKE(2, 1, 4)
1606   4
1607   4
1608
1609 MAKE(2, 3, 5)
1610   5  5  5
1611   5  5  5
1612
1613 MDIAG({1, 2, 3, 4})
1614   1  0  0  0
1615   0  2  0  0
1616   0  0  3  0
1617   0  0  0  4
1618
1619 MDIAG({1; 2; 3; 4})
1620   1  0  0  0
1621   0  2  0  0
1622   0  0  3  0
1623   0  0  0  4
1624
1625 matrix.sps:8: error: MATRIX: Function MDIAG argument 1 must be a vector, not a
1626 2×2 matrix.
1627
1628 MMAX({55, 44; 66, 11})
1629   66
1630
1631 MMIN({55, 44; 66, 11})
1632   11
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}, -3)
1638   2  1  0  2  1  0
1639
1640 MOD({-5, -4, -3, -2, -1, 0}, 3)
1641  -2 -1  0 -2 -1  0
1642
1643 MOD({-5, -4, -3, -2, -1, 0}, -3)
1644  -2 -1  0 -2 -1  0
1645
1646 MOD({5, 4, 3, 2, 1, 0}, 1.5)
1647     .5   1.0    .0    .5   1.0    .0
1648
1649 matrix.sps:19: error: MATRIX: Divisor argument to MOD function must be nonzero.
1650 ])
1651 AT_CLEANUP
1652
1653 AT_SETUP([MATRIX - MSSQ MSUM NCOL NROW RANK])
1654 AT_DATA([matrix.sps], [dnl
1655 MATRIX.
1656 PRINT MSSQ({1, 0, 1; -2, -3, 1; 3, 3, 0}).
1657
1658 PRINT MSUM({1, 0, 1; -2, -3, 1; 3, 3, 0}).
1659
1660 PRINT NCOL({1, 0; -2, -3; 3, 3}).
1661
1662 PRINT NROW({1, 0; -2, -3; 3, 3}).
1663
1664 PRINT RANK({1, 0, 1; -2, -3, 1; 3, 3, 0}).
1665 PRINT RANK({1, 1, 0, 2; -1, -1, 0, -2}).
1666 PRINT RANK({1, -1; 1, -1; 0, 0; 2, -2}).
1667 PRINT RANK({1, 2, 1; -2, -3, 1; 3, 5, 0}).
1668 PRINT RANK({1, 0, 2; 2, 1, 0; 3, 2, 1}).
1669 END MATRIX.
1670 ])
1671 AT_CHECK([pspp matrix.sps], [0], [dnl
1672 MSSQ({1, 0, 1; -2, -3, 1; 3, 3, 0})
1673   34
1674
1675 MSUM({1, 0, 1; -2, -3, 1; 3, 3, 0})
1676   4
1677
1678 NCOL({1, 0; -2, -3; 3, 3})
1679   2
1680
1681 NROW({1, 0; -2, -3; 3, 3})
1682   3
1683
1684 RANK({1, 0, 1; -2, -3, 1; 3, 3, 0})
1685   2
1686
1687 RANK({1, 1, 0, 2; -1, -1, 0, -2})
1688   1
1689
1690 RANK({1, -1; 1, -1; 0, 0; 2, -2})
1691   1
1692
1693 RANK({1, 2, 1; -2, -3, 1; 3, 5, 0})
1694   2
1695
1696 RANK({1, 0, 2; 2, 1, 0; 3, 2, 1})
1697   3
1698 ])
1699 AT_CLEANUP
1700
1701 AT_SETUP([MATRIX - RESHAPE RMAX RMIN RND RNKORDER])
1702 AT_DATA([matrix.sps], [dnl
1703 MATRIX.
1704 PRINT RESHAPE(1:12, 1, 12).
1705 PRINT RESHAPE(1:12, 2, 6).
1706 PRINT RESHAPE(1:12, 3, 4).
1707 PRINT RESHAPE(1:12, 4, 3).
1708 PRINT RESHAPE(1:12, 6, 2).
1709 PRINT RESHAPE(1:12, 12, 1).
1710
1711 PRINT RMAX({1, 0, 1; -2, -3, 1; 3, 3, 0}).
1712
1713 PRINT RMIN({1, 0, 1; -2, -3, 1; 3, 3, 0}).
1714
1715 PRINT RND({-1.6, -1.5, -1.4;
1716            -.6, -.5, -.4;
1717            .4, .5, .6;
1718            1.4, 1.5, 1.6})/FORMAT F5.1.
1719
1720 PRINT RNKORDER({1, 0, 3; 3, 1, 2; 3, 0, 5}) /FORMAT F5.1.
1721 END MATRIX.
1722 ])
1723 AT_CHECK([pspp matrix.sps], [0], [dnl
1724 RESHAPE(1:12, 1, 12)
1725    1   2   3   4   5   6   7   8   9  10  11  12
1726
1727 RESHAPE(1:12, 2, 6)
1728    1   2   3   4   5   6
1729    7   8   9  10  11  12
1730
1731 RESHAPE(1:12, 3, 4)
1732    1   2   3   4
1733    5   6   7   8
1734    9  10  11  12
1735
1736 RESHAPE(1:12, 4, 3)
1737    1   2   3
1738    4   5   6
1739    7   8   9
1740   10  11  12
1741
1742 RESHAPE(1:12, 6, 2)
1743    1   2
1744    3   4
1745    5   6
1746    7   8
1747    9  10
1748   11  12
1749
1750 RESHAPE(1:12, 12, 1)
1751    1
1752    2
1753    3
1754    4
1755    5
1756    6
1757    7
1758    8
1759    9
1760   10
1761   11
1762   12
1763
1764 RMAX({1, 0, 1; -2, -3, 1; 3, 3, 0})
1765   1
1766   1
1767   3
1768
1769 RMIN({1, 0, 1; -2, -3, 1; 3, 3, 0})
1770   0
1771  -3
1772   0
1773
1774 RND({-1.6, -1.5, -1.4;
1775            -.6, -.5, -.4;
1776            .4, .5, .6;
1777            1.4, 1.5, 1.6})
1778   -2.0  -2.0  -1.0
1779   -1.0    .0    .0
1780     .0    .0   1.0
1781    1.0   2.0   2.0
1782
1783 RNKORDER({1, 0, 3; 3, 1, 2; 3, 0, 5})
1784    3.5   1.5   7.0
1785    7.0   3.5   5.0
1786    7.0   1.5   9.0
1787 ])
1788 AT_CLEANUP
1789
1790 AT_SETUP([MATRIX - RSSQ RSUM SIN SOLVE SQRT])
1791 AT_DATA([matrix.sps], [dnl
1792 MATRIX.
1793 PRINT RSSQ({1, 2, 3; 4, 5, 6; 7, 8, 9}).
1794 PRINT RSUM({1, 2, 3; 4, 5, 6; 7, 8, 9}).
1795
1796 PRINT SIN({0, .78, 1.57, 2.35, 3.14}) /FORMAT F5.2.
1797
1798 PRINT SOLVE({2, 3; 4, 9}, {6, 2; 15, 5}) /FORMAT=F6.2.
1799 PRINT SOLVE({1, 3, -2; 3, 5, 6; 2, 4, 3}, {5; 7; 8}) /FORMAT=F6.2.
1800 PRINT SOLVE({2, 1, -1; -3, -1, 2; -2, 1, 2}, {8; -11; -3}) /FORMAT=F6.2.
1801 PRINT SOLVE({1, 2; 3, 4}, {1, 2}).
1802
1803 PRINT SQRT({0, 1, 2, 3, 4, 9, 81}) /FORMAT=F5.2.
1804 PRINT SQRT(-1).
1805 END MATRIX.
1806 ])
1807 AT_CHECK([pspp matrix.sps], [1], [dnl
1808 RSSQ({1, 2, 3; 4, 5, 6; 7, 8, 9})
1809    14
1810    77
1811   194
1812
1813 RSUM({1, 2, 3; 4, 5, 6; 7, 8, 9})
1814    6
1815   15
1816   24
1817
1818 SIN({0, .78, 1.57, 2.35, 3.14})
1819    .00   .70  1.00   .71   .00
1820
1821 SOLVE({2, 3; 4, 9}, {6, 2; 15, 5})
1822    1.50    .50
1823    1.00    .33
1824
1825 SOLVE({1, 3, -2; 3, 5, 6; 2, 4, 3}, {5; 7; 8})
1826  -15.00
1827    8.00
1828    2.00
1829
1830 SOLVE({2, 1, -1; -3, -1, 2; -2, 1, 2}, {8; -11; -3})
1831    2.00
1832    3.00
1833   -1.00
1834
1835 matrix.sps:10: error: MATRIX: SOLVE requires its arguments to have the same
1836 number of rows, but the first argument has dimensions (2,2) and the second
1837 (1,2).
1838
1839 SQRT({0, 1, 2, 3, 4, 9, 81})
1840    .00  1.00  1.41  1.73  2.00  3.00  9.00
1841
1842 matrix.sps:13: error: MATRIX: Argument to SQRT must be nonnegative.
1843 ])
1844 AT_CLEANUP
1845
1846 AT_SETUP([MATRIX - SSCP SVAL SWEEP TRACE TRANSPOS TRUNC])
1847 AT_DATA([matrix.sps], [dnl
1848 MATRIX.
1849 COMPUTE m={1, 2, 3; 4, 5, 6}
1850 COMPUTE sscp1=SSCP(m).
1851 COMPUTE sscp2=T(m)*m.
1852 PRINT sscp1.
1853 PRINT (sscp1 <> sscp2).
1854
1855 PRINT SVAL({1, 1; 0, 0})/FORMAT F5.2.
1856 PRINT SVAL({1, 0, 1; 0, 1, 1; 0, 0, 0})/FORMAT F5.2.
1857 PRINT SVAL({1, 0, 0, 0, 2; 0, 0, 3, 0, 0; 0, 0, 0, 0, 0; 0, 2, 0, 0, 0})
1858     /FORMAT F5.2.
1859 PRINT SVAL({2, 4; 1, 3; 0, 0; 0, 0})/FORMAT F5.2.
1860
1861 COMPUTE s0 = {6, 12, 0, 12; 12, 28, 0, 25; 0, 0, 6, 2; 12, 25, 2, 28}.
1862 PRINT SWEEP(s0, 1)/FORMAT F5.2.
1863 PRINT SWEEP(SWEEP(s0, 1), 2)/FORMAT F5.2.
1864 PRINT SWEEP(SWEEP(SWEEP(s0, 1), 2), 3)/FORMAT F5.2.
1865
1866 COMPUTE s1 = {6, 12, 0, 12; 12, 0, 0, 25; 0, 0, 6, 2; 12, 25, 2, 28}.
1867 PRINT SWEEP(s1, 2).
1868
1869 COMPUTE s2 = {0, 1, 2; 3, 4, 5; 6, 7, 8}.
1870 PRINT SWEEP(s2, 1).
1871 PRINT SWEEP(s2, 2).
1872 PRINT SWEEP(s2, 3).
1873
1874 PRINT TRACE(s0).
1875
1876 PRINT T(s0).
1877 PRINT TRANSPOS(s0).
1878 PRINT ALL(T(T(s0)) = s0).
1879
1880 PRINT TRUNC(SVAL({2, 4; 1, 3; 0, 0; 0, 0})).
1881 PRINT TRUNC(-SVAL({2, 4; 1, 3; 0, 0; 0, 0})).
1882 END MATRIX.
1883 ])
1884 AT_CHECK([pspp matrix.sps], [0], [dnl
1885 sscp1
1886   17  22  27
1887   22  29  36
1888   27  36  45
1889
1890 (sscp1 <> sscp2)
1891  0 0 0
1892  0 0 0
1893  0 0 0
1894
1895 SVAL({1, 1; 0, 0})
1896   1.41
1897    .00
1898
1899 SVAL({1, 0, 1; 0, 1, 1; 0, 0, 0})
1900   1.73
1901   1.00
1902    .00
1903
1904 SVAL({1, 0, 0, 0, 2; 0, 0, 3, 0, 0; 0, 0, 0, 0, 0; 0, 2, 0, 0, 0})
1905   3.00
1906   2.24
1907   2.00
1908    .00
1909
1910 SVAL({2, 4; 1, 3; 0, 0; 0, 0})
1911   5.46
1912    .37
1913
1914 SWEEP(s0, 1)
1915    .17  2.00   .00  2.00
1916  -2.00  4.00   .00  1.00
1917    .00   .00  6.00  2.00
1918  -2.00  1.00  2.00  4.00
1919
1920 SWEEP(SWEEP(s0, 1), 2)
1921   1.17  -.50   .00  1.50
1922   -.50   .25   .00   .25
1923    .00   .00  6.00  2.00
1924  -1.50  -.25  2.00  3.75
1925
1926 SWEEP(SWEEP(SWEEP(s0, 1), 2), 3)
1927   1.17  -.50   .00  1.50
1928   -.50   .25   .00   .25
1929    .00   .00   .17   .33
1930  -1.50  -.25  -.33  3.08
1931
1932 SWEEP(s1, 2)
1933    6   0   0  12
1934    0   0   0   0
1935    0   0   6   2
1936   12   0   2  28
1937
1938 TRACE(s0)
1939   68
1940
1941 T(s0)
1942    6  12   0  12
1943   12  28   0  25
1944    0   0   6   2
1945   12  25   2  28
1946
1947 TRANSPOS(s0)
1948    6  12   0  12
1949   12  28   0  25
1950    0   0   6   2
1951   12  25   2  28
1952
1953 ALL(T(T(s0)) = s0)
1954   1
1955
1956 TRUNC(SVAL({2, 4; 1, 3; 0, 0; 0, 0}))
1957   5
1958   0
1959
1960 TRUNC(-SVAL({2, 4; 1, 3; 0, 0; 0, 0}))
1961  -5
1962   0
1963 ])
1964 AT_CLEANUP
1965
1966 AT_SETUP([MATRIX - UNIFORM])
1967 AT_DATA([matrix.sps], [dnl
1968 SET SEED=10.
1969 MATRIX.
1970 PRINT (UNIFORM(4, 5)*10)/FORMAT F5.2.
1971 END MATRIX.
1972 ])
1973 AT_CHECK([pspp matrix.sps], [0], [dnl
1974 (UNIFORM(4, 5)*10)
1975   7.71  2.99   .21  4.95  6.34
1976   4.43  7.49  8.32  4.99  5.83
1977   2.25   .25  1.98  7.09  7.61
1978   2.66  1.69  2.64   .88  1.50
1979 ])
1980 AT_CLEANUP
1981
1982 AT_SETUP([MATRIX - CALL SETDIAG])
1983 AT_DATA([matrix.sps], [dnl
1984 MATRIX.
1985 COMPUTE x={1, 2, 3; 4, 5, 6; 7, 8, 9}.
1986
1987 COMPUTE x1=x.
1988 CALL SETDIAG(x1, 10).
1989 PRINT x1.
1990
1991 COMPUTE x2=x.
1992 CALL SETDIAG(x2, {10, 11}).
1993 PRINT x2.
1994
1995 COMPUTE x3=x.
1996 CALL SETDIAG(x3, {10, 11, 12}).
1997 PRINT x3.
1998
1999 COMPUTE x4=x.
2000 CALL SETDIAG(x4, {10, 11, 12, 13}).
2001 PRINT x4.
2002
2003 COMPUTE x5=x.
2004 CALL SETDIAG(x5, {10, 11; 12, 13}).
2005 PRINT x5.
2006
2007 END MATRIX.
2008 ])
2009 AT_CHECK([pspp matrix.sps], [1], [dnl
2010 x1
2011   10   2   3
2012    4  10   6
2013    7   8  10
2014
2015 x2
2016   10   2   3
2017    4  11   6
2018    7   8   9
2019
2020 x3
2021   10   2   3
2022    4  11   6
2023    7   8  12
2024
2025 x4
2026   10   2   3
2027    4  11   6
2028    7   8  12
2029
2030 matrix.sps:21: error: MATRIX: SETDIAG argument 2 must be a scalar or a vector,
2031 not a 2×2 matrix.
2032
2033 x5
2034   1  2  3
2035   4  5  6
2036   7  8  9
2037 ])
2038 AT_CLEANUP
2039
2040 dnl I have some doubts about the correctness of the results below.
2041 AT_SETUP([MATRIX - CALL EIGEN])
2042 AT_DATA([matrix.sps], [dnl
2043 MATRIX.
2044 CALL EIGEN({1, 0; 0, 1}, evec, eval).
2045 PRINT evec.
2046 PRINT eval.
2047
2048 CALL EIGEN({3, 2, 4; 2, 0, 2; 4, 2, 3}, evec2, eval2).
2049 PRINT evec2.
2050 PRINT eval2.
2051 END MATRIX.
2052 ])
2053 AT_CHECK([pspp matrix.sps], [0], [dnl
2054 evec
2055   1  0
2056   0  1
2057
2058 eval
2059   1
2060   1
2061
2062 evec2
2063   -.6666666667   .0000000000   .7453559925
2064   -.3333333333  -.8944271910  -.2981423970
2065   -.6666666667   .4472135955  -.5962847940
2066
2067 eval2
2068   8.0000000000
2069  -1.0000000000
2070  -1.0000000000
2071 ])
2072 AT_CLEANUP
2073
2074 AT_SETUP([MATRIX - CALL SVD])
2075 AT_DATA([matrix.sps], [dnl
2076 MATRIX.
2077 CALL SVD({3, 2, 2; 2, 3, -2}, u, s, v).
2078 PRINT (u * s * T(v))/FORMAT F5.1.
2079
2080 CALL SVD({2, 4; 1, 3; 0, 0; 0, 0}, u, s, v).
2081 PRINT (u*s*T(v))/FORMAT F5.1.
2082
2083 CALL SVD({-3, 1; 6, -2; 6, -2}, u, s, v).
2084 PRINT (u*s*T(v))/FORMAT F5.1.
2085 END MATRIX.
2086 ])
2087 AT_CHECK([pspp matrix.sps], [0], [dnl
2088 (u * s * T(v))
2089    3.0   2.0   2.0
2090    2.0   3.0  -2.0
2091
2092 (u*s*T(v))
2093    2.0   4.0
2094    1.0   3.0
2095     .0    .0
2096     .0    .0
2097
2098 (u*s*T(v))
2099   -3.0   1.0
2100    6.0  -2.0
2101    6.0  -2.0
2102 ])
2103 AT_CLEANUP
2104
2105 AT_SETUP([MATRIX - PRINT])
2106 AT_DATA([matrix.sps], [dnl
2107 MATRIX.
2108 PRINT/TITLE="title 1".
2109 PRINT/SPACE=2/TITLE="title 2".
2110
2111 COMPUTE m={1, 2, 3; 3, 4, 5; 6, 7, 8}.
2112 PRINT m/RLABELS=123, a b c, long name.
2113 PRINT m/RNAMES={'123', 'a b c', 'long name'}.
2114 PRINT m/CLABELS=col1, col2, long column name.
2115 PRINT m/CNAMES={'col1', 'col2', 'long column name'}.
2116 PRINT m/RLABELS=123, a b c, long name
2117        /CLABELS=col1, col2, long column name.
2118 PRINT m/RNAMES={'123', 'a b c', 'long name'}
2119        /CNAMES={'col1', 'col2', 'long column name'}.
2120 PRINT {123e10, 456e10, 500}.
2121 END MATRIX.
2122 ])
2123
2124 AT_DATA([matrix-tables.sps], [dnl
2125 SET MDISPLAY=TABLES.
2126 INCLUDE 'matrix.sps'.
2127 ])
2128
2129 AT_CHECK([pspp matrix.sps], [0], [dnl
2130 title 1
2131
2132
2133
2134 title 2
2135
2136 m
2137 123       1  2  3
2138 a b c     3  4  5
2139 long nam  6  7  8
2140
2141 m
2142 123       1  2  3
2143 a b c     3  4  5
2144 long nam  6  7  8
2145
2146 m
2147      col1     col2 long col
2148         1        2        3
2149         3        4        5
2150         6        7        8
2151
2152 m
2153      col1     col2 long col
2154         1        2        3
2155         3        4        5
2156         6        7        8
2157
2158 m
2159              col1     col2 long col
2160 123             1        2        3
2161 a b c           3        4        5
2162 long nam        6        7        8
2163
2164 m
2165              col1     col2 long col
2166 123             1        2        3
2167 a b c           3        4        5
2168 long nam        6        7        8
2169
2170 {123e10, 456e10, 500}
2171   10 ** 12   X
2172   1.2300000000  4.5600000000   .0000000005
2173 ])
2174
2175 AT_CHECK([pspp matrix-tables.sps], [0], [dnl
2176 title 1
2177
2178
2179
2180 title 2
2181
2182         m
2183 +---------+-----+
2184 |123      |1 2 3|
2185 |a b c    |3 4 5|
2186 |long name|6 7 8|
2187 +---------+-----+
2188
2189         m
2190 +--------+-----+
2191 |123     |1 2 3|
2192 |a b c   |3 4 5|
2193 |long nam|6 7 8|
2194 +--------+-----+
2195
2196               m
2197 +----+----+----------------+
2198 |col1|col2|long column name|
2199 +----+----+----------------+
2200 |   1|   2|               3|
2201 |   3|   4|               5|
2202 |   6|   7|               8|
2203 +----+----+----------------+
2204
2205           m
2206 +----+----+--------+
2207 |col1|col2|long col|
2208 +----+----+--------+
2209 |   1|   2|       3|
2210 |   3|   4|       5|
2211 |   6|   7|       8|
2212 +----+----+--------+
2213
2214                    m
2215 +---------+----+----+----------------+
2216 |         |col1|col2|long column name|
2217 +---------+----+----+----------------+
2218 |123      |   1|   2|               3|
2219 |a b c    |   3|   4|               5|
2220 |long name|   6|   7|               8|
2221 +---------+----+----+----------------+
2222
2223               m
2224 +--------+----+----+--------+
2225 |        |col1|col2|long col|
2226 +--------+----+----+--------+
2227 |123     |   1|   2|       3|
2228 |a b c   |   3|   4|       5|
2229 |long nam|   6|   7|       8|
2230 +--------+----+----+--------+
2231
2232               {123e10, 456e10, 500}
2233 +----------------------------------------------+
2234 |1.2300000000[[a]] 4.5600000000[[a]] .0000000005[[a]]|
2235 +----------------------------------------------+
2236 a. × 10**12
2237 ])
2238 AT_CLEANUP
2239
2240 AT_SETUP([MATRIX - DO IF])
2241 AT_DATA([matrix.sps], [dnl
2242 MATRIX.
2243 DO IF 1.
2244 PRINT/TITLE '1'.
2245 END IF.
2246
2247 DO IF 0.
2248 PRINT/TITLE '2'.
2249 ELSE IF 1.
2250 PRINT/TITLE '3'.
2251 END IF.
2252
2253 DO IF -1.
2254 PRINT/TITLE '4'.
2255 ELSE IF 0.
2256 PRINT/TITLE '5'.
2257 ELSE.
2258 PRINT/TITLE '6'.
2259 END IF.
2260
2261 DO IF {1, 2}.
2262 END IF.
2263
2264 DO IF 0.
2265 ELSE IF {}.
2266 END IF.
2267 END MATRIX.
2268 ])
2269 AT_CHECK([pspp matrix.sps], [1], [dnl
2270 1
2271
2272 3
2273
2274 6
2275
2276 matrix.sps:21: error: MATRIX: Expression for DO IF must evaluate to scalar, not
2277 a 1×2 matrix.
2278
2279 matrix.sps:25: error: MATRIX: Expression for ELSE IF must evaluate to scalar,
2280 not a 0×0 matrix.
2281 ])
2282 AT_CLEANUP
2283
2284 AT_SETUP([MATRIX - unbounded LOOP])
2285 AT_DATA([matrix.sps], [dnl
2286 MATRIX.
2287 * Truly unbounded loop.
2288 COMPUTE x=0.
2289 COMPUTE y={}.
2290 LOOP.
2291 COMPUTE x=x+1.
2292 COMPUTE y={y, x}.
2293 END LOOP.
2294 PRINT x.
2295 PRINT y.
2296
2297 * Unbounded loop terminates with BREAK.
2298 COMPUTE x=0.
2299 COMPUTE y={}.
2300 LOOP.
2301 COMPUTE x=x+1.
2302 COMPUTE y={y, x}.
2303 DO IF x >= 20.
2304     BREAK.
2305 END IF.
2306 END LOOP.
2307 PRINT x.
2308 PRINT y.
2309
2310 END MATRIX.
2311 ])
2312 AT_CHECK([pspp matrix.sps], [0], [dnl
2313 x
2314   40
2315
2316 y
2317    1   2   3   4   5   6   7   8   9  10  11  12  13  14  15  16  17  18  19
2318 20  21  22  23  24  25  26  27  28  29  30  31  32  33  34  35  36  37  38  39
2319 40
2320
2321 x
2322   20
2323
2324 y
2325    1   2   3   4   5   6   7   8   9  10  11  12  13  14  15  16  17  18  19
2326 20
2327 ])
2328 AT_CLEANUP
2329
2330 AT_SETUP([MATRIX - indexed or conditional LOOP])
2331 AT_DATA([matrix.sps], [dnl
2332 MATRIX.
2333 * Indexed loop terminates based on index.
2334 COMPUTE y={}.
2335 LOOP x=1 TO 20.
2336 COMPUTE y={y, x}.
2337 END LOOP.
2338 PRINT x.
2339 PRINT y.
2340
2341 * Indexed loop terminates based on MXLOOPS.
2342 COMPUTE y={}.
2343 LOOP x=1 TO 50.
2344 COMPUTE y={y, x}.
2345 END LOOP.
2346 PRINT x.
2347 PRINT y.
2348
2349 * Indexed loop terminates with BREAK.
2350 COMPUTE y={}.
2351 LOOP x=1 TO 50.
2352 COMPUTE y={y, x}.
2353 DO IF x >= 20.
2354     BREAK.
2355 END IF.
2356 END LOOP.
2357 PRINT x.
2358 PRINT y.
2359
2360 * Indexed loop terminates with top IF.
2361 COMPUTE y={}.
2362 LOOP x=1 TO 50 IF NCOL(y) < 15.
2363 COMPUTE y={y, x}.
2364 END LOOP.
2365 PRINT x.
2366 PRINT y.
2367
2368 * Indexed loop terminates with bottom IF.
2369 COMPUTE y={}.
2370 LOOP x=1 TO 50.
2371 COMPUTE y={y, x}.
2372 END LOOP IF NCOL(y) >= 22.
2373 PRINT x.
2374 PRINT y.
2375
2376 * Index behavior.
2377 COMPUTE indexing={
2378     1, 10, 1;
2379     1, 10, 2;
2380     1, 10, 3;
2381     1, 10, -1;
2382     1, 10, 0;
2383     10, 1, -1;
2384     10, 1, -2;
2385     10, 1, -3;
2386     10, 1, 1;
2387     10, 1, 0
2388 }.
2389 LOOP i=1 TO NROW(indexing).
2390     COMPUTE y={}.
2391     LOOP j=indexing(i, 1) TO indexing(i, 2) BY indexing(i, 3).
2392         COMPUTE y={y, j}.
2393     END LOOP.
2394     PRINT {indexing(i, :), y}.
2395 END LOOP.
2396
2397 LOOP i={} TO 5.
2398 END LOOP.
2399         
2400 LOOP i=5 TO {}.
2401 END LOOP.
2402
2403 LOOP i=5 TO 8 BY {}.
2404 END LOOP.
2405
2406 LOOP IF {}.
2407 END LOOP.
2408
2409 LOOP.
2410 END LOOP IF {}.
2411
2412 LOOP i=1e100 to 1e200.
2413 END LOOP.
2414 END MATRIX.
2415 ])
2416 AT_CHECK([pspp matrix.sps], [1], [dnl
2417 x
2418   20
2419
2420 y
2421    1   2   3   4   5   6   7   8   9  10  11  12  13  14  15  16  17  18  19
2422 20
2423
2424 x
2425   40
2426
2427 y
2428    1   2   3   4   5   6   7   8   9  10  11  12  13  14  15  16  17  18  19
2429 20  21  22  23  24  25  26  27  28  29  30  31  32  33  34  35  36  37  38  39
2430 40
2431
2432 x
2433   20
2434
2435 y
2436    1   2   3   4   5   6   7   8   9  10  11  12  13  14  15  16  17  18  19
2437 20
2438
2439 x
2440   16
2441
2442 y
2443    1   2   3   4   5   6   7   8   9  10  11  12  13  14  15
2444
2445 x
2446   22
2447
2448 y
2449    1   2   3   4   5   6   7   8   9  10  11  12  13  14  15  16  17  18  19
2450 20  21  22
2451
2452 {indexing(i, :), y}
2453    1  10   1   1   2   3   4   5   6   7   8   9  10
2454 {indexing(i, :), y}
2455    1  10   2   1   3   5   7   9
2456 {indexing(i, :), y}
2457    1  10   3   1   4   7  10
2458 {indexing(i, :), y}
2459    1  10  -1
2460 {indexing(i, :), y}
2461    1  10   0
2462 {indexing(i, :), y}
2463   10   1  -1  10   9   8   7   6   5   4   3   2   1
2464 {indexing(i, :), y}
2465   10   1  -2  10   8   6   4   2
2466 {indexing(i, :), y}
2467   10   1  -3  10   7   4   1
2468 {indexing(i, :), y}
2469   10   1   1
2470 {indexing(i, :), y}
2471   10   1   0
2472
2473 matrix.sps:67: error: MATRIX: Expression for LOOP must evaluate to scalar, not
2474 a 0×0 matrix.
2475
2476 matrix.sps:70: error: MATRIX: Expression for TO must evaluate to scalar, not a
2477 0×0 matrix.
2478
2479 matrix.sps:73: error: MATRIX: Expression for BY must evaluate to scalar, not a
2480 0×0 matrix.
2481
2482 matrix.sps:76: error: MATRIX: Expression for LOOP IF must evaluate to scalar,
2483 not a 0×0 matrix.
2484
2485 matrix.sps:79: error: MATRIX: Expression for END LOOP IF must evaluate to
2486 scalar, not a 0×0 matrix.
2487
2488 matrix.sps:82: error: MATRIX: Expression for LOOP is outside the integer range.
2489 ])
2490 AT_CLEANUP
2491
2492 AT_SETUP([MATRIX - BREAK outside LOOP])
2493 AT_DATA([matrix.sps], [dnl
2494 MATRIX.
2495 BREAK.
2496 END MATRIX.
2497 ])
2498 AT_CHECK([pspp matrix.sps], [1], [dnl
2499 matrix.sps:2: error: BREAK: BREAK not inside LOOP.
2500 ])
2501 AT_CLEANUP
2502
2503 AT_SETUP([MATRIX - READ])
2504 AT_DATA([matrix.txt], [dnl
2505 1 2 3
2506 4 5 6
2507 7 8 9
2508 10 11 12,13
2509 14, 15 ,16 , 17
2510 18
2511 19
2512 20 21 22 23
2513     12        34
2514 5    6
2515     78        89
2516 10   11
2517 ])
2518 AT_DATA([matrix2.txt], [dnl
2519 2, 3, 5, 7
2520 11, 13, 17, 19
2521 23, 29, 31, 37
2522 41, 43, 47, 53
2523 ])
2524 AT_DATA([matrix.sps], [dnl
2525 MATRIX.
2526 READ x/FILE='matrix.txt'/SIZE={3,3}/FIELD=1 TO 80.
2527 PRINT x.
2528 READ x/SIZE={2,4}/FIELD=1 TO 80.
2529 PRINT x.
2530 READ x(:,2)/FILE='matrix.txt'/FIELD=1 TO 80.
2531 PRINT x.
2532 READ x(1,:)/SIZE={1,4}/FIELD=1 TO 80.
2533 PRINT x.
2534
2535 READ x/SIZE={2,6}/FIELD=1 TO 20 BY 5.
2536 PRINT x.
2537
2538 COMPUTE y={}.
2539 LOOP IF NOT EOF('matrix2.txt').
2540 READ x/FILE='matrix2.txt'/SIZE={1,4}/FIELD=1 TO 80.
2541 COMPUTE y={y; x}.
2542 END LOOP.
2543 PRINT y.
2544 END MATRIX.
2545 ])
2546 AT_CHECK([pspp matrix.sps], [0], [dnl
2547 x
2548   1  2  3
2549   4  5  6
2550   7  8  9
2551
2552 x
2553   10  11  12  13
2554   14  15  16  17
2555
2556 x
2557   10  18  12  13
2558   14  19  16  17
2559
2560 x
2561   20  21  22  23
2562   14  19  16  17
2563
2564 x
2565    1   2   3   4   5   6
2566    7   8   8   9  10  11
2567
2568 y
2569    2   3   5   7
2570   11  13  17  19
2571   23  29  31  37
2572   41  43  47  53
2573 ])
2574 AT_CLEANUP