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
1132 AT_CHECK([pspp matrix.sps], [1], [dnl
1155 matrix.sps:12: error: MATRIX: The increment operand to : must be nonzero.
1157 matrix.sps:13: error: MATRIX: The increment operand to : must be nonzero.
1159 matrix.sps:15: error: MATRIX: All rows in a matrix must have the same number of
1160 columns, but this tries to stack matrices with 2 and 1 columns.
1162 matrix.sps:16: error: MATRIX: All columns in a matrix must have the same number
1163 of rows, but this tries to paste matrices with 2 and 1 rows.
1167 AT_SETUP([MATRIX - comments])
1168 AT_DATA([matrix.sps], [dnl
1172 COMMENT Comment two.
1176 AT_CHECK([pspp matrix.sps], [0], [dnl
1185 AT_SETUP([MATRIX - string matrices])
1186 AT_DATA([matrix.sps], [dnl
1188 COMPUTE m={'This is', 'a string', 'matrix', 'including', 'some', 'long strings'}.
1192 AT_CHECK([pspp matrix.sps], [0], [dnl
1194 This is a string matrix includin some long str
1198 AT_SETUP([MATRIX - ABS ALL ANY ARSIN ARTAN])
1199 AT_DATA([matrix.sps], [dnl
1201 PRINT ABS({-1, 0, 1}).
1203 PRINT ALL({0, 0, 0}).
1205 PRINT ALL({-1, 0, 1}).
1207 PRINT ANY({0, 0, 0}).
1209 PRINT ANY({-1, 0, 1}).
1211 PRINT ARSIN({-1, 0, 1})/FORMAT=F5.2.
1213 PRINT ARTAN({-5, -1, 0, 1, 5})/FORMAT=F5.2.
1216 AT_CHECK([pspp matrix.sps], [0], [dnl
1241 ARTAN({-5, -1, 0, 1, 5})
1242 -1.37 -.79 .00 .79 1.37
1246 AT_SETUP([MATRIX - BLOCK CHOL CMAX CMIN COS])
1247 AT_DATA([matrix.sps], [dnl
1249 PRINT BLOCK({1, 2; 3, 4}, 5, {7; 8; 9}, {10, 11}).
1251 COMPUTE b=CHOL({4, 12, -16; 12, 37, -43; -16, -43, 98}).
1255 PRINT CMAX({9, 3, 4; 5, 8, 6; 7, 4, 11}).
1257 PRINT CMIN({9, 3, 4; 5, 8, 6; 7, 4, 11}).
1259 PRINT COS({0.785, 1.57; 3.14, 1.57 + 3.14}) /FORMAT=F5.2.
1263 AT_CHECK([pspp matrix.sps], [0], [dnl
1264 BLOCK({1, 2; 3, 4}, 5, {7; 8; 9}, {10, 11})
1283 CMAX({9, 3, 4; 5, 8, 6; 7, 4, 11})
1286 CMIN({9, 3, 4; 5, 8, 6; 7, 4, 11})
1289 COS({0.785, 1.57; 3.14, 1.57 + 3.14})
1295 AT_SETUP([MATRIX - CSSQ CSUM DESIGN DET DIAG])
1296 AT_DATA([matrix.sps], [dnl
1298 PRINT CSSQ({1, 2, 3; 4, 5, 6; 7, 8, 9}).
1299 PRINT CSUM({1, 2, 3; 4, 5, 6; 7, 8, 9}).
1300 PRINT DESIGN({1, 2, 0; 2, 1, 0; 3, 0, 1}).
1301 PRINT DESIGN({1, 2, 0; 2, 2, 0; 3, 2, 1}).
1302 PRINT DET({1, 2, 3; 4, 5, 6; 7, 8, 9}) /FORMAT F4.1.
1303 PRINT DIAG({1, 2, 3, 4; 4, 5, 6, 7; 7, 8, 9, 10}).
1306 AT_CHECK([pspp matrix.sps], [0], [dnl
1307 CSSQ({1, 2, 3; 4, 5, 6; 7, 8, 9})
1310 CSUM({1, 2, 3; 4, 5, 6; 7, 8, 9})
1313 DESIGN({1, 2, 0; 2, 1, 0; 3, 0, 1})
1318 warning: Column 2 in DESIGN argument has constant value.
1320 DESIGN({1, 2, 0; 2, 2, 0; 3, 2, 1})
1325 DET({1, 2, 3; 4, 5, 6; 7, 8, 9})
1328 DIAG({1, 2, 3, 4; 4, 5, 6, 7; 7, 8, 9, 10})
1335 AT_SETUP([MATRIX - EVAL EXP GINV GRADE GSCH])
1336 AT_DATA([matrix.sps], [dnl
1338 PRINT EVAL({2, 0, 0; 0, 3, 4; 0, 4, 9}).
1340 PRINT EXP({2, 3; 4, 5})/FORMAT F5.2.
1342 PRINT GINV({1, 2})/FORMAT F5.2.
1343 COMPUTE a={1, 2, 3; 4, 5, 6; 7, 8, 9}.
1345 PRINT (a*g*a)/FORMAT F5.2.
1347 PRINT GRADE({1, 0, 3; 3, 1, 2; 3, 0, 5}).
1348 COMPUTE x={26, 690, 323, 208, 671, 818, 732, 711, 585, 792}.
1350 COMPUTE asort(GRADE(asort))=asort.
1353 COMPUTE dsort(GRADE(-dsort))=dsort.
1356 PRINT (GSCH({3, 2; 1, 2}) * SQRT(10))/FORMAT F5.2.
1357 PRINT (GSCH({0, 3, 6, 2; 0, 1, 2, 2}) * SQRT(10))/FORMAT F5.2.
1359 PRINT GSCH({0, 0, 0; 0, 0, 0}).
1362 AT_CHECK([pspp matrix.sps], [1], [dnl
1363 EVAL({2, 0, 0; 0, 3, 4; 0, 4, 9})
1381 GRADE({1, 0, 3; 3, 1, 2; 3, 0, 5})
1387 26 208 323 585 671 690 711 732 792 818
1390 818 792 732 711 690 671 585 323 208 26
1392 (GSCH({3, 2; 1, 2}) * SQRT(10))
1396 (GSCH({0, 3, 6, 2; 0, 1, 2, 2}) * SQRT(10))
1400 matrix.sps:22: error: MATRIX: GSCH requires its argument to have at least as
1401 many columns as rows, but it has dimensions (2,1).
1403 matrix.sps:23: error: MATRIX: 2×3 argument to GSCH contains only 0 linearly
1404 independent columns.
1408 AT_SETUP([MATRIX - IDENT INV KRONEKER LG10 LN])
1409 AT_DATA([matrix.sps], [dnl
1416 PRINT INV({3, 3.5; 3.2, 3.6})/FORMAT F8.2.
1417 PRINT INV({4, 7; 2, 6})/FORMAT F8.2.
1418 PRINT (INV({4, -2, 1; 5, 0, 3; -1, 2, 6})*52)/FORMAT F8.2.
1420 PRINT KRONEKER({1, 2; 3, 4}, {0, 5; 6, 7}).
1422 PRINT LG10({1, 10, 100, 1000}).
1424 PRINT LN({1, 2; 3, 4})/FORMAT F5.2.
1428 AT_CHECK([pspp matrix.sps], [0], [dnl
1448 INV({3, 3.5; 3.2, 3.6})
1456 (INV({4, -2, 1; 5, 0, 3; -1, 2, 6})*52)
1461 KRONEKER({1, 2; 3, 4}, {0, 5; 6, 7})
1467 LG10({1, 10, 100, 1000})
1476 AT_SETUP([MATRIX - MAGIC])
1477 AT_DATA([matrix.sps], [dnl
1482 COMPUTE total=n*(n**2 + 1) / 2.
1483 COMPUTE tb={MSUM(DIAG(T(m))), CSUM(m), MSUM(DIAG(m))} - total.
1484 COMPUTE lr=RSUM(m) - total.
1485 PRINT {tb; lr, m, lr; tb}/FORMAT F4.0.
1489 AT_CHECK([pspp matrix.sps], [0], [dnl
1515 0 24 14 22 18 17 16 0
1516 0 13 23 15 19 20 21 0
1522 0 30 39 48 1 10 19 28 0
1523 0 38 47 7 9 18 27 29 0
1524 0 46 6 8 17 26 35 37 0
1525 0 5 14 16 25 34 36 45 0
1526 0 13 15 24 33 42 44 4 0
1527 0 21 23 32 41 43 3 12 0
1528 0 22 31 40 49 2 11 20 0
1532 0 1 9 17 25 40 48 56 64 0
1533 0 63 55 47 39 26 18 10 2 0
1534 0 3 11 19 27 38 46 54 62 0
1535 0 61 53 45 37 28 20 12 4 0
1536 0 60 52 44 32 33 21 13 5 0
1537 0 6 14 22 30 35 43 51 59 0
1538 0 58 50 42 34 31 23 15 7 0
1539 0 8 16 24 36 29 41 49 57 0
1542 0 0 0 0 0 0 0 0 0 0 0
1543 0 47 58 69 80 1 12 23 34 45 0
1544 0 57 68 79 9 11 22 33 44 46 0
1545 0 67 78 8 10 21 32 43 54 56 0
1546 0 77 7 18 20 31 42 53 55 66 0
1547 0 6 17 19 30 41 52 63 65 76 0
1548 0 16 27 29 40 51 62 64 75 5 0
1549 0 26 28 39 50 61 72 74 4 15 0
1550 0 36 38 49 60 71 73 3 14 25 0
1551 0 37 48 59 70 81 2 13 24 35 0
1552 0 0 0 0 0 0 0 0 0 0 0
1554 0 0 0 0 0 0 0 0 0 0 0 0
1555 0 1 9 17 25 33 68 76 84 92 100 0
1556 0 99 91 83 75 67 34 26 18 10 2 0
1557 0 3 11 19 27 35 66 74 82 90 98 0
1558 0 97 89 81 72 65 36 29 20 12 4 0
1559 0 60 42 58 44 56 50 49 53 47 46 0
1560 0 41 59 43 57 45 51 52 48 54 55 0
1561 0 96 88 80 73 64 37 28 21 13 5 0
1562 0 6 14 22 30 38 63 71 79 87 95 0
1563 0 94 86 78 70 62 39 31 23 15 7 0
1564 0 8 16 24 32 40 61 69 77 85 93 0
1565 0 0 0 0 0 0 0 0 0 0 0 0
1569 AT_SETUP([MATRIX - MAKE MDIAG MMAX MMIN MOD])
1570 AT_DATA([matrix.sps], [dnl
1572 PRINT MAKE(1, 2, 3).
1573 PRINT MAKE(2, 1, 4).
1574 PRINT MAKE(2, 3, 5).
1576 PRINT MDIAG({1, 2, 3, 4}).
1577 PRINT MDIAG({1; 2; 3; 4}).
1578 PRINT MDIAG({1, 2; 3, 4}).
1580 PRINT MMAX({55, 44; 66, 11}).
1582 PRINT MMIN({55, 44; 66, 11}).
1584 PRINT MOD({5, 4, 3, 2, 1, 0}, 3).
1585 PRINT MOD({5, 4, 3, 2, 1, 0}, -3).
1586 PRINT MOD({-5, -4, -3, -2, -1, 0}, 3).
1587 PRINT MOD({-5, -4, -3, -2, -1, 0}, -3).
1588 PRINT MOD({5, 4, 3, 2, 1, 0}, 1.5) /FORMAT F5.1.
1589 PRINT MOD({5, 4, 3, 2, 1, 0}, 0).
1592 AT_CHECK([pspp matrix.sps], [1], [dnl
1616 matrix.sps:8: error: MATRIX: Function MDIAG argument 1 must be a vector, not a
1619 MMAX({55, 44; 66, 11})
1622 MMIN({55, 44; 66, 11})
1625 MOD({5, 4, 3, 2, 1, 0}, 3)
1628 MOD({5, 4, 3, 2, 1, 0}, -3)
1631 MOD({-5, -4, -3, -2, -1, 0}, 3)
1634 MOD({-5, -4, -3, -2, -1, 0}, -3)
1637 MOD({5, 4, 3, 2, 1, 0}, 1.5)
1640 matrix.sps:19: error: MATRIX: Divisor argument to MOD function must be nonzero.
1644 AT_SETUP([MATRIX - MSSQ MSUM NCOL NROW RANK])
1645 AT_DATA([matrix.sps], [dnl
1647 PRINT MSSQ({1, 0, 1; -2, -3, 1; 3, 3, 0}).
1649 PRINT MSUM({1, 0, 1; -2, -3, 1; 3, 3, 0}).
1651 PRINT NCOL({1, 0; -2, -3; 3, 3}).
1653 PRINT NROW({1, 0; -2, -3; 3, 3}).
1655 PRINT RANK({1, 0, 1; -2, -3, 1; 3, 3, 0}).
1656 PRINT RANK({1, 1, 0, 2; -1, -1, 0, -2}).
1657 PRINT RANK({1, -1; 1, -1; 0, 0; 2, -2}).
1658 PRINT RANK({1, 2, 1; -2, -3, 1; 3, 5, 0}).
1659 PRINT RANK({1, 0, 2; 2, 1, 0; 3, 2, 1}).
1662 AT_CHECK([pspp matrix.sps], [0], [dnl
1663 MSSQ({1, 0, 1; -2, -3, 1; 3, 3, 0})
1666 MSUM({1, 0, 1; -2, -3, 1; 3, 3, 0})
1669 NCOL({1, 0; -2, -3; 3, 3})
1672 NROW({1, 0; -2, -3; 3, 3})
1675 RANK({1, 0, 1; -2, -3, 1; 3, 3, 0})
1678 RANK({1, 1, 0, 2; -1, -1, 0, -2})
1681 RANK({1, -1; 1, -1; 0, 0; 2, -2})
1684 RANK({1, 2, 1; -2, -3, 1; 3, 5, 0})
1687 RANK({1, 0, 2; 2, 1, 0; 3, 2, 1})
1692 AT_SETUP([MATRIX - RESHAPE RMAX RMIN RND RNKORDER])
1693 AT_DATA([matrix.sps], [dnl
1695 PRINT RESHAPE(1:12, 1, 12).
1696 PRINT RESHAPE(1:12, 2, 6).
1697 PRINT RESHAPE(1:12, 3, 4).
1698 PRINT RESHAPE(1:12, 4, 3).
1699 PRINT RESHAPE(1:12, 6, 2).
1700 PRINT RESHAPE(1:12, 12, 1).
1702 PRINT RMAX({1, 0, 1; -2, -3, 1; 3, 3, 0}).
1704 PRINT RMIN({1, 0, 1; -2, -3, 1; 3, 3, 0}).
1706 PRINT RND({-1.6, -1.5, -1.4;
1709 1.4, 1.5, 1.6})/FORMAT F5.1.
1711 PRINT RNKORDER({1, 0, 3; 3, 1, 2; 3, 0, 5}) /FORMAT F5.1.
1714 AT_CHECK([pspp matrix.sps], [0], [dnl
1715 RESHAPE(1:12, 1, 12)
1716 1 2 3 4 5 6 7 8 9 10 11 12
1741 RESHAPE(1:12, 12, 1)
1755 RMAX({1, 0, 1; -2, -3, 1; 3, 3, 0})
1760 RMIN({1, 0, 1; -2, -3, 1; 3, 3, 0})
1765 RND({-1.6, -1.5, -1.4;
1774 RNKORDER({1, 0, 3; 3, 1, 2; 3, 0, 5})
1781 AT_SETUP([MATRIX - RSSQ RSUM SIN SOLVE SQRT])
1782 AT_DATA([matrix.sps], [dnl
1784 PRINT RSSQ({1, 2, 3; 4, 5, 6; 7, 8, 9}).
1785 PRINT RSUM({1, 2, 3; 4, 5, 6; 7, 8, 9}).
1787 PRINT SIN({0, .78, 1.57, 2.35, 3.14}) /FORMAT F5.2.
1789 PRINT SOLVE({2, 3; 4, 9}, {6, 2; 15, 5}) /FORMAT=F6.2.
1790 PRINT SOLVE({1, 3, -2; 3, 5, 6; 2, 4, 3}, {5; 7; 8}) /FORMAT=F6.2.
1791 PRINT SOLVE({2, 1, -1; -3, -1, 2; -2, 1, 2}, {8; -11; -3}) /FORMAT=F6.2.
1792 PRINT SOLVE({1, 2; 3, 4}, {1, 2}).
1794 PRINT SQRT({0, 1, 2, 3, 4, 9, 81}) /FORMAT=F5.2.
1798 AT_CHECK([pspp matrix.sps], [1], [dnl
1799 RSSQ({1, 2, 3; 4, 5, 6; 7, 8, 9})
1804 RSUM({1, 2, 3; 4, 5, 6; 7, 8, 9})
1809 SIN({0, .78, 1.57, 2.35, 3.14})
1810 .00 .70 1.00 .71 .00
1812 SOLVE({2, 3; 4, 9}, {6, 2; 15, 5})
1816 SOLVE({1, 3, -2; 3, 5, 6; 2, 4, 3}, {5; 7; 8})
1821 SOLVE({2, 1, -1; -3, -1, 2; -2, 1, 2}, {8; -11; -3})
1826 matrix.sps:10: error: MATRIX: SOLVE requires its arguments to have the same
1827 number of rows, but the first argument has dimensions (2,2) and the second
1830 SQRT({0, 1, 2, 3, 4, 9, 81})
1831 .00 1.00 1.41 1.73 2.00 3.00 9.00
1833 matrix.sps:13: error: MATRIX: Argument to SQRT must be nonnegative.
1837 AT_SETUP([MATRIX - SSCP SVAL SWEEP TRACE TRANSPOS TRUNC])
1838 AT_DATA([matrix.sps], [dnl
1840 COMPUTE m={1, 2, 3; 4, 5, 6}
1841 COMPUTE sscp1=SSCP(m).
1842 COMPUTE sscp2=T(m)*m.
1844 PRINT (sscp1 <> sscp2).
1846 PRINT SVAL({1, 1; 0, 0})/FORMAT F5.2.
1847 PRINT SVAL({1, 0, 1; 0, 1, 1; 0, 0, 0})/FORMAT F5.2.
1848 PRINT SVAL({1, 0, 0, 0, 2; 0, 0, 3, 0, 0; 0, 0, 0, 0, 0; 0, 2, 0, 0, 0})
1850 PRINT SVAL({2, 4; 1, 3; 0, 0; 0, 0})/FORMAT F5.2.
1852 COMPUTE s0 = {6, 12, 0, 12; 12, 28, 0, 25; 0, 0, 6, 2; 12, 25, 2, 28}.
1853 PRINT SWEEP(s0, 1)/FORMAT F5.2.
1854 PRINT SWEEP(SWEEP(s0, 1), 2)/FORMAT F5.2.
1855 PRINT SWEEP(SWEEP(SWEEP(s0, 1), 2), 3)/FORMAT F5.2.
1857 COMPUTE s1 = {6, 12, 0, 12; 12, 0, 0, 25; 0, 0, 6, 2; 12, 25, 2, 28}.
1864 PRINT ALL(T(T(s0)) = s0).
1866 PRINT TRUNC(SVAL({2, 4; 1, 3; 0, 0; 0, 0})).
1867 PRINT TRUNC(-SVAL({2, 4; 1, 3; 0, 0; 0, 0})).
1870 AT_CHECK([pspp matrix.sps], [0], [dnl
1885 SVAL({1, 0, 1; 0, 1, 1; 0, 0, 0})
1890 SVAL({1, 0, 0, 0, 2; 0, 0, 3, 0, 0; 0, 0, 0, 0, 0; 0, 2, 0, 0, 0})
1896 SVAL({2, 4; 1, 3; 0, 0; 0, 0})
1904 -2.00 1.00 2.00 4.00
1906 SWEEP(SWEEP(s0, 1), 2)
1910 -1.50 -.25 2.00 3.75
1912 SWEEP(SWEEP(SWEEP(s0, 1), 2), 3)
1916 -1.50 -.25 -.33 3.08
1942 TRUNC(SVAL({2, 4; 1, 3; 0, 0; 0, 0}))
1946 TRUNC(-SVAL({2, 4; 1, 3; 0, 0; 0, 0}))
1952 AT_SETUP([MATRIX - UNIFORM])
1953 AT_DATA([matrix.sps], [dnl
1956 PRINT (UNIFORM(4, 5)*10)/FORMAT F5.2.
1959 AT_CHECK([pspp matrix.sps], [0], [dnl
1961 7.71 2.99 .21 4.95 6.34
1962 4.43 7.49 8.32 4.99 5.83
1963 2.25 .25 1.98 7.09 7.61
1964 2.66 1.69 2.64 .88 1.50
1968 AT_SETUP([MATRIX - CALL SETDIAG])
1969 AT_DATA([matrix.sps], [dnl
1971 COMPUTE x={1, 2, 3; 4, 5, 6; 7, 8, 9}.
1974 CALL SETDIAG(x1, 10).
1978 CALL SETDIAG(x2, {10, 11}).
1982 CALL SETDIAG(x3, {10, 11, 12}).
1986 CALL SETDIAG(x4, {10, 11, 12, 13}).
1990 CALL SETDIAG(x5, {10, 11; 12, 13}).
1995 AT_CHECK([pspp matrix.sps], [1], [dnl
2016 matrix.sps:21: error: MATRIX: SETDIAG argument 2 must be a scalar or a vector,
2026 dnl I have some doubts about the correctness of the results below.
2027 AT_SETUP([MATRIX - CALL EIGEN])
2028 AT_DATA([matrix.sps], [dnl
2030 CALL EIGEN({1, 0; 0, 1}, evec, eval).
2034 CALL EIGEN({3, 2, 4; 2, 0, 2; 4, 2, 3}, evec, eval).
2039 AT_CHECK([pspp matrix.sps], [0], [dnl
2049 -.6666666667 .0000000000 .7453559925
2050 -.3333333333 -.8944271910 -.2981423970
2051 -.6666666667 .4472135955 -.5962847940
2060 AT_SETUP([MATRIX - CALL SVD])
2061 AT_DATA([matrix.sps], [dnl
2063 CALL SVD({3, 2, 2; 2, 3, -2}, u, s, v).
2064 PRINT (u * s * T(v))/FORMAT F5.1.
2066 CALL SVD({2, 4; 1, 3; 0, 0; 0, 0}, u, s, v).
2067 PRINT (u*s*T(v))/FORMAT F5.1.
2069 CALL SVD({-3, 1; 6, -2; 6, -2}, u, s, v).
2070 PRINT (u*s*T(v))/FORMAT F5.1.
2073 AT_CHECK([pspp matrix.sps], [0], [dnl
2091 AT_SETUP([MATRIX - PRINT])
2092 AT_DATA([matrix.sps], [dnl
2094 PRINT/TITLE="title 1".
2095 PRINT/SPACE=2/TITLE="title 2".
2097 COMPUTE m={1, 2, 3; 3, 4, 5; 6, 7, 8}.
2098 PRINT m/RLABELS=123, a b c, long name.
2099 PRINT m/RNAMES={'123', 'a b c', 'long name'}.
2100 PRINT m/CLABELS=col1, col2, long column name.
2101 PRINT m/CNAMES={'col1', 'col2', 'long column name'}.
2102 PRINT m/RLABELS=123, a b c, long name
2103 /CLABELS=col1, col2, long column name.
2104 PRINT m/RNAMES={'123', 'a b c', 'long name'}
2105 /CNAMES={'col1', 'col2', 'long column name'}.
2106 PRINT {123e10, 456e10, 500}.
2110 AT_DATA([matrix-tables.sps], [dnl
2111 SET MDISPLAY=TABLES.
2112 INCLUDE 'matrix.sps'.
2115 AT_CHECK([pspp matrix.sps], [0], [dnl
2156 {123e10, 456e10, 500}
2158 1.2300000000 4.5600000000 .0000000005
2161 AT_CHECK([pspp matrix-tables.sps], [0], [dnl
2183 +----+----+----------------+
2184 |col1|col2|long column name|
2185 +----+----+----------------+
2189 +----+----+----------------+
2192 +----+----+--------+
2193 |col1|col2|long col|
2194 +----+----+--------+
2198 +----+----+--------+
2201 +---------+----+----+----------------+
2202 | |col1|col2|long column name|
2203 +---------+----+----+----------------+
2206 |long name| 6| 7| 8|
2207 +---------+----+----+----------------+
2210 +--------+----+----+--------+
2211 | |col1|col2|long col|
2212 +--------+----+----+--------+
2216 +--------+----+----+--------+
2218 {123e10, 456e10, 500}
2219 +----------------------------------------------+
2220 |1.2300000000[[a]] 4.5600000000[[a]] .0000000005[[a]]|
2221 +----------------------------------------------+
2226 AT_SETUP([MATRIX - DO IF])
2227 AT_DATA([matrix.sps], [dnl
2255 AT_CHECK([pspp matrix.sps], [1], [dnl
2262 matrix.sps:21: error: MATRIX: Expression for DO IF must evaluate to scalar, not
2265 matrix.sps:25: error: MATRIX: Expression for ELSE IF must evaluate to scalar,
2270 AT_SETUP([MATRIX - unbounded LOOP])
2271 AT_DATA([matrix.sps], [dnl
2273 * Truly unbounded loop.
2283 * Unbounded loop terminates with BREAK.
2298 AT_CHECK([pspp matrix.sps], [0], [dnl
2303 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19
2304 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39
2311 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19
2316 AT_SETUP([MATRIX - indexed or conditional LOOP])
2317 AT_DATA([matrix.sps], [dnl
2319 * Indexed loop terminates based on index.
2327 * Indexed loop terminates based on MXLOOPS.
2335 * Indexed loop terminates with BREAK.
2346 * Indexed loop terminates with top IF.
2348 LOOP x=1 TO 50 IF NCOL(y) < 15.
2354 * Indexed loop terminates with bottom IF.
2358 END LOOP IF NCOL(y) >= 22.
2375 LOOP i=1 TO NROW(indexing).
2377 LOOP j=indexing(i, 1) TO indexing(i, 2) BY indexing(i, 3).
2380 PRINT {indexing(i, :), y}.
2389 LOOP i=5 TO 8 BY {}.
2398 LOOP i=1e100 to 1e200.
2402 AT_CHECK([pspp matrix.sps], [1], [dnl
2407 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19
2414 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19
2415 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39
2422 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19
2429 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
2435 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19
2439 1 10 1 1 2 3 4 5 6 7 8 9 10
2449 10 1 -1 10 9 8 7 6 5 4 3 2 1
2459 matrix.sps:67: error: MATRIX: Expression for LOOP must evaluate to scalar, not
2462 matrix.sps:70: error: MATRIX: Expression for TO must evaluate to scalar, not a
2465 matrix.sps:73: error: MATRIX: Expression for BY must evaluate to scalar, not a
2468 matrix.sps:76: error: MATRIX: Expression for LOOP IF must evaluate to scalar,
2471 matrix.sps:79: error: MATRIX: Expression for END LOOP IF must evaluate to
2472 scalar, not a 0×0 matrix.
2474 matrix.sps:82: error: MATRIX: Expression for LOOP is outside the integer range.
2478 AT_SETUP([MATRIX - BREAK outside LOOP])
2479 AT_DATA([matrix.sps], [dnl
2484 AT_CHECK([pspp matrix.sps], [1], [dnl
2485 matrix.sps:2: error: BREAK: BREAK not inside LOOP.
2489 AT_SETUP([MATRIX - READ])
2490 AT_DATA([matrix.txt], [dnl
2504 AT_DATA([matrix2.txt], [dnl
2510 AT_DATA([matrix.sps], [dnl
2512 READ x/FILE='matrix.txt'/SIZE={3,3}/FIELD=1 TO 80.
2514 READ x/SIZE={2,4}/FIELD=1 TO 80.
2516 READ x(:,2)/FILE='matrix.txt'/FIELD=1 TO 80.
2518 READ x(1,:)/SIZE={1,4}/FIELD=1 TO 80.
2521 READ x/SIZE={2,6}/FIELD=1 TO 20 BY 5.
2525 LOOP IF NOT EOF('matrix2.txt').
2526 READ x/FILE='matrix2.txt'/SIZE={1,4}/FIELD=1 TO 80.
2532 AT_CHECK([pspp matrix.sps], [0], [dnl