3 AT_SETUP([MATRIX - empty matrices])
4 AT_DATA([matrix.sps], [dnl
8 COMPUTE b={a; 1; 2; 3}.
10 COMPUTE c={a, 1, 2, 3}.
14 AT_CHECK([pspp matrix.sps], [0], [dnl
27 AT_SETUP([MATRIX - submatrices as rvalues - all columns or all rows])
28 AT_DATA([matrix.sps], [dnl
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}({}, :).
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}(:, {}).
50 PRINT {1, 2, 3; 4, 5, 6; 7, 8, 9}(:, :).
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).
61 PRINT {1, 2, 3, 4}({1, 2; 3, 4}, :).
62 PRINT {1, 2, 3, 4}(:, {1, 2; 3, 4}).
65 AT_CHECK([pspp matrix.sps], [1], [dnl
66 {1, 2, 3; 4, 5, 6; 7, 8, 9}(1, :)
69 {1, 2, 3; 4, 5, 6; 7, 8, 9}({1}, :)
72 {1, 2, 3; 4, 5, 6; 7, 8, 9}({1, 2}, :)
76 {1, 2, 3; 4, 5, 6; 7, 8, 9}({1, 2, 3}, :)
81 {1, 2, 3; 4, 5, 6; 7, 8, 9}({1; 3; 2}, :)
86 {1, 2, 3; 4, 5, 6; 7, 8, 9}({1, 3, 3}, :)
91 {1, 2, 3; 4, 5, 6; 7, 8, 9}(1:2, :)
95 {1, 2, 3; 4, 5, 6; 7, 8, 9}(1:3, :)
100 {1, 2, 3; 4, 5, 6; 7, 8, 9}({}, :)
102 {1, 2, 3; 4, 5, 6; 7, 8, 9}(:, 1)
107 {1, 2, 3; 4, 5, 6; 7, 8, 9}(:, {1})
112 {1, 2, 3; 4, 5, 6; 7, 8, 9}(:, {1, 2})
117 {1, 2, 3; 4, 5, 6; 7, 8, 9}(:, {1, 2, 3})
122 {1, 2, 3; 4, 5, 6; 7, 8, 9}(:, {1; 3; 2})
127 {1, 2, 3; 4, 5, 6; 7, 8, 9}(:, {1, 3, 3})
132 {1, 2, 3; 4, 5, 6; 7, 8, 9}(:, 1:2)
137 {1, 2, 3; 4, 5, 6; 7, 8, 9}(:, 1:3)
142 {1, 2, 3; 4, 5, 6; 7, 8, 9}(:, {})
146 {1, 2, 3; 4, 5, 6; 7, 8, 9}(:, :)
151 matrix.sps:24: error: MATRIX: 0 is not a valid row index for a 3×3 matrix.
153 matrix.sps:25: error: MATRIX: 0 is not a valid column index for a 3×3 matrix.
155 matrix.sps:26: error: MATRIX: 4 is not a valid row index for a 3×3 matrix.
157 matrix.sps:27: error: MATRIX: 4 is not a valid column index for a 3×3 matrix.
165 matrix.sps:33: error: MATRIX: Matrix row index must be scalar or vector, not a
168 matrix.sps:34: error: MATRIX: Matrix column index must be scalar or vector, not
173 AT_SETUP([MATRIX - COMPUTE submatrices as lvalues])
174 AT_DATA([matrix.sps], [dnl
176 COMPUTE y={1, 2, 3; 4, 5, 6; 7, 8, 9}.
179 COMPUTE x1(1, :) = {11, 12, 13}.
183 COMPUTE x2(2, :) = {14, 15, 16}.
187 COMPUTE x3(3, :) = {17, 18, 19}.
191 COMPUTE x4(:, 1) = {11; 14; 17}.
195 COMPUTE x5(:, 2) = {12; 15; 18}.
199 COMPUTE x6(:, 3) = {13; 16; 19}.
203 COMPUTE x7(1, 1) = 11.
207 COMPUTE x8(1:2, 2:3) = {12, 13; 15, 16}.
211 COMPUTE x9({3, 1}, {2; 3}) = {18, 19; 12, 13}.
215 AT_CHECK([pspp matrix.sps], [0], [dnl
263 AT_SETUP([MATRIX - COMPUTE submatrices as lvalues - negative])
264 AT_DATA([matrix.sps], [dnl
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}.
278 COMPUTE x({1, 0, 2}, 1) = {1; 2; 3}.
281 COMPUTE x({1, 2; 3, 4}, 5) = 1.
282 COMPUTE x(3, {1, 2; 3, 4}) = 1.
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.
290 matrix.sps:4: error: MATRIX: Column index vector for assignment to x has 3
291 elements but source matrix has 1 columns.
293 matrix.sps:5: error: MATRIX: Column index vector for assignment to x has 3
294 elements but source matrix has 2 columns.
296 matrix.sps:6: error: MATRIX: Column index vector for assignment to x has 3
297 elements but source matrix has 4 columns.
299 matrix.sps:7: error: MATRIX: Row index vector for assignment to x has 3
300 elements but source matrix has 0 rows.
302 matrix.sps:8: error: MATRIX: Row index vector for assignment to x has 3
303 elements but source matrix has 1 rows.
305 matrix.sps:9: error: MATRIX: Row index vector for assignment to x has 3
306 elements but source matrix has 1 rows.
308 matrix.sps:10: error: MATRIX: Row index vector for assignment to x has 3
309 elements but source matrix has 1 rows.
311 matrix.sps:11: error: MATRIX: Can't use vector indexing on 3×3 matrix x.
313 matrix.sps:12: error: MATRIX: 0 is not a valid row index for a 3×3 matrix.
315 matrix.sps:13: error: MATRIX: 0 is not a valid column index for a 3×3 matrix.
317 matrix.sps:14: error: MATRIX: 0 is not a valid row index for a 3×3 matrix.
319 matrix.sps:15: error: MATRIX: 4 is not a valid row index for a 3×3 matrix.
321 matrix.sps:16: error: MATRIX: 4 is not a valid column index for a 3×3 matrix.
323 matrix.sps:17: error: MATRIX: Matrix row index must be scalar or vector, not a
326 matrix.sps:18: error: MATRIX: Matrix column index must be scalar or vector, not
336 AT_SETUP([MATRIX - subvectors as rvalues])
337 AT_DATA([matrix.sps], [dnl
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}(:).
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}(:).
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).
367 AT_CHECK([pspp matrix.sps], [1], [dnl
429 matrix.sps:24: error: MATRIX: Vector index operator may not be applied to a 2×2
432 matrix.sps:25: error: MATRIX: Vector index must be scalar or vector, not a 2×2
435 matrix.sps:26: error: MATRIX: Index 0 is out of range for vector with 4
438 matrix.sps:27: error: MATRIX: Index 5 is out of range for vector with 4
443 AT_SETUP([MATRIX - COMPUTE subvectors as lvalues])
444 AT_DATA([matrix.sps], [dnl
446 COMPUTE r={1, 2, 3, 4, 5, 6, 7, 8, 9}.
449 COMPUTE r1(:) = {11, 12, 13, 14, 15, 16, 17, 18, 19}.
453 COMPUTE r2(:) = {11; 12; 13; 14; 15; 16; 17; 18; 19}.
461 COMPUTE r4(1:2) = {11:12}.
465 COMPUTE r5({8;9}) = {18:19}.
468 COMPUTE c={1, 2, 3, 4, 5, 6, 7, 8, 9}.
471 COMPUTE c1(:) = {11, 12, 13, 14, 15, 16, 17, 18, 19}.
475 COMPUTE c2(:) = {11; 12; 13; 14; 15; 16; 17; 18; 19}.
483 COMPUTE c4(1:2) = {11:12}.
487 COMPUTE c5(8:9) = {18:19}.
491 AT_CHECK([pspp matrix.sps], [0], [dnl
493 11 12 13 14 15 16 17 18 19
496 11 12 13 14 15 16 17 18 19
508 11 12 13 14 15 16 17 18 19
511 11 12 13 14 15 16 17 18 19
524 AT_SETUP([MATRIX - COMPUTE subvectors as lvalues - negative])
525 AT_DATA([matrix.sps], [dnl
527 COMPUTE r={1, 2, 3, 4, 5, 6, 7, 8, 9}.
528 COMPUTE r(1:3) = {1, 2; 3, 4}.
530 COMPUTE r(1:3) = {1}.
531 COMPUTE r(1:3) = {1, 2}.
532 COMPUTE r(1:3) = {1, 2, 3, 4}.
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}.
540 COMPUTE r({1, 2; 3, 4}) = 1.
542 COMPUTE c={1, 2, 3, 4, 5, 6, 7, 8, 9}.
543 COMPUTE c(1:3) = {1, 2; 3, 4}.
545 COMPUTE c(1:3) = {1}.
546 COMPUTE c(1:3) = {1, 2}.
547 COMPUTE c(1:3) = {1, 2, 3, 4}.
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}.
555 COMPUTE c({1, 2; 3, 4}) = 1.
557 COMPUTE m = {1, 2; 3, 4}.
562 AT_CHECK([pspp matrix.sps], [1], [dnl
563 matrix.sps:3: error: MATRIX: Can't assign 2×2 matrix to subvector.
565 matrix.sps:4: error: MATRIX: Can't assign 0-element vector to 3-element
568 matrix.sps:5: error: MATRIX: Can't assign 1-element vector to 3-element
571 matrix.sps:6: error: MATRIX: Can't assign 2-element vector to 3-element
574 matrix.sps:7: error: MATRIX: Can't assign 4-element vector to 3-element
577 matrix.sps:8: error: MATRIX: Can't assign 0-element vector to 3-element
580 matrix.sps:9: error: MATRIX: Can't assign 1-element vector to 3-element
583 matrix.sps:10: error: MATRIX: Can't assign 2-element vector to 3-element
586 matrix.sps:11: error: MATRIX: Can't assign 4-element vector to 3-element
589 matrix.sps:12: error: MATRIX: Can't assign 4-element vector to 9-element
592 matrix.sps:13: error: MATRIX: Index 0 is out of range for vector with 9
595 matrix.sps:14: error: MATRIX: Index 10 is out of range for vector with 9
598 matrix.sps:15: error: MATRIX: Vector index must be scalar or vector, not a 2×2
601 matrix.sps:18: error: MATRIX: Can't assign 2×2 matrix to subvector.
603 matrix.sps:19: error: MATRIX: Can't assign 0-element vector to 3-element
606 matrix.sps:20: error: MATRIX: Can't assign 1-element vector to 3-element
609 matrix.sps:21: error: MATRIX: Can't assign 2-element vector to 3-element
612 matrix.sps:22: error: MATRIX: Can't assign 4-element vector to 3-element
615 matrix.sps:23: error: MATRIX: Can't assign 0-element vector to 3-element
618 matrix.sps:24: error: MATRIX: Can't assign 1-element vector to 3-element
621 matrix.sps:25: error: MATRIX: Can't assign 2-element vector to 3-element
624 matrix.sps:26: error: MATRIX: Can't assign 4-element vector to 3-element
627 matrix.sps:27: error: MATRIX: Can't assign 4-element vector to 9-element
630 matrix.sps:28: error: MATRIX: Index 0 is out of range for vector with 9
633 matrix.sps:29: error: MATRIX: Index 10 is out of range for vector with 9
636 matrix.sps:30: error: MATRIX: Vector index must be scalar or vector, not a 2×2
639 matrix.sps:33: error: MATRIX: Can't use vector indexing on 2×2 matrix m.
641 matrix.sps:34: error: MATRIX: Can't use vector indexing on 2×2 matrix m.
645 AT_SETUP([MATRIX - COMPUTE - negative])
646 AT_DATA([matrix.sps], [dnl
654 AT_CHECK([pspp matrix.sps], [1], [dnl
655 matrix.sps:2.10: error: COMPUTE: Syntax error at end of command: expecting `='.
657 matrix.sps:3.11: error: COMPUTE: Syntax error at end of command.
659 matrix.sps:4: error: MATRIX: Undefined variable x.
661 matrix.sps:5: error: COMPUTE: Undefined variable y.
665 AT_SETUP([MATRIX - elementwise arithmetic operators])
666 AT_DATA([matrix.sps], [dnl
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}).
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}).
681 PRINT ({1,2;3,4} * 5).
682 PRINT (5 * {5,6;7,8}).
684 PRINT ({2,4;6,8} / 2).
685 PRINT (12 / {1,2;3,4}).
686 PRINT ({2,8;18,32} / {1,2;3,4}).
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}).
693 PRINT ({2,4;6,8} &/ 2).
694 PRINT (12 &/ {1,2;3,4}).
695 PRINT ({2,8;18,32} &/ {1,2;3,4}).
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}).
703 AT_CHECK([pspp matrix.sps], [1], [dnl
711 ({1,2;3,4} + {5,6;7,8})
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.
726 ({1,2;3,4} - {5,6;7,8})
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.
757 ({2,8;18,32} / {1,2;3,4})
761 ({1,2;3,4} &* {5,6;7,8})
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.
784 ({2,8;18,32} &/ {1,2;3,4})
796 ({1,2;3,4} &** {2,3;4,5})
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.
805 AT_SETUP([MATRIX - relational operators])
806 AT_DATA([matrix.sps], [dnl
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}).
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}).
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}).
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}).
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}).
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}).
839 AT_CHECK([pspp matrix.sps], [1], [dnl
840 ({1, 1; 2, 2} > {1, 2; 1, 2})
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.
855 ({1, 1; 2, 2} < {1, 2; 1, 2})
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.
870 ({1, 1; 2, 2} <> {1, 2; 1, 2})
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.
885 ({1, 1; 2, 2} >= {1, 2; 1, 2})
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.
900 ({1, 1; 2, 2} <= {1, 2; 1, 2})
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.
915 ({1, 1; 2, 2} = {1, 2; 1, 2})
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.
932 AT_SETUP([MATRIX - logical operators])
933 AT_DATA([matrix.sps], [dnl
935 PRINT (NOT {-1, 0, 1}).
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}).
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}).
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}).
956 AT_CHECK([pspp matrix.sps], [1], [dnl
960 ({-1, 0, 1; -1, 0, 1; -1, 0, 1} AND {-1, -1, -1; 0, 0, 0; 1, 1, 1})
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.
977 ({-1, 0, 1; -1, 0, 1; -1, 0, 1} OR {-1, -1, -1; 0, 0, 0; 1, 1, 1})
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.
994 ({-1, 0, 1; -1, 0, 1; -1, 0, 1} XOR {-1, -1, -1; 0, 0, 0; 1, 1, 1})
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.
1013 AT_SETUP([MATRIX - matrix operators])
1014 AT_DATA([matrix.sps], [dnl
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}.
1028 PRINT {3, 3.5; 3.2, 3.6}**-1/FORMAT F6.2.
1030 PRINT ({1, 2, 3} * {1, 2}).
1036 AT_CHECK([pspp matrix.sps], [1], [dnl
1037 ({0, 1; 0, 0} * {0, 0; 1, 0})
1041 ({0, 0; 1, 0} * {0, 1; 0, 0})
1045 ({1, 2, 3; 4, 5, 6} * {7, 8; 9, 10; 11, 12})
1049 ({3, 4, 2} * {13, 9, 7, 15; 8, 7, 4, 6; 6, 4, 0, 3})
1094 {3, 3.5; 3.2, 3.6}**-1
1098 matrix.sps:16: error: MATRIX: Matrices with dimensions 1×3 and 1×2 are not
1099 conformable for multiplication.
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.
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.
1107 matrix.sps:19: error: MATRIX: Exponent 1.5 in matrix multiplication is non-
1108 integer or outside the valid range.
1112 AT_SETUP([MATRIX - sequences and construction])
1113 AT_DATA([matrix.sps], [dnl
1135 AT_CHECK([pspp matrix.sps], [1], [dnl
1164 matrix.sps:12: error: MATRIX: The increment operand to : must be nonzero.
1166 matrix.sps:13: error: MATRIX: The increment operand to : must be nonzero.
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.
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.
1176 AT_SETUP([MATRIX - comments])
1177 AT_DATA([matrix.sps], [dnl
1181 COMMENT Comment two.
1185 AT_CHECK([pspp matrix.sps], [0], [dnl
1194 AT_SETUP([MATRIX - string matrices])
1195 AT_DATA([matrix.sps], [dnl
1197 COMPUTE m={'This is', 'a string', 'matrix', 'including', 'some', 'long strings'}.
1201 AT_CHECK([pspp matrix.sps], [0], [dnl
1203 This is a string matrix includin some long str
1207 AT_SETUP([MATRIX - ABS ALL ANY ARSIN ARTAN])
1208 AT_DATA([matrix.sps], [dnl
1210 PRINT ABS({-1, 0, 1}).
1212 PRINT ALL({0, 0, 0}).
1214 PRINT ALL({-1, 0, 1}).
1216 PRINT ANY({0, 0, 0}).
1218 PRINT ANY({-1, 0, 1}).
1220 PRINT ARSIN({-1, 0, 1})/FORMAT=F5.2.
1222 PRINT ARTAN({-5, -1, 0, 1, 5})/FORMAT=F5.2.
1225 AT_CHECK([pspp matrix.sps], [0], [dnl
1250 ARTAN({-5, -1, 0, 1, 5})
1251 -1.37 -.79 .00 .79 1.37
1255 AT_SETUP([MATRIX - BLOCK CHOL CMAX CMIN COS])
1256 AT_DATA([matrix.sps], [dnl
1258 PRINT BLOCK({1, 2; 3, 4}, 5, {7; 8; 9}, {10, 11}).
1260 COMPUTE b=CHOL({4, 12, -16; 12, 37, -43; -16, -43, 98}).
1264 PRINT CMAX({9, 3, 4; 5, 8, 6; 7, 4, 11}).
1266 PRINT CMIN({9, 3, 4; 5, 8, 6; 7, 4, 11}).
1268 PRINT COS({0.785, 1.57; 3.14, 1.57 + 3.14}) /FORMAT=F5.2.
1272 AT_CHECK([pspp matrix.sps], [0], [dnl
1273 BLOCK({1, 2; 3, 4}, 5, {7; 8; 9}, {10, 11})
1292 CMAX({9, 3, 4; 5, 8, 6; 7, 4, 11})
1295 CMIN({9, 3, 4; 5, 8, 6; 7, 4, 11})
1298 COS({0.785, 1.57; 3.14, 1.57 + 3.14})
1304 AT_SETUP([MATRIX - CSSQ CSUM DESIGN DET DIAG])
1305 AT_DATA([matrix.sps], [dnl
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}).
1315 AT_CHECK([pspp matrix.sps], [0], [dnl
1316 CSSQ({1, 2, 3; 4, 5, 6; 7, 8, 9})
1319 CSUM({1, 2, 3; 4, 5, 6; 7, 8, 9})
1322 DESIGN({1, 2, 0; 2, 1, 0; 3, 0, 1})
1327 warning: Column 2 in DESIGN argument has constant value.
1329 DESIGN({1, 2, 0; 2, 2, 0; 3, 2, 1})
1334 DET({1, 2, 3; 4, 5, 6; 7, 8, 9})
1337 DIAG({1, 2, 3, 4; 4, 5, 6, 7; 7, 8, 9, 10})
1344 AT_SETUP([MATRIX - EVAL EXP GINV GRADE GSCH])
1345 AT_DATA([matrix.sps], [dnl
1347 PRINT EVAL({2, 0, 0; 0, 3, 4; 0, 4, 9}).
1349 PRINT EXP({2, 3; 4, 5})/FORMAT F5.2.
1351 PRINT GINV({1, 2})/FORMAT F5.2.
1352 COMPUTE a={1, 2, 3; 4, 5, 6; 7, 8, 9}.
1354 PRINT (a*g*a)/FORMAT F5.2.
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}.
1359 COMPUTE asort(GRADE(asort))=asort.
1362 COMPUTE dsort(GRADE(-dsort))=dsort.
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.
1368 PRINT GSCH({0, 0, 0; 0, 0, 0}).
1371 AT_CHECK([pspp matrix.sps], [1], [dnl
1372 EVAL({2, 0, 0; 0, 3, 4; 0, 4, 9})
1390 GRADE({1, 0, 3; 3, 1, 2; 3, 0, 5})
1396 26 208 323 585 671 690 711 732 792 818
1399 818 792 732 711 690 671 585 323 208 26
1401 (GSCH({3, 2; 1, 2}) * SQRT(10))
1405 (GSCH({0, 3, 6, 2; 0, 1, 2, 2}) * SQRT(10))
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).
1412 matrix.sps:23: error: MATRIX: 2×3 argument to GSCH contains only 0 linearly
1413 independent columns.
1417 AT_SETUP([MATRIX - IDENT INV KRONEKER LG10 LN])
1418 AT_DATA([matrix.sps], [dnl
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.
1429 PRINT KRONEKER({1, 2; 3, 4}, {0, 5; 6, 7}).
1431 PRINT LG10({1, 10, 100, 1000}).
1433 PRINT LN({1, 2; 3, 4})/FORMAT F5.2.
1437 AT_CHECK([pspp matrix.sps], [0], [dnl
1457 INV({3, 3.5; 3.2, 3.6})
1465 (INV({4, -2, 1; 5, 0, 3; -1, 2, 6})*52)
1470 KRONEKER({1, 2; 3, 4}, {0, 5; 6, 7})
1476 LG10({1, 10, 100, 1000})
1485 AT_SETUP([MATRIX - MAGIC])
1486 AT_DATA([matrix.sps], [dnl
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.
1498 AT_CHECK([pspp matrix.sps], [0], [dnl
1524 0 24 14 22 18 17 16 0
1525 0 13 23 15 19 20 21 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
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
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
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
1578 AT_SETUP([MATRIX - MAKE MDIAG MMAX MMIN MOD])
1579 AT_DATA([matrix.sps], [dnl
1581 PRINT MAKE(1, 2, 3).
1582 PRINT MAKE(2, 1, 4).
1583 PRINT MAKE(2, 3, 5).
1585 PRINT MDIAG({1, 2, 3, 4}).
1586 PRINT MDIAG({1; 2; 3; 4}).
1587 PRINT MDIAG({1, 2; 3, 4}).
1589 PRINT MMAX({55, 44; 66, 11}).
1591 PRINT MMIN({55, 44; 66, 11}).
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).
1601 AT_CHECK([pspp matrix.sps], [1], [dnl
1625 matrix.sps:8: error: MATRIX: Function MDIAG argument 1 must be a vector, not a
1628 MMAX({55, 44; 66, 11})
1631 MMIN({55, 44; 66, 11})
1634 MOD({5, 4, 3, 2, 1, 0}, 3)
1637 MOD({5, 4, 3, 2, 1, 0}, -3)
1640 MOD({-5, -4, -3, -2, -1, 0}, 3)
1643 MOD({-5, -4, -3, -2, -1, 0}, -3)
1646 MOD({5, 4, 3, 2, 1, 0}, 1.5)
1649 matrix.sps:19: error: MATRIX: Divisor argument to MOD function must be nonzero.
1653 AT_SETUP([MATRIX - MSSQ MSUM NCOL NROW RANK])
1654 AT_DATA([matrix.sps], [dnl
1656 PRINT MSSQ({1, 0, 1; -2, -3, 1; 3, 3, 0}).
1658 PRINT MSUM({1, 0, 1; -2, -3, 1; 3, 3, 0}).
1660 PRINT NCOL({1, 0; -2, -3; 3, 3}).
1662 PRINT NROW({1, 0; -2, -3; 3, 3}).
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}).
1671 AT_CHECK([pspp matrix.sps], [0], [dnl
1672 MSSQ({1, 0, 1; -2, -3, 1; 3, 3, 0})
1675 MSUM({1, 0, 1; -2, -3, 1; 3, 3, 0})
1678 NCOL({1, 0; -2, -3; 3, 3})
1681 NROW({1, 0; -2, -3; 3, 3})
1684 RANK({1, 0, 1; -2, -3, 1; 3, 3, 0})
1687 RANK({1, 1, 0, 2; -1, -1, 0, -2})
1690 RANK({1, -1; 1, -1; 0, 0; 2, -2})
1693 RANK({1, 2, 1; -2, -3, 1; 3, 5, 0})
1696 RANK({1, 0, 2; 2, 1, 0; 3, 2, 1})
1701 AT_SETUP([MATRIX - RESHAPE RMAX RMIN RND RNKORDER])
1702 AT_DATA([matrix.sps], [dnl
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).
1711 PRINT RMAX({1, 0, 1; -2, -3, 1; 3, 3, 0}).
1713 PRINT RMIN({1, 0, 1; -2, -3, 1; 3, 3, 0}).
1715 PRINT RND({-1.6, -1.5, -1.4;
1718 1.4, 1.5, 1.6})/FORMAT F5.1.
1720 PRINT RNKORDER({1, 0, 3; 3, 1, 2; 3, 0, 5}) /FORMAT F5.1.
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
1750 RESHAPE(1:12, 12, 1)
1764 RMAX({1, 0, 1; -2, -3, 1; 3, 3, 0})
1769 RMIN({1, 0, 1; -2, -3, 1; 3, 3, 0})
1774 RND({-1.6, -1.5, -1.4;
1783 RNKORDER({1, 0, 3; 3, 1, 2; 3, 0, 5})
1790 AT_SETUP([MATRIX - RSSQ RSUM SIN SOLVE SQRT])
1791 AT_DATA([matrix.sps], [dnl
1793 PRINT RSSQ({1, 2, 3; 4, 5, 6; 7, 8, 9}).
1794 PRINT RSUM({1, 2, 3; 4, 5, 6; 7, 8, 9}).
1796 PRINT SIN({0, .78, 1.57, 2.35, 3.14}) /FORMAT F5.2.
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}).
1803 PRINT SQRT({0, 1, 2, 3, 4, 9, 81}) /FORMAT=F5.2.
1807 AT_CHECK([pspp matrix.sps], [1], [dnl
1808 RSSQ({1, 2, 3; 4, 5, 6; 7, 8, 9})
1813 RSUM({1, 2, 3; 4, 5, 6; 7, 8, 9})
1818 SIN({0, .78, 1.57, 2.35, 3.14})
1819 .00 .70 1.00 .71 .00
1821 SOLVE({2, 3; 4, 9}, {6, 2; 15, 5})
1825 SOLVE({1, 3, -2; 3, 5, 6; 2, 4, 3}, {5; 7; 8})
1830 SOLVE({2, 1, -1; -3, -1, 2; -2, 1, 2}, {8; -11; -3})
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
1839 SQRT({0, 1, 2, 3, 4, 9, 81})
1840 .00 1.00 1.41 1.73 2.00 3.00 9.00
1842 matrix.sps:13: error: MATRIX: Argument to SQRT must be nonnegative.
1846 AT_SETUP([MATRIX - SSCP SVAL SWEEP TRACE TRANSPOS TRUNC])
1847 AT_DATA([matrix.sps], [dnl
1849 COMPUTE m={1, 2, 3; 4, 5, 6}
1850 COMPUTE sscp1=SSCP(m).
1851 COMPUTE sscp2=T(m)*m.
1853 PRINT (sscp1 <> sscp2).
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})
1859 PRINT SVAL({2, 4; 1, 3; 0, 0; 0, 0})/FORMAT F5.2.
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.
1866 COMPUTE s1 = {6, 12, 0, 12; 12, 0, 0, 25; 0, 0, 6, 2; 12, 25, 2, 28}.
1869 COMPUTE s2 = {0, 1, 2; 3, 4, 5; 6, 7, 8}.
1878 PRINT ALL(T(T(s0)) = s0).
1880 PRINT TRUNC(SVAL({2, 4; 1, 3; 0, 0; 0, 0})).
1881 PRINT TRUNC(-SVAL({2, 4; 1, 3; 0, 0; 0, 0})).
1884 AT_CHECK([pspp matrix.sps], [0], [dnl
1899 SVAL({1, 0, 1; 0, 1, 1; 0, 0, 0})
1904 SVAL({1, 0, 0, 0, 2; 0, 0, 3, 0, 0; 0, 0, 0, 0, 0; 0, 2, 0, 0, 0})
1910 SVAL({2, 4; 1, 3; 0, 0; 0, 0})
1918 -2.00 1.00 2.00 4.00
1920 SWEEP(SWEEP(s0, 1), 2)
1924 -1.50 -.25 2.00 3.75
1926 SWEEP(SWEEP(SWEEP(s0, 1), 2), 3)
1930 -1.50 -.25 -.33 3.08
1956 TRUNC(SVAL({2, 4; 1, 3; 0, 0; 0, 0}))
1960 TRUNC(-SVAL({2, 4; 1, 3; 0, 0; 0, 0}))
1966 AT_SETUP([MATRIX - UNIFORM])
1967 AT_DATA([matrix.sps], [dnl
1970 PRINT (UNIFORM(4, 5)*10)/FORMAT F5.2.
1973 AT_CHECK([pspp matrix.sps], [0], [dnl
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
1982 AT_SETUP([MATRIX - CALL SETDIAG])
1983 AT_DATA([matrix.sps], [dnl
1985 COMPUTE x={1, 2, 3; 4, 5, 6; 7, 8, 9}.
1988 CALL SETDIAG(x1, 10).
1992 CALL SETDIAG(x2, {10, 11}).
1996 CALL SETDIAG(x3, {10, 11, 12}).
2000 CALL SETDIAG(x4, {10, 11, 12, 13}).
2004 CALL SETDIAG(x5, {10, 11; 12, 13}).
2009 AT_CHECK([pspp matrix.sps], [1], [dnl
2030 matrix.sps:21: error: MATRIX: SETDIAG argument 2 must be a scalar or a vector,
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
2044 CALL EIGEN({1, 0; 0, 1}, evec, eval).
2048 CALL EIGEN({3, 2, 4; 2, 0, 2; 4, 2, 3}, evec2, eval2).
2053 AT_CHECK([pspp matrix.sps], [0], [dnl
2063 -.6666666667 .0000000000 .7453559925
2064 -.3333333333 -.8944271910 -.2981423970
2065 -.6666666667 .4472135955 -.5962847940
2074 AT_SETUP([MATRIX - CALL SVD])
2075 AT_DATA([matrix.sps], [dnl
2077 CALL SVD({3, 2, 2; 2, 3, -2}, u, s, v).
2078 PRINT (u * s * T(v))/FORMAT F5.1.
2080 CALL SVD({2, 4; 1, 3; 0, 0; 0, 0}, u, s, v).
2081 PRINT (u*s*T(v))/FORMAT F5.1.
2083 CALL SVD({-3, 1; 6, -2; 6, -2}, u, s, v).
2084 PRINT (u*s*T(v))/FORMAT F5.1.
2087 AT_CHECK([pspp matrix.sps], [0], [dnl
2105 AT_SETUP([MATRIX - PRINT])
2106 AT_DATA([matrix.sps], [dnl
2108 PRINT/TITLE="title 1".
2109 PRINT/SPACE=2/TITLE="title 2".
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}.
2124 AT_DATA([matrix-tables.sps], [dnl
2125 SET MDISPLAY=TABLES.
2126 INCLUDE 'matrix.sps'.
2129 AT_CHECK([pspp matrix.sps], [0], [dnl
2170 {123e10, 456e10, 500}
2172 1.2300000000 4.5600000000 .0000000005
2175 AT_CHECK([pspp matrix-tables.sps], [0], [dnl
2197 +----+----+----------------+
2198 |col1|col2|long column name|
2199 +----+----+----------------+
2203 +----+----+----------------+
2206 +----+----+--------+
2207 |col1|col2|long col|
2208 +----+----+--------+
2212 +----+----+--------+
2215 +---------+----+----+----------------+
2216 | |col1|col2|long column name|
2217 +---------+----+----+----------------+
2220 |long name| 6| 7| 8|
2221 +---------+----+----+----------------+
2224 +--------+----+----+--------+
2225 | |col1|col2|long col|
2226 +--------+----+----+--------+
2230 +--------+----+----+--------+
2232 {123e10, 456e10, 500}
2233 +----------------------------------------------+
2234 |1.2300000000[[a]] 4.5600000000[[a]] .0000000005[[a]]|
2235 +----------------------------------------------+
2240 AT_SETUP([MATRIX - DO IF])
2241 AT_DATA([matrix.sps], [dnl
2269 AT_CHECK([pspp matrix.sps], [1], [dnl
2276 matrix.sps:21: error: MATRIX: Expression for DO IF must evaluate to scalar, not
2279 matrix.sps:25: error: MATRIX: Expression for ELSE IF must evaluate to scalar,
2284 AT_SETUP([MATRIX - unbounded LOOP])
2285 AT_DATA([matrix.sps], [dnl
2287 * Truly unbounded loop.
2297 * Unbounded loop terminates with BREAK.
2312 AT_CHECK([pspp matrix.sps], [0], [dnl
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
2325 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19
2330 AT_SETUP([MATRIX - indexed or conditional LOOP])
2331 AT_DATA([matrix.sps], [dnl
2333 * Indexed loop terminates based on index.
2341 * Indexed loop terminates based on MXLOOPS.
2349 * Indexed loop terminates with BREAK.
2360 * Indexed loop terminates with top IF.
2362 LOOP x=1 TO 50 IF NCOL(y) < 15.
2368 * Indexed loop terminates with bottom IF.
2372 END LOOP IF NCOL(y) >= 22.
2389 LOOP i=1 TO NROW(indexing).
2391 LOOP j=indexing(i, 1) TO indexing(i, 2) BY indexing(i, 3).
2394 PRINT {indexing(i, :), y}.
2403 LOOP i=5 TO 8 BY {}.
2412 LOOP i=1e100 to 1e200.
2416 AT_CHECK([pspp matrix.sps], [1], [dnl
2421 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19
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
2436 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19
2443 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
2449 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19
2453 1 10 1 1 2 3 4 5 6 7 8 9 10
2463 10 1 -1 10 9 8 7 6 5 4 3 2 1
2473 matrix.sps:67: error: MATRIX: Expression for LOOP must evaluate to scalar, not
2476 matrix.sps:70: error: MATRIX: Expression for TO must evaluate to scalar, not a
2479 matrix.sps:73: error: MATRIX: Expression for BY must evaluate to scalar, not a
2482 matrix.sps:76: error: MATRIX: Expression for LOOP IF must evaluate to scalar,
2485 matrix.sps:79: error: MATRIX: Expression for END LOOP IF must evaluate to
2486 scalar, not a 0×0 matrix.
2488 matrix.sps:82: error: MATRIX: Expression for LOOP is outside the integer range.
2492 AT_SETUP([MATRIX - BREAK outside LOOP])
2493 AT_DATA([matrix.sps], [dnl
2498 AT_CHECK([pspp matrix.sps], [1], [dnl
2499 matrix.sps:2: error: BREAK: BREAK not inside LOOP.
2503 AT_SETUP([MATRIX - READ])
2504 AT_DATA([matrix.txt], [dnl
2518 AT_DATA([matrix2.txt], [dnl
2524 AT_DATA([matrix.sps], [dnl
2526 READ x/FILE='matrix.txt'/SIZE={3,3}/FIELD=1 TO 80.
2528 READ x/SIZE={2,4}/FIELD=1 TO 80.
2530 READ x(:,2)/FILE='matrix.txt'/FIELD=1 TO 80.
2532 READ x(1,:)/SIZE={1,4}/FIELD=1 TO 80.
2535 READ x/SIZE={2,6}/FIELD=1 TO 20 BY 5.
2539 LOOP IF NOT EOF('matrix2.txt').
2540 READ x/FILE='matrix2.txt'/SIZE={1,4}/FIELD=1 TO 80.
2546 AT_CHECK([pspp matrix.sps], [0], [dnl