Move all command implementations into a single 'commands' directory.
[pspp] / tests / language / stats / matrix.at
diff --git a/tests/language/stats/matrix.at b/tests/language/stats/matrix.at
deleted file mode 100644 (file)
index 8412468..0000000
+++ /dev/null
@@ -1,5029 +0,0 @@
-AT_BANNER([MATRIX])
-
-AT_SETUP([MATRIX - empty matrices])
-AT_DATA([matrix.sps], [dnl
-MATRIX.
-COMPUTE a={}.
-PRINT a.
-COMPUTE b={a; 1; 2; 3}.
-PRINT b.
-COMPUTE c={a, 1, 2, 3}.
-PRINT c.
-END MATRIX.
-])
-AT_CHECK([pspp matrix.sps], [0], [dnl
-a
-
-b
-  1
-  2
-  3
-
-c
-  1  2  3
-])
-AT_CLEANUP
-
-AT_SETUP([MATRIX - submatrices as rvalues - all columns or all rows])
-AT_DATA([matrix.sps], [dnl
-MATRIX.
-PRINT {1, 2, 3; 4, 5, 6; 7, 8, 9}(1, :).
-PRINT {1, 2, 3; 4, 5, 6; 7, 8, 9}({1}, :).
-PRINT {1, 2, 3; 4, 5, 6; 7, 8, 9}({1, 2}, :).
-PRINT {1, 2, 3; 4, 5, 6; 7, 8, 9}({1, 2, 3}, :).
-PRINT {1, 2, 3; 4, 5, 6; 7, 8, 9}({1; 3; 2}, :).
-PRINT {1, 2, 3; 4, 5, 6; 7, 8, 9}({1, 3, 3}, :).
-PRINT {1, 2, 3; 4, 5, 6; 7, 8, 9}(1:2, :).
-PRINT {1, 2, 3; 4, 5, 6; 7, 8, 9}(1:3, :).
-PRINT {1, 2, 3; 4, 5, 6; 7, 8, 9}({}, :).
-
-PRINT {1, 2, 3; 4, 5, 6; 7, 8, 9}(:, 1).
-PRINT {1, 2, 3; 4, 5, 6; 7, 8, 9}(:, {1}).
-PRINT {1, 2, 3; 4, 5, 6; 7, 8, 9}(:, {1, 2}).
-PRINT {1, 2, 3; 4, 5, 6; 7, 8, 9}(:, {1, 2, 3}).
-PRINT {1, 2, 3; 4, 5, 6; 7, 8, 9}(:, {1; 3; 2}).
-PRINT {1, 2, 3; 4, 5, 6; 7, 8, 9}(:, {1, 3, 3}).
-PRINT {1, 2, 3; 4, 5, 6; 7, 8, 9}(:, 1:2).
-PRINT {1, 2, 3; 4, 5, 6; 7, 8, 9}(:, 1:3).
-PRINT {1, 2, 3; 4, 5, 6; 7, 8, 9}(:, {}).
-
-PRINT {1, 2, 3; 4, 5, 6; 7, 8, 9}(:, :).
-
-PRINT {1, 2, 3; 4, 5, 6; 7, 8, 9}(0, :).
-PRINT {1, 2, 3; 4, 5, 6; 7, 8, 9}(:, 0).
-PRINT {1, 2, 3; 4, 5, 6; 7, 8, 9}(4, :).
-PRINT {1, 2, 3; 4, 5, 6; 7, 8, 9}(:, 4).
-
-PRINT {}(:,{}).
-PRINT {}({},:).
-PRINT {}({},{}).
-
-PRINT {1, 2, 3, 4}({1, 2; 3, 4}, :).
-PRINT {1, 2, 3, 4}(:, {1, 2; 3, 4}).
-END MATRIX.
-])
-AT_CHECK([pspp matrix.sps], [1], [dnl
-{1, 2, 3; 4, 5, 6; 7, 8, 9}(1, :)
-  1  2  3
-
-{1, 2, 3; 4, 5, 6; 7, 8, 9}({1}, :)
-  1  2  3
-
-{1, 2, 3; 4, 5, 6; 7, 8, 9}({1, 2}, :)
-  1  2  3
-  4  5  6
-
-{1, 2, 3; 4, 5, 6; 7, 8, 9}({1, 2, 3}, :)
-  1  2  3
-  4  5  6
-  7  8  9
-
-{1, 2, 3; 4, 5, 6; 7, 8, 9}({1; 3; 2}, :)
-  1  2  3
-  7  8  9
-  4  5  6
-
-{1, 2, 3; 4, 5, 6; 7, 8, 9}({1, 3, 3}, :)
-  1  2  3
-  7  8  9
-  7  8  9
-
-{1, 2, 3; 4, 5, 6; 7, 8, 9}(1:2, :)
-  1  2  3
-  4  5  6
-
-{1, 2, 3; 4, 5, 6; 7, 8, 9}(1:3, :)
-  1  2  3
-  4  5  6
-  7  8  9
-
-{1, 2, 3; 4, 5, 6; 7, 8, 9}({}, :)
-
-{1, 2, 3; 4, 5, 6; 7, 8, 9}(:, 1)
-  1
-  4
-  7
-
-{1, 2, 3; 4, 5, 6; 7, 8, 9}(:, {1})
-  1
-  4
-  7
-
-{1, 2, 3; 4, 5, 6; 7, 8, 9}(:, {1, 2})
-  1  2
-  4  5
-  7  8
-
-{1, 2, 3; 4, 5, 6; 7, 8, 9}(:, {1, 2, 3})
-  1  2  3
-  4  5  6
-  7  8  9
-
-{1, 2, 3; 4, 5, 6; 7, 8, 9}(:, {1; 3; 2})
-  1  3  2
-  4  6  5
-  7  9  8
-
-{1, 2, 3; 4, 5, 6; 7, 8, 9}(:, {1, 3, 3})
-  1  3  3
-  4  6  6
-  7  9  9
-
-{1, 2, 3; 4, 5, 6; 7, 8, 9}(:, 1:2)
-  1  2
-  4  5
-  7  8
-
-{1, 2, 3; 4, 5, 6; 7, 8, 9}(:, 1:3)
-  1  2  3
-  4  5  6
-  7  8  9
-
-{1, 2, 3; 4, 5, 6; 7, 8, 9}(:, {})
-
-
-
-{1, 2, 3; 4, 5, 6; 7, 8, 9}(:, :)
-  1  2  3
-  4  5  6
-  7  8  9
-
-matrix.sps:24.35: error: MATRIX: 0 is not a valid row index for a 3×3 matrix.
-   24 | PRINT {1, 2, 3; 4, 5, 6; 7, 8, 9}(0, :).
-      |                                   ^
-
-matrix.sps:25.38: error: MATRIX: 0 is not a valid column index for a 3×3
-matrix.
-   25 | PRINT {1, 2, 3; 4, 5, 6; 7, 8, 9}(:, 0).
-      |                                      ^
-
-matrix.sps:26.35: error: MATRIX: 4 is not a valid row index for a 3×3 matrix.
-   26 | PRINT {1, 2, 3; 4, 5, 6; 7, 8, 9}(4, :).
-      |                                   ^
-
-matrix.sps:27.38: error: MATRIX: 4 is not a valid column index for a 3×3
-matrix.
-   27 | PRINT {1, 2, 3; 4, 5, 6; 7, 8, 9}(:, 4).
-      |                                      ^
-
-{}(:,{})
-
-{}({},:)
-
-{}({},{})
-
-matrix.sps:33.20-33.31: error: MATRIX: Matrix row index must be scalar or
-vector, not a 2×2 matrix.
-   33 | PRINT {1, 2, 3, 4}({1, 2; 3, 4}, :).
-      |                    ^~~~~~~~~~~~
-
-matrix.sps:34.23-34.34: error: MATRIX: Matrix column index must be scalar or
-vector, not a 2×2 matrix.
-   34 | PRINT {1, 2, 3, 4}(:, {1, 2; 3, 4}).
-      |                       ^~~~~~~~~~~~
-])
-AT_CLEANUP
-
-AT_SETUP([MATRIX - COMPUTE submatrices as lvalues])
-AT_DATA([matrix.sps], [dnl
-MATRIX.
-COMPUTE y={1, 2, 3; 4, 5, 6; 7, 8, 9}.
-
-COMPUTE x1=y.
-COMPUTE x1(1, :) = {11, 12, 13}.
-PRINT x1.
-
-COMPUTE x2=y.
-COMPUTE x2(2, :) = {14, 15, 16}.
-PRINT x2.
-
-COMPUTE x3=y.
-COMPUTE x3(3, :) = {17, 18, 19}.
-PRINT x3.
-
-COMPUTE x4=y.
-COMPUTE x4(:, 1) = {11; 14; 17}.
-PRINT x4.
-
-COMPUTE x5=y.
-COMPUTE x5(:, 2) = {12; 15; 18}.
-PRINT x5.
-
-COMPUTE x6=y.
-COMPUTE x6(:, 3) = {13; 16; 19}.
-PRINT x6.
-
-COMPUTE x7=y.
-COMPUTE x7(1, 1) = 11.
-PRINT x7.
-
-COMPUTE x8=y.
-COMPUTE x8(1:2, 2:3) = {12, 13; 15, 16}.
-PRINT x8.
-
-COMPUTE x9=y.
-COMPUTE x9({3, 1}, {2; 3}) = {18, 19; 12, 13}.
-PRINT x9.
-END MATRIX.
-])
-AT_CHECK([pspp matrix.sps], [0], [dnl
-x1
-  11  12  13
-   4   5   6
-   7   8   9
-
-x2
-   1   2   3
-  14  15  16
-   7   8   9
-
-x3
-   1   2   3
-   4   5   6
-  17  18  19
-
-x4
-  11   2   3
-  14   5   6
-  17   8   9
-
-x5
-   1  12   3
-   4  15   6
-   7  18   9
-
-x6
-   1   2  13
-   4   5  16
-   7   8  19
-
-x7
-  11   2   3
-   4   5   6
-   7   8   9
-
-x8
-   1  12  13
-   4  15  16
-   7   8   9
-
-x9
-   1  12  13
-   4   5   6
-   7  18  19
-])
-AT_CLEANUP
-
-AT_SETUP([MATRIX - COMPUTE submatrices as lvalues - negative])
-AT_DATA([matrix.sps], [dnl
-MATRIX.
-COMPUTE x={1, 2, 3; 4, 5, 6; 7, 8, 9}.
-COMPUTE x(1, :) = {}.
-COMPUTE x(1, :) = 15.
-COMPUTE x(1, :) = {11, 12}.
-COMPUTE x(1, :) = {11, 12, 13, 14}.
-COMPUTE x(:, 1) = {}.
-COMPUTE x(:, 1) = 15.
-COMPUTE x(:, 1) = {11, 12}.
-COMPUTE x(:, 1) = {11, 12, 13, 14}.
-COMPUTE x(:) = 1.
-COMPUTE x(0, 1) = 1.
-COMPUTE x(1, 0) = 1.
-COMPUTE x({1, 0, 2}, 1) = {1; 2; 3}.
-COMPUTE x(4, 3) = 1.
-COMPUTE x(3, 4) = 1.
-COMPUTE x({1, 2; 3, 4}, 5) = 1.
-COMPUTE x(3, {1, 2; 3, 4}) = 1.
-PRINT x.
-END MATRIX.
-])
-AT_CHECK([pspp matrix.sps], [1], [dnl
-matrix.sps:3.9-3.15: error: MATRIX: Numbers of indexes for assigning to x
-differ from the size of the source matrix.
-    3 | COMPUTE x(1, :) = {}.
-      |         ^~~~~~~
-
-matrix.sps:3.11: note: MATRIX: There is 1 row index.
-    3 | COMPUTE x(1, :) = {}.
-      |           ^
-
-matrix.sps:3.14: note: MATRIX: Destination matrix x has 3 columns.
-    3 | COMPUTE x(1, :) = {}.
-      |              ^
-
-matrix.sps:3.19-3.20: note: MATRIX: The source matrix is 0×0.
-    3 | COMPUTE x(1, :) = {}.
-      |                   ^~
-
-matrix.sps:4.9-4.15: error: MATRIX: Number of column indexes for assigning to x
-differs from number of columns in source matrix.
-    4 | COMPUTE x(1, :) = 15.
-      |         ^~~~~~~
-
-matrix.sps:4.14: note: MATRIX: Destination matrix x has 3 columns.
-    4 | COMPUTE x(1, :) = 15.
-      |              ^
-
-matrix.sps:4.19-4.20: note: MATRIX: The source matrix is 1×1.
-    4 | COMPUTE x(1, :) = 15.
-      |                   ^~
-
-matrix.sps:5.9-5.15: error: MATRIX: Number of column indexes for assigning to x
-differs from number of columns in source matrix.
-    5 | COMPUTE x(1, :) = {11, 12}.
-      |         ^~~~~~~
-
-matrix.sps:5.14: note: MATRIX: Destination matrix x has 3 columns.
-    5 | COMPUTE x(1, :) = {11, 12}.
-      |              ^
-
-matrix.sps:5.19-5.26: note: MATRIX: The source matrix is 1×2.
-    5 | COMPUTE x(1, :) = {11, 12}.
-      |                   ^~~~~~~~
-
-matrix.sps:6.9-6.15: error: MATRIX: Number of column indexes for assigning to x
-differs from number of columns in source matrix.
-    6 | COMPUTE x(1, :) = {11, 12, 13, 14}.
-      |         ^~~~~~~
-
-matrix.sps:6.14: note: MATRIX: Destination matrix x has 3 columns.
-    6 | COMPUTE x(1, :) = {11, 12, 13, 14}.
-      |              ^
-
-matrix.sps:6.19-6.34: note: MATRIX: The source matrix is 1×4.
-    6 | COMPUTE x(1, :) = {11, 12, 13, 14}.
-      |                   ^~~~~~~~~~~~~~~~
-
-matrix.sps:7.9-7.15: error: MATRIX: Numbers of indexes for assigning to x
-differ from the size of the source matrix.
-    7 | COMPUTE x(:, 1) = {}.
-      |         ^~~~~~~
-
-matrix.sps:7.11: note: MATRIX: Destination matrix x has 3 rows.
-    7 | COMPUTE x(:, 1) = {}.
-      |           ^
-
-matrix.sps:7.14: note: MATRIX: There is 1 column index.
-    7 | COMPUTE x(:, 1) = {}.
-      |              ^
-
-matrix.sps:7.19-7.20: note: MATRIX: The source matrix is 0×0.
-    7 | COMPUTE x(:, 1) = {}.
-      |                   ^~
-
-matrix.sps:8.9-8.15: error: MATRIX: Number of row indexes for assigning to x
-differs from number of rows in source matrix.
-    8 | COMPUTE x(:, 1) = 15.
-      |         ^~~~~~~
-
-matrix.sps:8.11: note: MATRIX: Destination matrix x has 3 rows.
-    8 | COMPUTE x(:, 1) = 15.
-      |           ^
-
-matrix.sps:8.19-8.20: note: MATRIX: The source matrix is 1×1.
-    8 | COMPUTE x(:, 1) = 15.
-      |                   ^~
-
-matrix.sps:9.9-9.15: error: MATRIX: Numbers of indexes for assigning to x
-differ from the size of the source matrix.
-    9 | COMPUTE x(:, 1) = {11, 12}.
-      |         ^~~~~~~
-
-matrix.sps:9.11: note: MATRIX: Destination matrix x has 3 rows.
-    9 | COMPUTE x(:, 1) = {11, 12}.
-      |           ^
-
-matrix.sps:9.14: note: MATRIX: There is 1 column index.
-    9 | COMPUTE x(:, 1) = {11, 12}.
-      |              ^
-
-matrix.sps:9.19-9.26: note: MATRIX: The source matrix is 1×2.
-    9 | COMPUTE x(:, 1) = {11, 12}.
-      |                   ^~~~~~~~
-
-matrix.sps:10.9-10.15: error: MATRIX: Numbers of indexes for assigning to x
-differ from the size of the source matrix.
-   10 | COMPUTE x(:, 1) = {11, 12, 13, 14}.
-      |         ^~~~~~~
-
-matrix.sps:10.11: note: MATRIX: Destination matrix x has 3 rows.
-   10 | COMPUTE x(:, 1) = {11, 12, 13, 14}.
-      |           ^
-
-matrix.sps:10.14: note: MATRIX: There is 1 column index.
-   10 | COMPUTE x(:, 1) = {11, 12, 13, 14}.
-      |              ^
-
-matrix.sps:10.19-10.34: note: MATRIX: The source matrix is 1×4.
-   10 | COMPUTE x(:, 1) = {11, 12, 13, 14}.
-      |                   ^~~~~~~~~~~~~~~~
-
-matrix.sps:11.9-11.12: error: MATRIX: Can't use vector indexing on 3×3 matrix
-x.
-   11 | COMPUTE x(:) = 1.
-      |         ^~~~
-
-matrix.sps:12.11: error: MATRIX: 0 is not a valid row index for a 3×3 matrix.
-   12 | COMPUTE x(0, 1) = 1.
-      |           ^
-
-matrix.sps:13.14: error: MATRIX: 0 is not a valid column index for a 3×3
-matrix.
-   13 | COMPUTE x(1, 0) = 1.
-      |              ^
-
-matrix.sps:14.11-14.19: error: MATRIX: 0 is not a valid row index for a 3×3
-matrix.
-   14 | COMPUTE x({1, 0, 2}, 1) = {1; 2; 3}.
-      |           ^~~~~~~~~
-
-matrix.sps:15.11: error: MATRIX: 4 is not a valid row index for a 3×3 matrix.
-   15 | COMPUTE x(4, 3) = 1.
-      |           ^
-
-matrix.sps:16.14: error: MATRIX: 4 is not a valid column index for a 3×3
-matrix.
-   16 | COMPUTE x(3, 4) = 1.
-      |              ^
-
-matrix.sps:17.11-17.22: error: MATRIX: Matrix row index must be scalar or
-vector, not a 2×2 matrix.
-   17 | COMPUTE x({1, 2; 3, 4}, 5) = 1.
-      |           ^~~~~~~~~~~~
-
-matrix.sps:18.14-18.25: error: MATRIX: Matrix column index must be scalar or
-vector, not a 2×2 matrix.
-   18 | COMPUTE x(3, {1, 2; 3, 4}) = 1.
-      |              ^~~~~~~~~~~~
-
-x
-  1  2  3
-  4  5  6
-  7  8  9
-])
-AT_CLEANUP
-
-AT_SETUP([MATRIX - subvectors as rvalues])
-AT_DATA([matrix.sps], [dnl
-MATRIX.
-PRINT {10, 20, 30}({}).
-PRINT {10, 20, 30}(2).
-PRINT {10, 20, 30}({2}).
-PRINT {10, 20, 30}({1,3}).
-PRINT {10, 20, 30}({2,3}).
-PRINT {10, 20, 30}({1;3}).
-PRINT {10, 20, 30}({2;3}).
-PRINT {10, 20, 30}(2:3).
-PRINT {10, 20, 30}(:).
-
-PRINT {10; 20; 30}({}).
-PRINT {10; 20; 30}(2).
-PRINT {10; 20; 30}({2}).
-PRINT {10; 20; 30}({1,3}).
-PRINT {10; 20; 30}({2,3}).
-PRINT {10; 20; 30}({1;3}).
-PRINT {10; 20; 30}({2;3}).
-PRINT {10; 20; 30}(2:3).
-PRINT {10; 20; 30}(:).
-
-PRINT {}({}).
-
-PRINT {1, 2; 3, 4}(:).
-PRINT {1, 2, 3, 4}({1, 2; 3, 4}).
-PRINT {1, 2, 3, 4}(0).
-PRINT {1, 2, 3, 4}(5).
-END MATRIX.
-])
-AT_CHECK([pspp matrix.sps], [1], [dnl
-{10, 20, 30}({})
-
-{10, 20, 30}(2)
-  20
-
-{10, 20, 30}({2})
-  20
-
-{10, 20, 30}({1,3})
-  10  30
-
-{10, 20, 30}({2,3})
-  20  30
-
-{10, 20, 30}({1;3})
-  10  30
-
-{10, 20, 30}({2;3})
-  20  30
-
-{10, 20, 30}(2:3)
-  20  30
-
-{10, 20, 30}(:)
-  10  20  30
-
-{10; 20; 30}({})
-
-{10; 20; 30}(2)
-  20
-
-{10; 20; 30}({2})
-  20
-
-{10; 20; 30}({1,3})
-  10
-  30
-
-{10; 20; 30}({2,3})
-  20
-  30
-
-{10; 20; 30}({1;3})
-  10
-  30
-
-{10; 20; 30}({2;3})
-  20
-  30
-
-{10; 20; 30}(2:3)
-  20
-  30
-
-{10; 20; 30}(:)
-  10
-  20
-  30
-
-{}({})
-
-matrix.sps:24.7-24.18: error: MATRIX: Vector index operator may not be applied
-to a 2×2 matrix.
-   24 | PRINT {1, 2; 3, 4}(:).
-      |       ^~~~~~~~~~~~
-
-matrix.sps:25.20-25.31: error: MATRIX: Vector index must be scalar or vector,
-not a 2×2 matrix.
-   25 | PRINT {1, 2, 3, 4}({1, 2; 3, 4}).
-      |                    ^~~~~~~~~~~~
-
-matrix.sps:26.20: error: MATRIX: Index 0 is out of range for vector with 4
-elements.
-   26 | PRINT {1, 2, 3, 4}(0).
-      |                    ^
-
-matrix.sps:27.20: error: MATRIX: Index 5 is out of range for vector with 4
-elements.
-   27 | PRINT {1, 2, 3, 4}(5).
-      |                    ^
-])
-AT_CLEANUP
-
-AT_SETUP([MATRIX - COMPUTE subvectors as lvalues])
-AT_DATA([matrix.sps], [dnl
-MATRIX.
-COMPUTE r={1, 2, 3, 4, 5, 6, 7, 8, 9}.
-
-COMPUTE r1=r.
-COMPUTE r1(:) = {11, 12, 13, 14, 15, 16, 17, 18, 19}.
-PRINT r1.
-
-COMPUTE r2=r.
-COMPUTE r2(:) = {11; 12; 13; 14; 15; 16; 17; 18; 19}.
-PRINT r2.
-
-COMPUTE r3=r.
-COMPUTE r3(1) = 11.
-PRINT r3.
-
-COMPUTE r4=r.
-COMPUTE r4(1:2) = {11:12}.
-PRINT r4.
-
-COMPUTE r5=r.
-COMPUTE r5({8;9}) = {18:19}.
-PRINT r5.
-
-COMPUTE c={1, 2, 3, 4, 5, 6, 7, 8, 9}.
-
-COMPUTE c1=c.
-COMPUTE c1(:) = {11, 12, 13, 14, 15, 16, 17, 18, 19}.
-PRINT c1.
-
-COMPUTE c2=c.
-COMPUTE c2(:) = {11; 12; 13; 14; 15; 16; 17; 18; 19}.
-PRINT c2.
-
-COMPUTE c3=c.
-COMPUTE c3(1) = 11.
-PRINT c3.
-
-COMPUTE c4=c.
-COMPUTE c4(1:2) = {11:12}.
-PRINT c4.
-
-COMPUTE c5=c.
-COMPUTE c5(8:9) = {18:19}.
-PRINT c5.
-END MATRIX.
-])
-AT_CHECK([pspp matrix.sps], [0], [dnl
-r1
-  11  12  13  14  15  16  17  18  19
-
-r2
-  11  12  13  14  15  16  17  18  19
-
-r3
-  11   2   3   4   5   6   7   8   9
-
-r4
-  11  12   3   4   5   6   7   8   9
-
-r5
-   1   2   3   4   5   6   7  18  19
-
-c1
-  11  12  13  14  15  16  17  18  19
-
-c2
-  11  12  13  14  15  16  17  18  19
-
-c3
-  11   2   3   4   5   6   7   8   9
-
-c4
-  11  12   3   4   5   6   7   8   9
-
-c5
-   1   2   3   4   5   6   7  18  19
-])
-AT_CLEANUP
-
-AT_SETUP([MATRIX - COMPUTE subvectors as lvalues - negative])
-AT_DATA([matrix.sps], [dnl
-MATRIX.
-COMPUTE r={1, 2, 3, 4, 5, 6, 7, 8, 9}.
-COMPUTE r(1:3) = {1, 2; 3, 4}.
-COMPUTE r(1:3) = {}.
-COMPUTE r(1:3) = {1}.
-COMPUTE r(1:3) = {1, 2}.
-COMPUTE r(1:3) = {1, 2, 3, 4}.
-COMPUTE r(1:3) = {}.
-COMPUTE r(1:3) = {1}.
-COMPUTE r(1:3) = {1; 2}.
-COMPUTE r(1:3) = {1; 2; 3; 4}.
-COMPUTE r(:) = {1; 2; 3; 4}.
-COMPUTE r(0) = 5.
-COMPUTE r(10) = 5.
-COMPUTE r({1, 2; 3, 4}) = 1.
-
-COMPUTE c={1, 2, 3, 4, 5, 6, 7, 8, 9}.
-COMPUTE c(1:3) = {1, 2; 3, 4}.
-COMPUTE c(1:3) = {}.
-COMPUTE c(1:3) = {1}.
-COMPUTE c(1:3) = {1, 2}.
-COMPUTE c(1:3) = {1, 2, 3, 4}.
-COMPUTE c(1:3) = {}.
-COMPUTE c(1:3) = {1}.
-COMPUTE c(1:3) = {1; 2}.
-COMPUTE c(1:3) = {1; 2; 3; 4}.
-COMPUTE c(:) = {1; 2; 3; 4}.
-COMPUTE c(0) = 5.
-COMPUTE c(10) = 5.
-COMPUTE c({1, 2; 3, 4}) = 1.
-
-COMPUTE m = {1, 2; 3, 4}.
-COMPUTE m(5) = 1.
-COMPUTE m(:) = 1.
-END MATRIX.
-])
-AT_CHECK([pspp matrix.sps], [1], [dnl
-matrix.sps:3.9-3.14: error: MATRIX: Only an 3-element vector may be assigned to
-this 3-element subvector of r.
-    3 | COMPUTE r(1:3) = {1, 2; 3, 4}.
-      |         ^~~~~~
-
-matrix.sps:3.18-3.29: error: MATRIX: The source is an 2×2 matrix.
-    3 | COMPUTE r(1:3) = {1, 2; 3, 4}.
-      |                  ^~~~~~~~~~~~
-
-matrix.sps:4.9-4.14: error: MATRIX: Only an 3-element vector may be assigned to
-this 3-element subvector of r.
-    4 | COMPUTE r(1:3) = {}.
-      |         ^~~~~~
-
-matrix.sps:4.18-4.19: error: MATRIX: The source vector has 0 elements.
-    4 | COMPUTE r(1:3) = {}.
-      |                  ^~
-
-matrix.sps:5.9-5.14: error: MATRIX: Only an 3-element vector may be assigned to
-this 3-element subvector of r.
-    5 | COMPUTE r(1:3) = {1}.
-      |         ^~~~~~
-
-matrix.sps:5.19: error: MATRIX: The source vector has 1 element.
-    5 | COMPUTE r(1:3) = {1}.
-      |                   ^
-
-matrix.sps:6.9-6.14: error: MATRIX: Only an 3-element vector may be assigned to
-this 3-element subvector of r.
-    6 | COMPUTE r(1:3) = {1, 2}.
-      |         ^~~~~~
-
-matrix.sps:6.18-6.23: error: MATRIX: The source vector has 2 elements.
-    6 | COMPUTE r(1:3) = {1, 2}.
-      |                  ^~~~~~
-
-matrix.sps:7.9-7.14: error: MATRIX: Only an 3-element vector may be assigned to
-this 3-element subvector of r.
-    7 | COMPUTE r(1:3) = {1, 2, 3, 4}.
-      |         ^~~~~~
-
-matrix.sps:7.18-7.29: error: MATRIX: The source vector has 4 elements.
-    7 | COMPUTE r(1:3) = {1, 2, 3, 4}.
-      |                  ^~~~~~~~~~~~
-
-matrix.sps:8.9-8.14: error: MATRIX: Only an 3-element vector may be assigned to
-this 3-element subvector of r.
-    8 | COMPUTE r(1:3) = {}.
-      |         ^~~~~~
-
-matrix.sps:8.18-8.19: error: MATRIX: The source vector has 0 elements.
-    8 | COMPUTE r(1:3) = {}.
-      |                  ^~
-
-matrix.sps:9.9-9.14: error: MATRIX: Only an 3-element vector may be assigned to
-this 3-element subvector of r.
-    9 | COMPUTE r(1:3) = {1}.
-      |         ^~~~~~
-
-matrix.sps:9.19: error: MATRIX: The source vector has 1 element.
-    9 | COMPUTE r(1:3) = {1}.
-      |                   ^
-
-matrix.sps:10.9-10.14: error: MATRIX: Only an 3-element vector may be assigned
-to this 3-element subvector of r.
-   10 | COMPUTE r(1:3) = {1; 2}.
-      |         ^~~~~~
-
-matrix.sps:10.18-10.23: error: MATRIX: The source vector has 2 elements.
-   10 | COMPUTE r(1:3) = {1; 2}.
-      |                  ^~~~~~
-
-matrix.sps:11.9-11.14: error: MATRIX: Only an 3-element vector may be assigned
-to this 3-element subvector of r.
-   11 | COMPUTE r(1:3) = {1; 2; 3; 4}.
-      |         ^~~~~~
-
-matrix.sps:11.18-11.29: error: MATRIX: The source vector has 4 elements.
-   11 | COMPUTE r(1:3) = {1; 2; 3; 4}.
-      |                  ^~~~~~~~~~~~
-
-matrix.sps:12.9-12.12: error: MATRIX: Only an 9-element vector may be assigned
-to this 9-element subvector of r.
-   12 | COMPUTE r(:) = {1; 2; 3; 4}.
-      |         ^~~~
-
-matrix.sps:12.16-12.27: error: MATRIX: The source vector has 4 elements.
-   12 | COMPUTE r(:) = {1; 2; 3; 4}.
-      |                ^~~~~~~~~~~~
-
-matrix.sps:13.11: error: MATRIX: Index 0 is out of range for vector with 9
-elements.
-   13 | COMPUTE r(0) = 5.
-      |           ^
-
-matrix.sps:14.11-14.12: error: MATRIX: Index 10 is out of range for vector with
-9 elements.
-   14 | COMPUTE r(10) = 5.
-      |           ^~
-
-matrix.sps:15.11-15.22: error: MATRIX: Vector index must be scalar or vector,
-not a 2×2 matrix.
-   15 | COMPUTE r({1, 2; 3, 4}) = 1.
-      |           ^~~~~~~~~~~~
-
-matrix.sps:18.9-18.14: error: MATRIX: Only an 3-element vector may be assigned
-to this 3-element subvector of c.
-   18 | COMPUTE c(1:3) = {1, 2; 3, 4}.
-      |         ^~~~~~
-
-matrix.sps:18.18-18.29: error: MATRIX: The source is an 2×2 matrix.
-   18 | COMPUTE c(1:3) = {1, 2; 3, 4}.
-      |                  ^~~~~~~~~~~~
-
-matrix.sps:19.9-19.14: error: MATRIX: Only an 3-element vector may be assigned
-to this 3-element subvector of c.
-   19 | COMPUTE c(1:3) = {}.
-      |         ^~~~~~
-
-matrix.sps:19.18-19.19: error: MATRIX: The source vector has 0 elements.
-   19 | COMPUTE c(1:3) = {}.
-      |                  ^~
-
-matrix.sps:20.9-20.14: error: MATRIX: Only an 3-element vector may be assigned
-to this 3-element subvector of c.
-   20 | COMPUTE c(1:3) = {1}.
-      |         ^~~~~~
-
-matrix.sps:20.19: error: MATRIX: The source vector has 1 element.
-   20 | COMPUTE c(1:3) = {1}.
-      |                   ^
-
-matrix.sps:21.9-21.14: error: MATRIX: Only an 3-element vector may be assigned
-to this 3-element subvector of c.
-   21 | COMPUTE c(1:3) = {1, 2}.
-      |         ^~~~~~
-
-matrix.sps:21.18-21.23: error: MATRIX: The source vector has 2 elements.
-   21 | COMPUTE c(1:3) = {1, 2}.
-      |                  ^~~~~~
-
-matrix.sps:22.9-22.14: error: MATRIX: Only an 3-element vector may be assigned
-to this 3-element subvector of c.
-   22 | COMPUTE c(1:3) = {1, 2, 3, 4}.
-      |         ^~~~~~
-
-matrix.sps:22.18-22.29: error: MATRIX: The source vector has 4 elements.
-   22 | COMPUTE c(1:3) = {1, 2, 3, 4}.
-      |                  ^~~~~~~~~~~~
-
-matrix.sps:23.9-23.14: error: MATRIX: Only an 3-element vector may be assigned
-to this 3-element subvector of c.
-   23 | COMPUTE c(1:3) = {}.
-      |         ^~~~~~
-
-matrix.sps:23.18-23.19: error: MATRIX: The source vector has 0 elements.
-   23 | COMPUTE c(1:3) = {}.
-      |                  ^~
-
-matrix.sps:24.9-24.14: error: MATRIX: Only an 3-element vector may be assigned
-to this 3-element subvector of c.
-   24 | COMPUTE c(1:3) = {1}.
-      |         ^~~~~~
-
-matrix.sps:24.19: error: MATRIX: The source vector has 1 element.
-   24 | COMPUTE c(1:3) = {1}.
-      |                   ^
-
-matrix.sps:25.9-25.14: error: MATRIX: Only an 3-element vector may be assigned
-to this 3-element subvector of c.
-   25 | COMPUTE c(1:3) = {1; 2}.
-      |         ^~~~~~
-
-matrix.sps:25.18-25.23: error: MATRIX: The source vector has 2 elements.
-   25 | COMPUTE c(1:3) = {1; 2}.
-      |                  ^~~~~~
-
-matrix.sps:26.9-26.14: error: MATRIX: Only an 3-element vector may be assigned
-to this 3-element subvector of c.
-   26 | COMPUTE c(1:3) = {1; 2; 3; 4}.
-      |         ^~~~~~
-
-matrix.sps:26.18-26.29: error: MATRIX: The source vector has 4 elements.
-   26 | COMPUTE c(1:3) = {1; 2; 3; 4}.
-      |                  ^~~~~~~~~~~~
-
-matrix.sps:27.9-27.12: error: MATRIX: Only an 9-element vector may be assigned
-to this 9-element subvector of c.
-   27 | COMPUTE c(:) = {1; 2; 3; 4}.
-      |         ^~~~
-
-matrix.sps:27.16-27.27: error: MATRIX: The source vector has 4 elements.
-   27 | COMPUTE c(:) = {1; 2; 3; 4}.
-      |                ^~~~~~~~~~~~
-
-matrix.sps:28.11: error: MATRIX: Index 0 is out of range for vector with 9
-elements.
-   28 | COMPUTE c(0) = 5.
-      |           ^
-
-matrix.sps:29.11-29.12: error: MATRIX: Index 10 is out of range for vector with
-9 elements.
-   29 | COMPUTE c(10) = 5.
-      |           ^~
-
-matrix.sps:30.11-30.22: error: MATRIX: Vector index must be scalar or vector,
-not a 2×2 matrix.
-   30 | COMPUTE c({1, 2; 3, 4}) = 1.
-      |           ^~~~~~~~~~~~
-
-matrix.sps:33.9-33.12: error: MATRIX: Can't use vector indexing on 2×2 matrix
-m.
-   33 | COMPUTE m(5) = 1.
-      |         ^~~~
-
-matrix.sps:34.9-34.12: error: MATRIX: Can't use vector indexing on 2×2 matrix
-m.
-   34 | COMPUTE m(:) = 1.
-      |         ^~~~
-])
-AT_CLEANUP
-
-AT_SETUP([MATRIX - COMPUTE - negative])
-AT_DATA([matrix.sps], [dnl
-MATRIX.
-COMPUTE x.
-COMPUTE x=.
-COMPUTE x(5)=1.
-COMPUTE y(5)=1.
-END MATRIX.
-])
-AT_CHECK([pspp matrix.sps], [1], [dnl
-matrix.sps:2.10: error: COMPUTE: Syntax error expecting `='.
-    2 | COMPUTE x.
-      |          ^
-
-matrix.sps:3.11: error: COMPUTE: Syntax error expecting matrix expression.
-    3 | COMPUTE x=.
-      |           ^
-
-matrix.sps:4.9: error: MATRIX: Undefined variable x.
-    4 | COMPUTE x(5)=1.
-      |         ^
-
-matrix.sps:5.9: error: COMPUTE: Undefined variable y.
-    5 | COMPUTE y(5)=1.
-      |         ^
-])
-AT_CLEANUP
-
-AT_SETUP([MATRIX - elementwise arithmetic operators])
-AT_DATA([matrix.sps], [dnl
-MATRIX.
-PRINT (-(5)).
-PRINT (-{1,2;3,4}).
-
-PRINT ({1,2;3,4} + {5,6;7,8}).
-PRINT ({1,2;3,4} + 5).
-PRINT (5 + {5,6;7,8}).
-PRINT ({1,2;3,4} + {5,6}).
-
-PRINT ({1,2;3,4} - {5,6;7,8}).
-PRINT ({1,2;3,4} - 5).
-PRINT (5 - {5,6;7,8}).
-PRINT ({1,2;3,4} - {5,6}).
-
-PRINT ({1,2;3,4} * 5).
-PRINT (5 * {5,6;7,8}).
-
-PRINT ({2,4;6,8} / 2).
-PRINT (12 / {1,2;3,4}).
-PRINT ({2,8;18,32} / {1,2;3,4}).
-
-PRINT ({1,2;3,4} &* {5,6;7,8}).
-PRINT ({1,2;3,4} &* 5).
-PRINT (5 &* {5,6;7,8}).
-PRINT ({1,2;3,4} &* {5,6}).
-
-PRINT ({2,4;6,8} &/ 2).
-PRINT (12 &/ {1,2;3,4}).
-PRINT ({2,8;18,32} &/ {1,2;3,4}).
-
-PRINT ({1,2;3,4} &** 2).
-PRINT (2 &** {1,2;3,4}).
-PRINT ({1,2;3,4} &** {2,3;4,5}).
-PRINT ({1,2;3,4} &** {5,6}).
-END MATRIX.
-])
-AT_CHECK([pspp matrix.sps], [1], [dnl
-(-(5))
- -5
-
-(-{1,2;3,4})
- -1 -2
- -3 -4
-
-({1,2;3,4} + {5,6;7,8})
-   6   8
-  10  12
-
-({1,2;3,4} + 5)
-  6  7
-  8  9
-
-(5 + {5,6;7,8})
-  10  11
-  12  13
-
-matrix.sps:8.8-8.24: error: MATRIX: The operands of + must have the same
-dimensions or one must be a scalar.
-    8 | PRINT ({1,2;3,4} + {5,6}).
-      |        ^~~~~~~~~~~~~~~~~
-
-matrix.sps:8.8-8.16: note: MATRIX: The left-hand operand is a 2×2 matrix.
-    8 | PRINT ({1,2;3,4} + {5,6}).
-      |        ^~~~~~~~~
-
-matrix.sps:8.20-8.24: note: MATRIX: The right-hand operand is a 1×2 matrix.
-    8 | PRINT ({1,2;3,4} + {5,6}).
-      |                    ^~~~~
-
-({1,2;3,4} - {5,6;7,8})
- -4 -4
- -4 -4
-
-({1,2;3,4} - 5)
- -4 -3
- -2 -1
-
-(5 - {5,6;7,8})
-  0 -1
- -2 -3
-
-matrix.sps:13.8-13.24: error: MATRIX: The operands of - must have the same
-dimensions or one must be a scalar.
-   13 | PRINT ({1,2;3,4} - {5,6}).
-      |        ^~~~~~~~~~~~~~~~~
-
-matrix.sps:13.8-13.16: note: MATRIX: The left-hand operand is a 2×2 matrix.
-   13 | PRINT ({1,2;3,4} - {5,6}).
-      |        ^~~~~~~~~
-
-matrix.sps:13.20-13.24: note: MATRIX: The right-hand operand is a 1×2 matrix.
-   13 | PRINT ({1,2;3,4} - {5,6}).
-      |                    ^~~~~
-
-({1,2;3,4} * 5)
-   5  10
-  15  20
-
-(5 * {5,6;7,8})
-  25  30
-  35  40
-
-({2,4;6,8} / 2)
-  1  2
-  3  4
-
-(12 / {1,2;3,4})
-  12   6
-   4   3
-
-({2,8;18,32} / {1,2;3,4})
-  2  4
-  6  8
-
-({1,2;3,4} &* {5,6;7,8})
-   5  12
-  21  32
-
-({1,2;3,4} &* 5)
-   5  10
-  15  20
-
-(5 &* {5,6;7,8})
-  25  30
-  35  40
-
-matrix.sps:25.8-25.25: error: MATRIX: The operands of &* must have the same
-dimensions or one must be a scalar.
-   25 | PRINT ({1,2;3,4} &* {5,6}).
-      |        ^~~~~~~~~~~~~~~~~~
-
-matrix.sps:25.8-25.16: note: MATRIX: The left-hand operand is a 2×2 matrix.
-   25 | PRINT ({1,2;3,4} &* {5,6}).
-      |        ^~~~~~~~~
-
-matrix.sps:25.21-25.25: note: MATRIX: The right-hand operand is a 1×2 matrix.
-   25 | PRINT ({1,2;3,4} &* {5,6}).
-      |                     ^~~~~
-
-({2,4;6,8} &/ 2)
-  1  2
-  3  4
-
-(12 &/ {1,2;3,4})
-  12   6
-   4   3
-
-({2,8;18,32} &/ {1,2;3,4})
-  2  4
-  6  8
-
-({1,2;3,4} &** 2)
-   1   4
-   9  16
-
-(2 &** {1,2;3,4})
-   2   4
-   8  16
-
-({1,2;3,4} &** {2,3;4,5})
-     1     8
-    81  1024
-
-matrix.sps:34.8-34.26: error: MATRIX: The operands of &** must have the same
-dimensions or one must be a scalar.
-   34 | PRINT ({1,2;3,4} &** {5,6}).
-      |        ^~~~~~~~~~~~~~~~~~~
-
-matrix.sps:34.8-34.16: note: MATRIX: The left-hand operand is a 2×2 matrix.
-   34 | PRINT ({1,2;3,4} &** {5,6}).
-      |        ^~~~~~~~~
-
-matrix.sps:34.22-34.26: note: MATRIX: The right-hand operand is a 1×2 matrix.
-   34 | PRINT ({1,2;3,4} &** {5,6}).
-      |                      ^~~~~
-])
-AT_CLEANUP
-
-AT_SETUP([MATRIX - relational operators])
-AT_DATA([matrix.sps], [dnl
-MATRIX.
-PRINT ({1, 1; 2, 2} > {1, 2; 1, 2}).
-PRINT ({1, 1; 2, 2} > 1).
-PRINT (2 > {1, 2; 1, 2}).
-PRINT ({1, 2} > {1; 2}).
-
-PRINT ({1, 1; 2, 2} < {1, 2; 1, 2}).
-PRINT ({1, 1; 2, 2} < 2).
-PRINT (1 < {1, 2; 1, 2}).
-PRINT ({1, 2} < {1; 2}).
-
-PRINT ({1, 1; 2, 2} <> {1, 2; 1, 2}).
-PRINT ({1, 1; 2, 2} <> 2).
-PRINT (1 <> {1, 2; 1, 2}).
-PRINT ({1, 2} <> {1; 2}).
-
-PRINT ({1, 1; 2, 2} >= {1, 2; 1, 2}).
-PRINT ({1, 1; 2, 2} >= 2).
-PRINT (1 >= {1, 2; 1, 2}).
-PRINT ({1, 2} >= {1; 2}).
-
-PRINT ({1, 1; 2, 2} <= {1, 2; 1, 2}).
-PRINT ({1, 1; 2, 2} <= 2).
-PRINT (1 <= {1, 2; 1, 2}).
-PRINT ({1, 2} <= {1; 2}).
-
-PRINT ({1, 1; 2, 2} = {1, 2; 1, 2}).
-PRINT ({1, 1; 2, 2} = 2).
-PRINT (1 = {1, 2; 1, 2}).
-PRINT ({1, 2} = {1; 2}).
-END MATRIX.
-])
-AT_CHECK([pspp matrix.sps], [1], [dnl
-({1, 1; 2, 2} > {1, 2; 1, 2})
-  0  0
-  1  0
-
-({1, 1; 2, 2} > 1)
-  0  0
-  1  1
-
-(2 > {1, 2; 1, 2})
-  1  0
-  1  0
-
-matrix.sps:5.8-5.22: error: MATRIX: The operands of > must have the same
-dimensions or one must be a scalar.
-    5 | PRINT ({1, 2} > {1; 2}).
-      |        ^~~~~~~~~~~~~~~
-
-matrix.sps:5.8-5.13: note: MATRIX: The left-hand operand is a 1×2 matrix.
-    5 | PRINT ({1, 2} > {1; 2}).
-      |        ^~~~~~
-
-matrix.sps:5.17-5.22: note: MATRIX: The right-hand operand is a 2×1 matrix.
-    5 | PRINT ({1, 2} > {1; 2}).
-      |                 ^~~~~~
-
-({1, 1; 2, 2} < {1, 2; 1, 2})
-  0  1
-  0  0
-
-({1, 1; 2, 2} < 2)
-  1  1
-  0  0
-
-(1 < {1, 2; 1, 2})
-  0  1
-  0  1
-
-matrix.sps:10.8-10.22: error: MATRIX: The operands of < must have the same
-dimensions or one must be a scalar.
-   10 | PRINT ({1, 2} < {1; 2}).
-      |        ^~~~~~~~~~~~~~~
-
-matrix.sps:10.8-10.13: note: MATRIX: The left-hand operand is a 1×2 matrix.
-   10 | PRINT ({1, 2} < {1; 2}).
-      |        ^~~~~~
-
-matrix.sps:10.17-10.22: note: MATRIX: The right-hand operand is a 2×1 matrix.
-   10 | PRINT ({1, 2} < {1; 2}).
-      |                 ^~~~~~
-
-({1, 1; 2, 2} <> {1, 2; 1, 2})
-  0  1
-  1  0
-
-({1, 1; 2, 2} <> 2)
-  1  1
-  0  0
-
-(1 <> {1, 2; 1, 2})
-  0  1
-  0  1
-
-matrix.sps:15.8-15.23: error: MATRIX: The operands of <> must have the same
-dimensions or one must be a scalar.
-   15 | PRINT ({1, 2} <> {1; 2}).
-      |        ^~~~~~~~~~~~~~~~
-
-matrix.sps:15.8-15.13: note: MATRIX: The left-hand operand is a 1×2 matrix.
-   15 | PRINT ({1, 2} <> {1; 2}).
-      |        ^~~~~~
-
-matrix.sps:15.18-15.23: note: MATRIX: The right-hand operand is a 2×1 matrix.
-   15 | PRINT ({1, 2} <> {1; 2}).
-      |                  ^~~~~~
-
-({1, 1; 2, 2} >= {1, 2; 1, 2})
-  1  0
-  1  1
-
-({1, 1; 2, 2} >= 2)
-  0  0
-  1  1
-
-(1 >= {1, 2; 1, 2})
-  1  0
-  1  0
-
-matrix.sps:20.8-20.23: error: MATRIX: The operands of >= must have the same
-dimensions or one must be a scalar.
-   20 | PRINT ({1, 2} >= {1; 2}).
-      |        ^~~~~~~~~~~~~~~~
-
-matrix.sps:20.8-20.13: note: MATRIX: The left-hand operand is a 1×2 matrix.
-   20 | PRINT ({1, 2} >= {1; 2}).
-      |        ^~~~~~
-
-matrix.sps:20.18-20.23: note: MATRIX: The right-hand operand is a 2×1 matrix.
-   20 | PRINT ({1, 2} >= {1; 2}).
-      |                  ^~~~~~
-
-({1, 1; 2, 2} <= {1, 2; 1, 2})
-  1  1
-  0  1
-
-({1, 1; 2, 2} <= 2)
-  1  1
-  1  1
-
-(1 <= {1, 2; 1, 2})
-  1  1
-  1  1
-
-matrix.sps:25.8-25.23: error: MATRIX: The operands of <= must have the same
-dimensions or one must be a scalar.
-   25 | PRINT ({1, 2} <= {1; 2}).
-      |        ^~~~~~~~~~~~~~~~
-
-matrix.sps:25.8-25.13: note: MATRIX: The left-hand operand is a 1×2 matrix.
-   25 | PRINT ({1, 2} <= {1; 2}).
-      |        ^~~~~~
-
-matrix.sps:25.18-25.23: note: MATRIX: The right-hand operand is a 2×1 matrix.
-   25 | PRINT ({1, 2} <= {1; 2}).
-      |                  ^~~~~~
-
-({1, 1; 2, 2} = {1, 2; 1, 2})
-  1  0
-  0  1
-
-({1, 1; 2, 2} = 2)
-  0  0
-  1  1
-
-(1 = {1, 2; 1, 2})
-  1  0
-  1  0
-
-matrix.sps:30.8-30.22: error: MATRIX: The operands of = must have the same
-dimensions or one must be a scalar.
-   30 | PRINT ({1, 2} = {1; 2}).
-      |        ^~~~~~~~~~~~~~~
-
-matrix.sps:30.8-30.13: note: MATRIX: The left-hand operand is a 1×2 matrix.
-   30 | PRINT ({1, 2} = {1; 2}).
-      |        ^~~~~~
-
-matrix.sps:30.17-30.22: note: MATRIX: The right-hand operand is a 2×1 matrix.
-   30 | PRINT ({1, 2} = {1; 2}).
-      |                 ^~~~~~
-])
-AT_CLEANUP
-
-AT_SETUP([MATRIX - logical operators])
-AT_DATA([matrix.sps], [dnl
-MATRIX.
-PRINT (NOT {-1, 0, 1}).
-
-PRINT ({-1, 0, 1; -1, 0, 1; -1, 0, 1} AND {-1, -1, -1; 0, 0, 0; 1, 1, 1}).
-PRINT ({-1, 0, 1} AND -1).
-PRINT ({-1, 0, 1} AND 0).
-PRINT ({-1, 0, 1} AND 1).
-PRINT ({-1, 0} AND {2; 3}).
-
-PRINT ({-1, 0, 1; -1, 0, 1; -1, 0, 1} OR {-1, -1, -1; 0, 0, 0; 1, 1, 1}).
-PRINT ({-1, 0, 1} OR -1).
-PRINT ({-1, 0, 1} OR 0).
-PRINT ({-1, 0, 1} OR 1).
-PRINT ({-1, 0} OR {2; 3}).
-
-PRINT ({-1, 0, 1; -1, 0, 1; -1, 0, 1} XOR {-1, -1, -1; 0, 0, 0; 1, 1, 1}).
-PRINT ({-1, 0, 1} XOR -1).
-PRINT ({-1, 0, 1} XOR 0).
-PRINT ({-1, 0, 1} XOR 1).
-PRINT ({-1, 0} XOR {2; 3}).
-END MATRIX.
-])
-AT_CHECK([pspp matrix.sps], [1], [dnl
-(NOT {-1, 0, 1})
-  1  1  0
-
-({-1, 0, 1; -1, 0, 1; -1, 0, 1} AND {-1, -1, -1; 0, 0, 0; 1, 1, 1})
-  0  0  0
-  0  0  0
-  0  0  1
-
-({-1, 0, 1} AND -1)
- 0 0 0
-
-({-1, 0, 1} AND 0)
- 0 0 0
-
-({-1, 0, 1} AND 1)
-  0  0  1
-
-matrix.sps:8.8-8.25: error: MATRIX: The operands of AND must have the same
-dimensions or one must be a scalar.
-    8 | PRINT ({-1, 0} AND {2; 3}).
-      |        ^~~~~~~~~~~~~~~~~~
-
-matrix.sps:8.8-8.14: note: MATRIX: The left-hand operand is a 1×2 matrix.
-    8 | PRINT ({-1, 0} AND {2; 3}).
-      |        ^~~~~~~
-
-matrix.sps:8.20-8.25: note: MATRIX: The right-hand operand is a 2×1 matrix.
-    8 | PRINT ({-1, 0} AND {2; 3}).
-      |                    ^~~~~~
-
-({-1, 0, 1; -1, 0, 1; -1, 0, 1} OR {-1, -1, -1; 0, 0, 0; 1, 1, 1})
-  0  0  1
-  0  0  1
-  1  1  1
-
-({-1, 0, 1} OR -1)
-  0  0  1
-
-({-1, 0, 1} OR 0)
-  0  0  1
-
-({-1, 0, 1} OR 1)
-  1  1  1
-
-matrix.sps:14.8-14.24: error: MATRIX: The operands of OR must have the same
-dimensions or one must be a scalar.
-   14 | PRINT ({-1, 0} OR {2; 3}).
-      |        ^~~~~~~~~~~~~~~~~
-
-matrix.sps:14.8-14.14: note: MATRIX: The left-hand operand is a 1×2 matrix.
-   14 | PRINT ({-1, 0} OR {2; 3}).
-      |        ^~~~~~~
-
-matrix.sps:14.19-14.24: note: MATRIX: The right-hand operand is a 2×1 matrix.
-   14 | PRINT ({-1, 0} OR {2; 3}).
-      |                   ^~~~~~
-
-({-1, 0, 1; -1, 0, 1; -1, 0, 1} XOR {-1, -1, -1; 0, 0, 0; 1, 1, 1})
-  0  0  1
-  0  0  1
-  1  1  0
-
-({-1, 0, 1} XOR -1)
-  0  0  1
-
-({-1, 0, 1} XOR 0)
-  0  0  1
-
-({-1, 0, 1} XOR 1)
-  1  1  0
-
-matrix.sps:20.8-20.25: error: MATRIX: The operands of XOR must have the same
-dimensions or one must be a scalar.
-   20 | PRINT ({-1, 0} XOR {2; 3}).
-      |        ^~~~~~~~~~~~~~~~~~
-
-matrix.sps:20.8-20.14: note: MATRIX: The left-hand operand is a 1×2 matrix.
-   20 | PRINT ({-1, 0} XOR {2; 3}).
-      |        ^~~~~~~
-
-matrix.sps:20.20-20.25: note: MATRIX: The right-hand operand is a 2×1 matrix.
-   20 | PRINT ({-1, 0} XOR {2; 3}).
-      |                    ^~~~~~
-])
-AT_CLEANUP
-
-AT_SETUP([MATRIX - matrix operators])
-AT_DATA([matrix.sps], [dnl
-MATRIX.
-PRINT ({0, 1; 0, 0} * {0, 0; 1, 0}).
-PRINT ({0, 0; 1, 0} * {0, 1; 0, 0}).
-PRINT ({1, 2, 3; 4, 5, 6} * {7, 8; 9, 10; 11, 12}).
-PRINT ({3, 4, 2} * {13, 9, 7, 15; 8, 7, 4, 6; 6, 4, 0, 3}).
-COMPUTE m = {0, 1, 0, 0; 1, 0, 1, 0; 0, 1, 0, 1; 0, 0, 1, 0}.
-PRINT m**-2.
-PRINT m**-1.
-PRINT m**0.
-PRINT m**1.
-PRINT m**2.
-PRINT m**3.
-PRINT m**5.
-PRINT {3, 3.5; 3.2, 3.6}**-1/FORMAT F6.2.
-
-PRINT ({1, 2, 3} * {1, 2}).
-PRINT {1, 2, 3}**2.
-PRINT m**{1, 2}.
-PRINT m**1.5.
-END MATRIX.
-])
-AT_CHECK([pspp matrix.sps], [1], [dnl
-({0, 1; 0, 0} * {0, 0; 1, 0})
-  1  0
-  0  0
-
-({0, 0; 1, 0} * {0, 1; 0, 0})
-  0  0
-  0  1
-
-({1, 2, 3; 4, 5, 6} * {7, 8; 9, 10; 11, 12})
-   58   64
-  139  154
-
-({3, 4, 2} * {13, 9, 7, 15; 8, 7, 4, 6; 6, 4, 0, 3})
-  83  63  37  75
-
-m**-2
-  2  0 -1  0
-  0  1  0 -1
- -1  0  1  0
-  0 -1  0  2
-
-m**-1
-  0  1  0 -1
-  1  0  0  0
-  0  0  0  1
- -1  0  1  0
-
-m**0
-  1  0  0  0
-  0  1  0  0
-  0  0  1  0
-  0  0  0  1
-
-m**1
-  0  1  0  0
-  1  0  1  0
-  0  1  0  1
-  0  0  1  0
-
-m**2
-  1  0  1  0
-  0  2  0  1
-  1  0  2  0
-  0  1  0  1
-
-m**3
-  0  2  0  1
-  2  0  3  0
-  0  3  0  2
-  1  0  2  0
-
-m**5
-  0  5  0  3
-  5  0  8  0
-  0  8  0  5
-  3  0  5  0
-
-{3, 3.5; 3.2, 3.6}**-1
-  -9.00   8.75
-   8.00  -7.50
-
-matrix.sps:16.8-16.25: error: MATRIX: Matrices not conformable for
-multiplication.
-   16 | PRINT ({1, 2, 3} * {1, 2}).
-      |        ^~~~~~~~~~~~~~~~~~
-
-matrix.sps:16.8-16.16: note: MATRIX: The left-hand operand is a 1×3 matrix.
-   16 | PRINT ({1, 2, 3} * {1, 2}).
-      |        ^~~~~~~~~
-
-matrix.sps:16.20-16.25: note: MATRIX: The right-hand operand is a 1×2 matrix.
-   16 | PRINT ({1, 2, 3} * {1, 2}).
-      |                    ^~~~~~
-
-matrix.sps:17.7-17.15: error: MATRIX: Matrix exponentation with ** requires a
-square matrix on the left-hand size, not one with dimensions 1×3.
-   17 | PRINT {1, 2, 3}**2.
-      |       ^~~~~~~~~
-
-matrix.sps:18.10-18.15: error: MATRIX: Matrix exponentiation with ** requires a
-scalar on the right-hand side, not a matrix with dimensions 1×2.
-   18 | PRINT m**{1, 2}.
-      |          ^~~~~~
-
-matrix.sps:19.10-19.12: error: MATRIX: Exponent 1.5 in matrix exponentiation is
-non-integer or outside the valid range.
-   19 | PRINT m**1.5.
-      |          ^~~
-])
-AT_CLEANUP
-
-AT_SETUP([MATRIX - sequences and construction])
-AT_DATA([matrix.sps], [dnl
-MATRIX.
-PRINT {1:3:-1}.
-PRINT {1:3}.
-PRINT {1:10:2}.
-PRINT {1:11:2}.
-
-PRINT {-1:-3}.
-PRINT {-1:-3:-1}.
-PRINT {-1:-10:-2}.
-PRINT {-1:-11:-2}.
-
-PRINT {1:1}.
-PRINT {1:1:-1}.
-
-PRINT {1:3:0}.
-PRINT {-1:-3:0}.
-
-PRINT {1, 2; 3}.
-PRINT {{2; 5}, 3}.
-END MATRIX.
-])
-AT_CHECK([pspp matrix.sps], [1], [dnl
-{1:3:-1}
-
-{1:3}
-  1  2  3
-
-{1:10:2}
-  1  3  5  7  9
-
-{1:11:2}
-   1   3   5   7   9  11
-
-{-1:-3}
-
-{-1:-3:-1}
- -1 -2 -3
-
-{-1:-10:-2}
- -1 -3 -5 -7 -9
-
-{-1:-11:-2}
-  -1  -3  -5  -7  -9 -11
-
-{1:1}
-  1
-
-{1:1:-1}
-  1
-
-matrix.sps:15.12: error: MATRIX: The increment operand to : must be nonzero.
-   15 | PRINT {1:3:0}.
-      |            ^
-
-matrix.sps:16.14: error: MATRIX: The increment operand to : must be nonzero.
-   16 | PRINT {-1:-3:0}.
-      |              ^
-
-matrix.sps:18.7-18.15: error: MATRIX: This expression tries to vertically join
-matrices with differing numbers of columns.
-   18 | PRINT {1, 2; 3}.
-      |       ^~~~~~~~~
-
-matrix.sps:18.8-18.11: note: MATRIX: This operand is a 1×2 matrix.
-   18 | PRINT {1, 2; 3}.
-      |        ^~~~
-
-matrix.sps:18.14: note: MATRIX: This operand is a 1×1 matrix.
-   18 | PRINT {1, 2; 3}.
-      |              ^
-
-matrix.sps:19.7-19.17: error: MATRIX: This expression tries to horizontally
-join matrices with differing numbers of rows.
-   19 | PRINT {{2; 5}, 3}.
-      |       ^~~~~~~~~~~
-
-matrix.sps:19.8-19.13: note: MATRIX: This operand is a 2×1 matrix.
-   19 | PRINT {{2; 5}, 3}.
-      |        ^~~~~~
-
-matrix.sps:19.16: note: MATRIX: This operand is a 1×1 matrix.
-   19 | PRINT {{2; 5}, 3}.
-      |                ^
-])
-AT_CLEANUP
-
-AT_SETUP([MATRIX - comments])
-AT_DATA([matrix.sps], [dnl
-MATRIX.
-* Comment one.
-PRINT (1+2).
-COMMENT Comment two.
-PRINT (3+4).
-END MATRIX.
-])
-AT_CHECK([pspp matrix.sps], [0], [dnl
-(1+2)
-  3
-
-(3+4)
-  7
-])
-AT_CLEANUP
-
-AT_SETUP([MATRIX - string matrices])
-AT_DATA([matrix.sps], [dnl
-MATRIX.
-COMPUTE m={'This is', 'a string', 'matrix', 'including', 'some', 'long strings'}.
-PRINT m/FORMAT=A8.
-END MATRIX.
-])
-AT_CHECK([pspp matrix.sps], [0], [dnl
-m
- This is a string matrix includin some long str
-])
-AT_CLEANUP
-
-AT_SETUP([MATRIX - ABS ALL ANY ARSIN ARTAN])
-AT_DATA([matrix.sps], [dnl
-MATRIX.
-PRINT ABS({-1, 0, 1}).
-
-PRINT ALL({0, 0, 0}).
-PRINT ALL({-1, 1}).
-PRINT ALL({-1, 0, 1}).
-
-PRINT ANY({0, 0, 0}).
-PRINT ANY({-1, 1}).
-PRINT ANY({-1, 0, 1}).
-
-PRINT ARSIN({-1, 0, 1})/FORMAT=F5.2.
-
-PRINT ARTAN({-5, -1, 0, 1, 5})/FORMAT=F5.2.
-END MATRIX.
-])
-AT_CHECK([pspp matrix.sps], [0], [dnl
-ABS({-1, 0, 1})
-  1  0  1
-
-ALL({0, 0, 0})
- 0
-
-ALL({-1, 1})
-  1
-
-ALL({-1, 0, 1})
- 0
-
-ANY({0, 0, 0})
- 0
-
-ANY({-1, 1})
-  1
-
-ANY({-1, 0, 1})
-  1
-
-ARSIN({-1, 0, 1})
- -1.57   .00  1.57
-
-ARTAN({-5, -1, 0, 1, 5})
- -1.37  -.79   .00   .79  1.37
-])
-AT_CLEANUP
-
-AT_SETUP([MATRIX - BLOCK CHOL CMAX CMIN COS])
-AT_DATA([matrix.sps], [dnl
-MATRIX.
-PRINT BLOCK({1, 2; 3, 4}, 5, {7; 8; 9}, {10, 11}).
-
-COMPUTE b=CHOL({4, 12, -16; 12, 37, -43; -16, -43, 98}).
-PRINT b.
-PRINT (T(b)*b).
-
-PRINT CMAX({9, 3, 4; 5, 8, 6; 7, 4, 11}).
-
-PRINT CMIN({9, 3, 4; 5, 8, 6; 7, 4, 11}).
-
-PRINT COS({0.785, 1.57; 3.14, 1.57 + 3.14}) /FORMAT=F5.2.
-
-END MATRIX.
-])
-AT_CHECK([pspp matrix.sps], [0], [dnl
-BLOCK({1, 2; 3, 4}, 5, {7; 8; 9}, {10, 11})
-   1   2   0   0   0   0
-   3   4   0   0   0   0
-   0   0   5   0   0   0
-   0   0   0   7   0   0
-   0   0   0   8   0   0
-   0   0   0   9   0   0
-   0   0   0   0  10  11
-
-b
-  2  6 -8
-  0  1  5
-  0  0  3
-
-(T(b)*b)
-   4  12 -16
-  12  37 -43
- -16 -43  98
-
-CMAX({9, 3, 4; 5, 8, 6; 7, 4, 11})
-   9   8  11
-
-CMIN({9, 3, 4; 5, 8, 6; 7, 4, 11})
-  5  3  4
-
-COS({0.785, 1.57; 3.14, 1.57 + 3.14})
-   .71   .00
- -1.00   .00
-])
-AT_CLEANUP
-
-AT_SETUP([MATRIX - CSSQ CSUM DESIGN DET DIAG])
-AT_DATA([matrix.sps], [dnl
-MATRIX.
-PRINT CSSQ({1, 2, 3; 4, 5, 6; 7, 8, 9}).
-PRINT CSUM({1, 2, 3; 4, 5, 6; 7, 8, 9}).
-PRINT DESIGN({1, 2, 0; 2, 1, 0; 3, 0, 1}).
-PRINT DESIGN({1, 2, 0; 2, 2, 0; 3, 2, 1}).
-PRINT DET({1, 2, 3; 4, 5, 6; 7, 8, 9}) /FORMAT F4.1.
-PRINT DIAG({1, 2, 3, 4; 4, 5, 6, 7; 7, 8, 9, 10}).
-END MATRIX.
-])
-AT_CHECK([pspp matrix.sps], [0], [dnl
-CSSQ({1, 2, 3; 4, 5, 6; 7, 8, 9})
-   66   93  126
-
-CSUM({1, 2, 3; 4, 5, 6; 7, 8, 9})
-  12  15  18
-
-DESIGN({1, 2, 0; 2, 1, 0; 3, 0, 1})
-  1  0  0  0  0  1  1  0
-  0  1  0  0  1  0  1  0
-  0  0  1  1  0  0  0  1
-
-warning: Column 2 in DESIGN argument has constant value.
-
-DESIGN({1, 2, 0; 2, 2, 0; 3, 2, 1})
-  1  0  0  1  0
-  0  1  0  1  0
-  0  0  1  0  1
-
-DET({1, 2, 3; 4, 5, 6; 7, 8, 9})
-   .0
-
-DIAG({1, 2, 3, 4; 4, 5, 6, 7; 7, 8, 9, 10})
-  1
-  5
-  9
-])
-AT_CLEANUP
-
-AT_SETUP([MATRIX - EVAL EXP GINV GRADE GSCH])
-AT_DATA([matrix.sps], [dnl
-MATRIX.
-PRINT EVAL({2, 0, 0; 0, 3, 4; 0, 4, 9})/FORMAT=F5.2.
-
-PRINT EXP({2, 3; 4, 5})/FORMAT F5.2.
-
-PRINT GINV({1, 2})/FORMAT F5.2.
-COMPUTE a={1, 2, 3; 4, 5, 6; 7, 8, 9}.
-COMPUTE g=GINV(a).
-PRINT (a*g*a)/FORMAT F5.2.
-
-PRINT GRADE({1, 0, 3; 3, 1, 2; 3, 0, 5}).
-COMPUTE x={26, 690, 323, 208, 671, 818, 732, 711, 585, 792}.
-COMPUTE asort=x.
-COMPUTE asort(GRADE(asort))=asort.
-PRINT asort.
-COMPUTE dsort=x.
-COMPUTE dsort(GRADE(-dsort))=dsort.
-PRINT dsort.
-
-PRINT (GSCH({3, 2; 1, 2}) * SQRT(10))/FORMAT F5.2.
-PRINT (GSCH({0, 3, 6, 2; 0, 1, 2, 2}) * SQRT(10))/FORMAT F5.2.
-PRINT GSCH({0; 0}).
-PRINT GSCH({0, 0, 0; 0, 0, 0}).
-END MATRIX.
-])
-AT_CHECK([pspp matrix.sps], [1], [dnl
-EVAL({2, 0, 0; 0, 3, 4; 0, 4, 9})
- 11.00
-  2.00
-  1.00
-
-EXP({2, 3; 4, 5})
-  7.39 20.09
- 54.60 148.4
-
-GINV({1, 2})
-   .20
-   .40
-
-(a*g*a)
-  1.00  2.00  3.00
-  4.00  5.00  6.00
-  7.00  8.00  9.00
-
-GRADE({1, 0, 3; 3, 1, 2; 3, 0, 5})
-  3  1  6
-  7  4  5
-  8  2  9
-
-asort
-   26  208  323  585  671  690  711  732  792  818
-
-dsort
-  818  792  732  711  690  671  585  323  208   26
-
-(GSCH({3, 2; 1, 2}) * SQRT(10))
-  3.00 -1.00
-  1.00  3.00
-
-(GSCH({0, 3, 6, 2; 0, 1, 2, 2}) * SQRT(10))
-  3.00 -1.00
-  1.00  3.00
-
-matrix.sps:22.12-22.17: error: MATRIX: GSCH requires its argument to have at
-least as many columns as rows, but it has dimensions 2×1.
-   22 | PRINT GSCH({0; 0}).
-      |            ^~~~~~
-
-matrix.sps:23.12-23.29: error: MATRIX: 2×3 argument to GSCH contains only 0
-linearly independent columns.
-   23 | PRINT GSCH({0, 0, 0; 0, 0, 0}).
-      |            ^~~~~~~~~~~~~~~~~~
-])
-AT_CLEANUP
-
-AT_SETUP([MATRIX - IDENT INV KRONEKER LG10 LN])
-AT_DATA([matrix.sps], [dnl
-MATRIX.
-PRINT IDENT(1).
-PRINT IDENT(2).
-PRINT IDENT(3,5).
-PRINT IDENT(5,3).
-
-PRINT INV({3, 3.5; 3.2, 3.6})/FORMAT F8.2.
-PRINT INV({4, 7; 2, 6})/FORMAT F8.2.
-PRINT (INV({4, -2, 1; 5, 0, 3; -1, 2, 6})*52)/FORMAT F8.2.
-
-PRINT KRONEKER({1, 2; 3, 4}, {0, 5; 6, 7}).
-
-PRINT LG10({1, 10, 100, 1000}).
-
-PRINT LN({1, 2; 3, 4})/FORMAT F5.2.
-PRINT LN(0).
-END MATRIX.
-])
-AT_CHECK([pspp matrix.sps], [1], [dnl
-IDENT(1)
-  1
-
-IDENT(2)
-  1  0
-  0  1
-
-IDENT(3,5)
-  1  0  0  0  0
-  0  1  0  0  0
-  0  0  1  0  0
-
-IDENT(5,3)
-  1  0  0
-  0  1  0
-  0  0  1
-  0  0  0
-  0  0  0
-
-INV({3, 3.5; 3.2, 3.6})
-    -9.00     8.75
-     8.00    -7.50
-
-INV({4, 7; 2, 6})
-      .60     -.70
-     -.20      .40
-
-(INV({4, -2, 1; 5, 0, 3; -1, 2, 6})*52)
-    -6.00    14.00    -6.00
-   -33.00    25.00    -7.00
-    10.00    -6.00    10.00
-
-KRONEKER({1, 2; 3, 4}, {0, 5; 6, 7})
-   0   5   0  10
-   6   7  12  14
-   0  15   0  20
-  18  21  24  28
-
-LG10({1, 10, 100, 1000})
-  0  1  2  3
-
-LN({1, 2; 3, 4})
-   .00   .69
-  1.10  1.39
-
-matrix.sps:16.7-16.11: error: MATRIX: Argument 1 to matrix function LN must be
-greater than 0.
-   16 | PRINT LN(0).
-      |       ^~~~~
-
-matrix.sps:16.10: note: MATRIX: Argument 1 is 0.
-   16 | PRINT LN(0).
-      |          ^
-])
-AT_CLEANUP
-
-AT_SETUP([MATRIX - MAGIC])
-AT_DATA([matrix.sps], [dnl
-MATRIX.
-
-LOOP n=3 to 10.
-    COMPUTE m=MAGIC(n).
-    COMPUTE total=n*(n**2 + 1) / 2.
-    COMPUTE tb={MSUM(DIAG(T(m))), CSUM(m), MSUM(DIAG(m))} - total.
-    COMPUTE lr=RSUM(m) - total.
-    PRINT {tb; lr, m, lr; tb}/FORMAT F4.0.
-END LOOP.
-END MATRIX.
-])
-AT_CHECK([pspp matrix.sps], [0], [dnl
-{tb; lr, m, lr; tb}
-    0    0    0    0    0
-    0    8    1    6    0
-    0    3    5    7    0
-    0    4    9    2    0
-    0    0    0    0    0
-{tb; lr, m, lr; tb}
-    0    0    0    0    0    0
-    0    1    5   12   16    0
-    0   15   11    6    2    0
-    0   14    8    9    3    0
-    0    4   10    7   13    0
-    0    0    0    0    0    0
-{tb; lr, m, lr; tb}
-    0    0    0    0    0    0    0
-    0   17   24    1    8   15    0
-    0   23    5    7   14   16    0
-    0    4    6   13   20   22    0
-    0   10   12   19   21    3    0
-    0   11   18   25    2    9    0
-    0    0    0    0    0    0    0
-{tb; lr, m, lr; tb}
-    0    0    0    0    0    0    0    0
-    0    1    5    9   28   32   36    0
-    0   35   30   27   10    7    2    0
-    0   24   14   22   18   17   16    0
-    0   13   23   15   19   20   21    0
-    0   34   31   26   11    6    3    0
-    0    4    8   12   25   29   33    0
-    0    0    0    0    0    0    0    0
-{tb; lr, m, lr; tb}
-    0    0    0    0    0    0    0    0    0
-    0   30   39   48    1   10   19   28    0
-    0   38   47    7    9   18   27   29    0
-    0   46    6    8   17   26   35   37    0
-    0    5   14   16   25   34   36   45    0
-    0   13   15   24   33   42   44    4    0
-    0   21   23   32   41   43    3   12    0
-    0   22   31   40   49    2   11   20    0
-    0    0    0    0    0    0    0    0    0
-{tb; lr, m, lr; tb}
-    0    0    0    0    0    0    0    0    0    0
-    0    1    9   17   25   40   48   56   64    0
-    0   63   55   47   39   26   18   10    2    0
-    0    3   11   19   27   38   46   54   62    0
-    0   61   53   45   37   28   20   12    4    0
-    0   60   52   44   32   33   21   13    5    0
-    0    6   14   22   30   35   43   51   59    0
-    0   58   50   42   34   31   23   15    7    0
-    0    8   16   24   36   29   41   49   57    0
-    0    0    0    0    0    0    0    0    0    0
-{tb; lr, m, lr; tb}
-    0    0    0    0    0    0    0    0    0    0    0
-    0   47   58   69   80    1   12   23   34   45    0
-    0   57   68   79    9   11   22   33   44   46    0
-    0   67   78    8   10   21   32   43   54   56    0
-    0   77    7   18   20   31   42   53   55   66    0
-    0    6   17   19   30   41   52   63   65   76    0
-    0   16   27   29   40   51   62   64   75    5    0
-    0   26   28   39   50   61   72   74    4   15    0
-    0   36   38   49   60   71   73    3   14   25    0
-    0   37   48   59   70   81    2   13   24   35    0
-    0    0    0    0    0    0    0    0    0    0    0
-{tb; lr, m, lr; tb}
-    0    0    0    0    0    0    0    0    0    0    0    0
-    0    1    9   17   25   33   68   76   84   92  100    0
-    0   99   91   83   75   67   34   26   18   10    2    0
-    0    3   11   19   27   35   66   74   82   90   98    0
-    0   97   89   81   72   65   36   29   20   12    4    0
-    0   60   42   58   44   56   50   49   53   47   46    0
-    0   41   59   43   57   45   51   52   48   54   55    0
-    0   96   88   80   73   64   37   28   21   13    5    0
-    0    6   14   22   30   38   63   71   79   87   95    0
-    0   94   86   78   70   62   39   31   23   15    7    0
-    0    8   16   24   32   40   61   69   77   85   93    0
-    0    0    0    0    0    0    0    0    0    0    0    0
-])
-AT_CLEANUP
-
-AT_SETUP([MATRIX - MAKE MDIAG MMAX MMIN MOD])
-AT_DATA([matrix.sps], [dnl
-MATRIX.
-PRINT MAKE(1, 2, 3).
-PRINT MAKE(2, 1, 4).
-PRINT MAKE(2, 3, 5).
-
-PRINT MDIAG({1, 2, 3, 4}).
-PRINT MDIAG({1; 2; 3; 4}).
-PRINT MDIAG({1, 2; 3, 4}).
-
-PRINT MMAX({55, 44; 66, 11}).
-
-PRINT MMIN({55, 44; 66, 11}).
-
-PRINT MOD({5, 4, 3, 2, 1, 0}, 3).
-PRINT MOD({5, 4, 3, 2, 1, 0}, -3).
-PRINT MOD({-5, -4, -3, -2, -1, 0}, 3).
-PRINT MOD({-5, -4, -3, -2, -1, 0}, -3).
-PRINT MOD({5, 4, 3, 2, 1, 0}, 1.5) /FORMAT F5.1.
-PRINT MOD({5, 4, 3, 2, 1, 0}, 0).
-END MATRIX.
-])
-AT_CHECK([pspp matrix.sps], [1], [dnl
-MAKE(1, 2, 3)
-  3  3
-
-MAKE(2, 1, 4)
-  4
-  4
-
-MAKE(2, 3, 5)
-  5  5  5
-  5  5  5
-
-MDIAG({1, 2, 3, 4})
-  1  0  0  0
-  0  2  0  0
-  0  0  3  0
-  0  0  0  4
-
-MDIAG({1; 2; 3; 4})
-  1  0  0  0
-  0  2  0  0
-  0  0  3  0
-  0  0  0  4
-
-matrix.sps:8.13-8.24: error: MATRIX: Function MDIAG argument 1 must be a
-vector, not a 2×2 matrix.
-    8 | PRINT MDIAG({1, 2; 3, 4}).
-      |             ^~~~~~~~~~~~
-
-MMAX({55, 44; 66, 11})
-  66
-
-MMIN({55, 44; 66, 11})
-  11
-
-MOD({5, 4, 3, 2, 1, 0}, 3)
-  2  1  0  2  1  0
-
-MOD({5, 4, 3, 2, 1, 0}, -3)
-  2  1  0  2  1  0
-
-MOD({-5, -4, -3, -2, -1, 0}, 3)
- -2 -1  0 -2 -1  0
-
-MOD({-5, -4, -3, -2, -1, 0}, -3)
- -2 -1  0 -2 -1  0
-
-MOD({5, 4, 3, 2, 1, 0}, 1.5)
-    .5   1.0    .0    .5   1.0    .0
-
-matrix.sps:19.7-19.32: error: MATRIX: Argument 2 to matrix function MOD must
-not be equal to 0.
-   19 | PRINT MOD({5, 4, 3, 2, 1, 0}, 0).
-      |       ^~~~~~~~~~~~~~~~~~~~~~~~~~
-])
-AT_CLEANUP
-
-AT_SETUP([MATRIX - MSSQ MSUM NCOL NROW RANK])
-AT_DATA([matrix.sps], [dnl
-MATRIX.
-PRINT MSSQ({1, 0, 1; -2, -3, 1; 3, 3, 0}).
-
-PRINT MSUM({1, 0, 1; -2, -3, 1; 3, 3, 0}).
-
-PRINT NCOL({1, 0; -2, -3; 3, 3}).
-
-PRINT NROW({1, 0; -2, -3; 3, 3}).
-
-PRINT RANK({1, 0, 1; -2, -3, 1; 3, 3, 0}).
-PRINT RANK({1, 1, 0, 2; -1, -1, 0, -2}).
-PRINT RANK({1, -1; 1, -1; 0, 0; 2, -2}).
-PRINT RANK({1, 2, 1; -2, -3, 1; 3, 5, 0}).
-PRINT RANK({1, 0, 2; 2, 1, 0; 3, 2, 1}).
-END MATRIX.
-])
-AT_CHECK([pspp matrix.sps], [0], [dnl
-MSSQ({1, 0, 1; -2, -3, 1; 3, 3, 0})
-  34
-
-MSUM({1, 0, 1; -2, -3, 1; 3, 3, 0})
-  4
-
-NCOL({1, 0; -2, -3; 3, 3})
-  2
-
-NROW({1, 0; -2, -3; 3, 3})
-  3
-
-RANK({1, 0, 1; -2, -3, 1; 3, 3, 0})
-  2
-
-RANK({1, 1, 0, 2; -1, -1, 0, -2})
-  1
-
-RANK({1, -1; 1, -1; 0, 0; 2, -2})
-  1
-
-RANK({1, 2, 1; -2, -3, 1; 3, 5, 0})
-  2
-
-RANK({1, 0, 2; 2, 1, 0; 3, 2, 1})
-  3
-])
-AT_CLEANUP
-
-AT_SETUP([MATRIX - RESHAPE RMAX RMIN RND RNKORDER])
-AT_DATA([matrix.sps], [dnl
-MATRIX.
-PRINT RESHAPE(1:12, 1, 12).
-PRINT RESHAPE(1:12, 2, 6).
-PRINT RESHAPE(1:12, 3, 4).
-PRINT RESHAPE(1:12, 4, 3).
-PRINT RESHAPE(1:12, 6, 2).
-PRINT RESHAPE(1:12, 12, 1).
-
-PRINT RMAX({1, 0, 1; -2, -3, 1; 3, 3, 0}).
-
-PRINT RMIN({1, 0, 1; -2, -3, 1; 3, 3, 0}).
-
-PRINT RND({-1.6, -1.5, -1.4;
-           -.6, -.5, -.4;
-           .4, .5, .6;
-           1.4, 1.5, 1.6})/FORMAT F5.1.
-
-PRINT RNKORDER({1, 0, 3; 3, 1, 2; 3, 0, 5}) /FORMAT F5.1.
-END MATRIX.
-])
-AT_CHECK([pspp matrix.sps], [0], [dnl
-RESHAPE(1:12, 1, 12)
-   1   2   3   4   5   6   7   8   9  10  11  12
-
-RESHAPE(1:12, 2, 6)
-   1   2   3   4   5   6
-   7   8   9  10  11  12
-
-RESHAPE(1:12, 3, 4)
-   1   2   3   4
-   5   6   7   8
-   9  10  11  12
-
-RESHAPE(1:12, 4, 3)
-   1   2   3
-   4   5   6
-   7   8   9
-  10  11  12
-
-RESHAPE(1:12, 6, 2)
-   1   2
-   3   4
-   5   6
-   7   8
-   9  10
-  11  12
-
-RESHAPE(1:12, 12, 1)
-   1
-   2
-   3
-   4
-   5
-   6
-   7
-   8
-   9
-  10
-  11
-  12
-
-RMAX({1, 0, 1; -2, -3, 1; 3, 3, 0})
-  1
-  1
-  3
-
-RMIN({1, 0, 1; -2, -3, 1; 3, 3, 0})
-  0
- -3
-  0
-
-RND({-1.6, -1.5, -1.4;
-           -.6, -.5, -.4;
-           .4, .5, .6;
-           1.4, 1.5, 1.6})
-  -2.0  -2.0  -1.0
-  -1.0    .0    .0
-    .0    .0   1.0
-   1.0   2.0   2.0
-
-RNKORDER({1, 0, 3; 3, 1, 2; 3, 0, 5})
-   3.5   1.5   7.0
-   7.0   3.5   5.0
-   7.0   1.5   9.0
-])
-AT_CLEANUP
-
-AT_SETUP([MATRIX - RSSQ RSUM SIN SOLVE SQRT])
-AT_DATA([matrix.sps], [dnl
-MATRIX.
-PRINT RSSQ({1, 2, 3; 4, 5, 6; 7, 8, 9}).
-PRINT RSUM({1, 2, 3; 4, 5, 6; 7, 8, 9}).
-
-PRINT SIN({0, .78, 1.57, 2.35, 3.14}) /FORMAT F5.2.
-
-PRINT SOLVE({2, 3; 4, 9}, {6, 2; 15, 5}) /FORMAT=F6.2.
-PRINT SOLVE({1, 3, -2; 3, 5, 6; 2, 4, 3}, {5; 7; 8}) /FORMAT=F6.2.
-PRINT SOLVE({2, 1, -1; -3, -1, 2; -2, 1, 2}, {8; -11; -3}) /FORMAT=F6.2.
-PRINT SOLVE({1, 2; 3, 4}, {1, 2}).
-
-PRINT SQRT({0, 1, 2, 3, 4, 9, 81}) /FORMAT=F5.2.
-PRINT SQRT(-1).
-END MATRIX.
-])
-AT_CHECK([pspp matrix.sps], [1], [dnl
-RSSQ({1, 2, 3; 4, 5, 6; 7, 8, 9})
-   14
-   77
-  194
-
-RSUM({1, 2, 3; 4, 5, 6; 7, 8, 9})
-   6
-  15
-  24
-
-SIN({0, .78, 1.57, 2.35, 3.14})
-   .00   .70  1.00   .71   .00
-
-SOLVE({2, 3; 4, 9}, {6, 2; 15, 5})
-   1.50    .50
-   1.00    .33
-
-SOLVE({1, 3, -2; 3, 5, 6; 2, 4, 3}, {5; 7; 8})
- -15.00
-   8.00
-   2.00
-
-SOLVE({2, 1, -1; -3, -1, 2; -2, 1, 2}, {8; -11; -3})
-   2.00
-   3.00
-  -1.00
-
-matrix.sps:10.7-10.33: error: MATRIX: SOLVE arguments must have the same number
-of rows.
-   10 | PRINT SOLVE({1, 2; 3, 4}, {1, 2}).
-      |       ^~~~~~~~~~~~~~~~~~~~~~~~~~~
-
-matrix.sps:10.13-10.24: note: MATRIX: Argument 1 has dimensions 2×2.
-   10 | PRINT SOLVE({1, 2; 3, 4}, {1, 2}).
-      |             ^~~~~~~~~~~~
-
-matrix.sps:10.27-10.32: note: MATRIX: Argument 2 has dimensions 1×2.
-   10 | PRINT SOLVE({1, 2; 3, 4}, {1, 2}).
-      |                           ^~~~~~
-
-SQRT({0, 1, 2, 3, 4, 9, 81})
-   .00  1.00  1.41  1.73  2.00  3.00  9.00
-
-matrix.sps:13.7-13.14: error: MATRIX: Argument 1 to matrix function SQRT must
-be greater than or equal to 0.
-   13 | PRINT SQRT(-1).
-      |       ^~~~~~~~
-
-matrix.sps:13.12-13.13: note: MATRIX: Argument 1 is -1.
-   13 | PRINT SQRT(-1).
-      |            ^~
-])
-AT_CLEANUP
-
-AT_SETUP([MATRIX - SSCP SVAL SWEEP TRACE TRANSPOS TRUNC])
-AT_DATA([matrix.sps], [dnl
-MATRIX.
-COMPUTE m={1, 2, 3; 4, 5, 6}
-COMPUTE sscp1=SSCP(m).
-COMPUTE sscp2=T(m)*m.
-PRINT sscp1.
-PRINT (sscp1 <> sscp2).
-
-PRINT SVAL({1, 1; 0, 0})/FORMAT F5.2.
-PRINT SVAL({1, 0, 1; 0, 1, 1; 0, 0, 0})/FORMAT F5.2.
-PRINT SVAL({1, 0, 0, 0, 2; 0, 0, 3, 0, 0; 0, 0, 0, 0, 0; 0, 2, 0, 0, 0})
-    /FORMAT F5.2.
-PRINT SVAL({2, 4; 1, 3; 0, 0; 0, 0})/FORMAT F5.2.
-
-COMPUTE s0 = {6, 12, 0, 12; 12, 28, 0, 25; 0, 0, 6, 2; 12, 25, 2, 28}.
-PRINT SWEEP(s0, 1)/FORMAT F5.2.
-PRINT SWEEP(SWEEP(s0, 1), 2)/FORMAT F5.2.
-PRINT SWEEP(SWEEP(SWEEP(s0, 1), 2), 3)/FORMAT F5.2.
-
-COMPUTE s1 = {6, 12, 0, 12; 12, 0, 0, 25; 0, 0, 6, 2; 12, 25, 2, 28}.
-PRINT SWEEP(s1, 2).
-
-COMPUTE s2 = {0, 1, 2; 3, 4, 5; 6, 7, 8}.
-PRINT SWEEP(s2, 1).
-PRINT SWEEP(s2, 2).
-PRINT SWEEP(s2, 3).
-
-PRINT TRACE(s0).
-
-PRINT T(s0).
-PRINT TRANSPOS(s0).
-PRINT ALL(T(T(s0)) = s0).
-
-PRINT TRUNC(SVAL({2, 4; 1, 3; 0, 0; 0, 0})).
-PRINT TRUNC(-SVAL({2, 4; 1, 3; 0, 0; 0, 0})).
-END MATRIX.
-])
-AT_CHECK([pspp matrix.sps], [0], [dnl
-sscp1
-  17  22  27
-  22  29  36
-  27  36  45
-
-(sscp1 <> sscp2)
- 0 0 0
- 0 0 0
- 0 0 0
-
-SVAL({1, 1; 0, 0})
-  1.41
-   .00
-
-SVAL({1, 0, 1; 0, 1, 1; 0, 0, 0})
-  1.73
-  1.00
-   .00
-
-SVAL({1, 0, 0, 0, 2; 0, 0, 3, 0, 0; 0, 0, 0, 0, 0; 0, 2, 0, 0, 0})
-  3.00
-  2.24
-  2.00
-   .00
-
-SVAL({2, 4; 1, 3; 0, 0; 0, 0})
-  5.46
-   .37
-
-SWEEP(s0, 1)
-   .17  2.00   .00  2.00
- -2.00  4.00   .00  1.00
-   .00   .00  6.00  2.00
- -2.00  1.00  2.00  4.00
-
-SWEEP(SWEEP(s0, 1), 2)
-  1.17  -.50   .00  1.50
-  -.50   .25   .00   .25
-   .00   .00  6.00  2.00
- -1.50  -.25  2.00  3.75
-
-SWEEP(SWEEP(SWEEP(s0, 1), 2), 3)
-  1.17  -.50   .00  1.50
-  -.50   .25   .00   .25
-   .00   .00   .17   .33
- -1.50  -.25  -.33  3.08
-
-SWEEP(s1, 2)
-   6   0   0  12
-   0   0   0   0
-   0   0   6   2
-  12   0   2  28
-
-SWEEP(s2, 1)
-  0  0  0
-  0  4  5
-  0  7  8
-
-SWEEP(s2, 2)
-  -.7500000000  -.2500000000   .7500000000
-   .7500000000   .2500000000  1.2500000000
-   .7500000000 -1.7500000000  -.7500000000
-
-SWEEP(s2, 3)
- -1.5000000000  -.7500000000  -.2500000000
-  -.7500000000  -.3750000000  -.6250000000
-   .7500000000   .8750000000   .1250000000
-
-TRACE(s0)
-  68
-
-T(s0)
-   6  12   0  12
-  12  28   0  25
-   0   0   6   2
-  12  25   2  28
-
-TRANSPOS(s0)
-   6  12   0  12
-  12  28   0  25
-   0   0   6   2
-  12  25   2  28
-
-ALL(T(T(s0)) = s0)
-  1
-
-TRUNC(SVAL({2, 4; 1, 3; 0, 0; 0, 0}))
-  5
-  0
-
-TRUNC(-SVAL({2, 4; 1, 3; 0, 0; 0, 0}))
- -5
-  0
-])
-AT_CLEANUP
-
-AT_SETUP([MATRIX - UNIFORM])
-AT_DATA([matrix.sps], [dnl
-SET SEED=10.
-MATRIX.
-PRINT (UNIFORM(4, 5)*10)/FORMAT F5.2.
-END MATRIX.
-])
-AT_CHECK([pspp matrix.sps], [0], [dnl
-(UNIFORM(4, 5)*10)
-  7.71  2.99   .21  4.95  6.34
-  4.43  7.49  8.32  4.99  5.83
-  2.25   .25  1.98  7.09  7.61
-  2.66  1.69  2.64   .88  1.50
-])
-AT_CLEANUP
-
-AT_SETUP([MATRIX - invalid function arguments])
-AT_DATA([matrix.sps], [dnl
-MATRIX.
-COMPUTE x=MOD({1,2,3},{4,5,6}).
-COMPUTE x=MDIAG({1, 2; 3, 4}).
-COMPUTE x=ARSIN(2).
-COMPUTE x=ARSIN({1, 1; -1, 2}).
-COMPUTE x=CDF.UNIFORM(2,1,1).
-COMPUTE x=CDF.UNIFORM(1,2,1).
-COMPUTE x=CDF.UNIFORM({1,2},1,1).
-COMPUTE x=MAGIC(2).
-END MATRIX.
-])
-AT_CHECK([pspp matrix.sps], [1], [dnl
-matrix.sps:2.23-2.29: error: MATRIX: Function MOD argument 2 must be a scalar,
-not a 1×3 matrix.
-    2 | COMPUTE x=MOD({1,2,3},{4,5,6}).
-      |                       ^~~~~~~
-
-matrix.sps:3.17-3.28: error: MATRIX: Function MDIAG argument 1 must be a
-vector, not a 2×2 matrix.
-    3 | COMPUTE x=MDIAG({1, 2; 3, 4}).
-      |                 ^~~~~~~~~~~~
-
-matrix.sps:4.17: error: MATRIX: Argument 1 to matrix function ARSIN is 2, which
-is outside the valid range [[-1,1]].
-    4 | COMPUTE x=ARSIN(2).
-      |                 ^
-
-matrix.sps:5.17-5.29: error: MATRIX: Row 2, column 2 of argument 1 to matrix
-function ARSIN is 2, which is outside the valid range [[-1,1]].
-    5 | COMPUTE x=ARSIN({1, 1; -1, 2}).
-      |                 ^~~~~~~~~~~~~
-
-error: Argument 1 to matrix function CDF.UNIFORM must be less than or equal to
-argument 3.
-
-matrix.sps:6.23: note: MATRIX: Argument 1 is 2.
-    6 | COMPUTE x=CDF.UNIFORM(2,1,1).
-      |                       ^
-
-matrix.sps:6.27: note: MATRIX: Argument 3 is 1.
-    6 | COMPUTE x=CDF.UNIFORM(2,1,1).
-      |                           ^
-
-error: Argument 2 to matrix function CDF.UNIFORM must be less than or equal to
-argument 3.
-
-matrix.sps:7.25: note: MATRIX: Argument 2 is 2.
-    7 | COMPUTE x=CDF.UNIFORM(1,2,1).
-      |                         ^
-
-matrix.sps:7.27: note: MATRIX: Argument 3 is 1.
-    7 | COMPUTE x=CDF.UNIFORM(1,2,1).
-      |                           ^
-
-error: Argument 1 to matrix function CDF.UNIFORM must be less than or equal to
-argument 3.
-
-matrix.sps:8.23-8.27: note: MATRIX: Row 1, column 2 of argument 1 is 2.
-    8 | COMPUTE x=CDF.UNIFORM({1,2},1,1).
-      |                       ^~~~~
-
-matrix.sps:8.31: note: MATRIX: Argument 3 is 1.
-    8 | COMPUTE x=CDF.UNIFORM({1,2},1,1).
-      |                               ^
-
-matrix.sps:9.11-9.18: error: MATRIX: Argument 1 to matrix function MAGIC must
-be greater than or equal to 3.
-    9 | COMPUTE x=MAGIC(2).
-      |           ^~~~~~~~
-
-matrix.sps:9.17: note: MATRIX: Argument 1 is 2.
-    9 | COMPUTE x=MAGIC(2).
-      |                 ^
-])
-AT_CLEANUP
-
-AT_SETUP([MATRIX - invalid number function arguments])
-AT_DATA([matrix.sps], [dnl
-MATRIX.
-COMPUTE x=ABS().
-COMPUTE x=ABS(1,2).
-COMPUTE x=KRONEKER(1,2,3).
-COMPUTE x=IDENT().
-COMPUTE x=IDENT(1,2,3).
-COMPUTE x=BLOCK().
-END MATRIX.
-])
-AT_CHECK([pspp matrix.sps], [1], [dnl
-matrix.sps:2: error: COMPUTE: Matrix function ABS requires 1 argument.
-
-matrix.sps:3: error: COMPUTE: Matrix function ABS requires 1 argument.
-
-matrix.sps:4: error: COMPUTE: Matrix function KRONEKER requires 2 arguments.
-
-matrix.sps:5: error: COMPUTE: Matrix function IDENT requires 1 or 2 arguments,
-but 0 were provided.
-
-matrix.sps:6: error: COMPUTE: Matrix function IDENT requires 1 or 2 arguments,
-but 3 were provided.
-
-matrix.sps:7: error: COMPUTE: Matrix function BLOCK requires at least one
-argument.
-])
-AT_CLEANUP
-
-AT_SETUP([MATRIX - CALL SETDIAG])
-AT_DATA([matrix.sps], [dnl
-MATRIX.
-COMPUTE x={1, 2, 3; 4, 5, 6; 7, 8, 9}.
-
-COMPUTE x1=x.
-CALL SETDIAG(x1, 10).
-PRINT x1.
-
-COMPUTE x2=x.
-CALL SETDIAG(x2, {10, 11}).
-PRINT x2.
-
-COMPUTE x3=x.
-CALL SETDIAG(x3, {10, 11, 12}).
-PRINT x3.
-
-COMPUTE x4=x.
-CALL SETDIAG(x4, {10, 11, 12, 13}).
-PRINT x4.
-
-COMPUTE x5=x.
-CALL SETDIAG(x5, {10, 11; 12, 13}).
-PRINT x5.
-
-END MATRIX.
-])
-AT_CHECK([pspp matrix.sps], [1], [dnl
-x1
-  10   2   3
-   4  10   6
-   7   8  10
-
-x2
-  10   2   3
-   4  11   6
-   7   8   9
-
-x3
-  10   2   3
-   4  11   6
-   7   8  12
-
-x4
-  10   2   3
-   4  11   6
-   7   8  12
-
-matrix.sps:21.18-21.33: error: MATRIX: SETDIAG argument 2 must be a scalar or a
-vector, not a 2×2 matrix.
-   21 | CALL SETDIAG(x5, {10, 11; 12, 13}).
-      |                  ^~~~~~~~~~~~~~~~
-
-x5
-  1  2  3
-  4  5  6
-  7  8  9
-])
-AT_CLEANUP
-
-dnl I have some doubts about the correctness of the results below.
-AT_SETUP([MATRIX - CALL EIGEN])
-AT_DATA([matrix.sps], [dnl
-MATRIX.
-CALL EIGEN({1, 0; 0, 1}, evec, eval).
-PRINT evec.
-PRINT eval.
-
-CALL EIGEN({3, 2, 4; 2, 0, 2; 4, 2, 3}, evec2, eval2).
-PRINT evec2.
-PRINT eval2.
-END MATRIX.
-])
-AT_CHECK([pspp matrix.sps], [0], [dnl
-evec
-  1  0
-  0  1
-
-eval
-  1
-  1
-
-evec2
-  -.6666666667   .0000000000   .7453559925
-  -.3333333333  -.8944271910  -.2981423970
-  -.6666666667   .4472135955  -.5962847940
-
-eval2
-  8.0000000000
- -1.0000000000
- -1.0000000000
-])
-AT_CLEANUP
-
-AT_SETUP([MATRIX - CALL SVD])
-AT_DATA([matrix.sps], [dnl
-MATRIX.
-CALL SVD({3, 2, 2; 2, 3, -2}, u, s, v).
-PRINT (u * s * T(v))/FORMAT F5.1.
-
-CALL SVD({2, 4; 1, 3; 0, 0; 0, 0}, u, s, v).
-PRINT (u*s*T(v))/FORMAT F5.1.
-
-CALL SVD({-3, 1; 6, -2; 6, -2}, u, s, v).
-PRINT (u*s*T(v))/FORMAT F5.1.
-END MATRIX.
-])
-AT_CHECK([pspp matrix.sps], [0], [dnl
-(u * s * T(v))
-   3.0   2.0   2.0
-   2.0   3.0  -2.0
-
-(u*s*T(v))
-   2.0   4.0
-   1.0   3.0
-    .0    .0
-    .0    .0
-
-(u*s*T(v))
-  -3.0   1.0
-   6.0  -2.0
-   6.0  -2.0
-])
-AT_CLEANUP
-
-AT_SETUP([MATRIX - PRINT])
-AT_DATA([matrix.sps], [dnl
-MATRIX.
-PRINT/TITLE="title 1".
-PRINT/SPACE=2/TITLE="title 2".
-
-COMPUTE m={1, 2, 3; 3, 4, 5; 6, 7, 8}.
-PRINT m/RLABELS=123, a b c, long name.
-PRINT m/RNAMES={'123', 'a b c', 'long name'}.
-PRINT m/CLABELS=col1, col2, long column name.
-PRINT m/CNAMES={'col1', 'col2', 'long column name'}.
-PRINT m/RLABELS=123, a b c, long name
-       /CLABELS=col1, col2, long column name.
-PRINT m/RNAMES={'123', 'a b c', 'long name'}
-       /CNAMES={'col1', 'col2', 'long column name'}.
-PRINT {123e10, 456e10, 500}.
-END MATRIX.
-])
-
-AT_DATA([matrix-tables.sps], [dnl
-SET MDISPLAY=TABLES.
-INCLUDE 'matrix.sps'.
-])
-
-AT_CHECK([pspp matrix.sps], [0], [dnl
-title 1
-
-
-
-title 2
-
-m
-123       1  2  3
-a b c     3  4  5
-long nam  6  7  8
-
-m
-123       1  2  3
-a b c     3  4  5
-long nam  6  7  8
-
-m
-     col1     col2 long col
-        1        2        3
-        3        4        5
-        6        7        8
-
-m
-     col1     col2 long col
-        1        2        3
-        3        4        5
-        6        7        8
-
-m
-             col1     col2 long col
-123             1        2        3
-a b c           3        4        5
-long nam        6        7        8
-
-m
-             col1     col2 long col
-123             1        2        3
-a b c           3        4        5
-long nam        6        7        8
-
-{123e10, 456e10, 500}
-  10 ** 12   X
-  1.2300000000  4.5600000000   .0000000005
-])
-
-AT_CHECK([pspp matrix-tables.sps], [0], [dnl
-title 1
-
-
-
-title 2
-
-        m
-+---------+-----+
-|123      |1 2 3|
-|a b c    |3 4 5|
-|long name|6 7 8|
-+---------+-----+
-
-        m
-+--------+-----+
-|123     |1 2 3|
-|a b c   |3 4 5|
-|long nam|6 7 8|
-+--------+-----+
-
-              m
-+----+----+----------------+
-|col1|col2|long column name|
-+----+----+----------------+
-|   1|   2|               3|
-|   3|   4|               5|
-|   6|   7|               8|
-+----+----+----------------+
-
-          m
-+----+----+--------+
-|col1|col2|long col|
-+----+----+--------+
-|   1|   2|       3|
-|   3|   4|       5|
-|   6|   7|       8|
-+----+----+--------+
-
-                   m
-+---------+----+----+----------------+
-|         |col1|col2|long column name|
-+---------+----+----+----------------+
-|123      |   1|   2|               3|
-|a b c    |   3|   4|               5|
-|long name|   6|   7|               8|
-+---------+----+----+----------------+
-
-              m
-+--------+----+----+--------+
-|        |col1|col2|long col|
-+--------+----+----+--------+
-|123     |   1|   2|       3|
-|a b c   |   3|   4|       5|
-|long nam|   6|   7|       8|
-+--------+----+----+--------+
-
-              {123e10, 456e10, 500}
-+----------------------------------------------+
-|1.2300000000[[a]] 4.5600000000[[a]] .0000000005[[a]]|
-+----------------------------------------------+
-a. × 10**12
-])
-AT_CLEANUP
-
-AT_SETUP([MATRIX - DO IF])
-AT_DATA([matrix.sps], [dnl
-MATRIX.
-DO IF 1.
-PRINT/TITLE '1'.
-END IF.
-
-DO IF 0.
-PRINT/TITLE '2'.
-ELSE IF 1.
-PRINT/TITLE '3'.
-END IF.
-
-DO IF -1.
-PRINT/TITLE '4'.
-ELSE IF 0.
-PRINT/TITLE '5'.
-ELSE.
-PRINT/TITLE '6'.
-END IF.
-
-DO IF {1, 2}.
-END IF.
-
-DO IF 0.
-ELSE IF {}.
-END IF.
-END MATRIX.
-])
-AT_CHECK([pspp matrix.sps], [1], [dnl
-1
-
-3
-
-6
-
-matrix.sps:20.7-20.12: error: MATRIX: Expression for DO IF must evaluate to
-scalar, not a 1×2 matrix.
-   20 | DO IF {1, 2}.
-      |       ^~~~~~
-
-matrix.sps:24.9-24.10: error: MATRIX: Expression for ELSE IF must evaluate to
-scalar, not a 0×0 matrix.
-   24 | ELSE IF {}.
-      |         ^~
-])
-AT_CLEANUP
-
-AT_SETUP([MATRIX - unbounded LOOP])
-AT_DATA([matrix.sps], [dnl
-MATRIX.
-* Truly unbounded loop.
-COMPUTE x=0.
-COMPUTE y={}.
-LOOP.
-COMPUTE x=x+1.
-COMPUTE y={y, x}.
-END LOOP.
-PRINT x.
-PRINT y.
-
-* Unbounded loop terminates with BREAK.
-COMPUTE x=0.
-COMPUTE y={}.
-LOOP.
-COMPUTE x=x+1.
-COMPUTE y={y, x}.
-DO IF x >= 20.
-    BREAK.
-END IF.
-END LOOP.
-PRINT x.
-PRINT y.
-
-END MATRIX.
-])
-AT_CHECK([pspp matrix.sps], [0], [dnl
-x
-  40
-
-y
-   1   2   3   4   5   6   7   8   9  10  11  12  13  14  15  16  17  18  19
-20  21  22  23  24  25  26  27  28  29  30  31  32  33  34  35  36  37  38  39
-40
-
-x
-  20
-
-y
-   1   2   3   4   5   6   7   8   9  10  11  12  13  14  15  16  17  18  19
-20
-])
-AT_CLEANUP
-
-AT_SETUP([MATRIX - indexed or conditional LOOP])
-AT_DATA([matrix.sps], [dnl
-MATRIX.
-* Indexed loop terminates based on index.
-COMPUTE y={}.
-LOOP x=1 TO 20.
-COMPUTE y={y, x}.
-END LOOP.
-PRINT x.
-PRINT y.
-
-* Indexed loop terminates based on MXLOOPS.
-COMPUTE y={}.
-LOOP x=1 TO 50.
-COMPUTE y={y, x}.
-END LOOP.
-PRINT x.
-PRINT y.
-
-* Indexed loop terminates with BREAK.
-COMPUTE y={}.
-LOOP x=1 TO 50.
-COMPUTE y={y, x}.
-DO IF x >= 20.
-    BREAK.
-END IF.
-END LOOP.
-PRINT x.
-PRINT y.
-
-* Indexed loop terminates with top IF.
-COMPUTE y={}.
-LOOP x=1 TO 50 IF NCOL(y) < 15.
-COMPUTE y={y, x}.
-END LOOP.
-PRINT x.
-PRINT y.
-
-* Indexed loop terminates with bottom IF.
-COMPUTE y={}.
-LOOP x=1 TO 50.
-COMPUTE y={y, x}.
-END LOOP IF NCOL(y) >= 22.
-PRINT x.
-PRINT y.
-
-* Index behavior.
-COMPUTE indexing={
-    1, 10, 1;
-    1, 10, 2;
-    1, 10, 3;
-    1, 10, -1;
-    1, 10, 0;
-    10, 1, -1;
-    10, 1, -2;
-    10, 1, -3;
-    10, 1, 1;
-    10, 1, 0
-}.
-LOOP i=1 TO NROW(indexing).
-    COMPUTE y={}.
-    LOOP j=indexing(i, 1) TO indexing(i, 2) BY indexing(i, 3).
-        COMPUTE y={y, j}.
-    END LOOP.
-    PRINT {indexing(i, :), y}.
-END LOOP.
-
-LOOP i={} TO 5.
-END LOOP.
-
-LOOP i=5 TO {}.
-END LOOP.
-
-LOOP i=5 TO 8 BY {}.
-END LOOP.
-
-LOOP IF {}.
-END LOOP.
-
-LOOP.
-END LOOP IF {}.
-
-LOOP i=1e100 to 1e200.
-END LOOP.
-END MATRIX.
-])
-AT_CHECK([pspp matrix.sps], [1], [dnl
-x
-  20
-
-y
-   1   2   3   4   5   6   7   8   9  10  11  12  13  14  15  16  17  18  19
-20
-
-x
-  40
-
-y
-   1   2   3   4   5   6   7   8   9  10  11  12  13  14  15  16  17  18  19
-20  21  22  23  24  25  26  27  28  29  30  31  32  33  34  35  36  37  38  39
-40
-
-x
-  20
-
-y
-   1   2   3   4   5   6   7   8   9  10  11  12  13  14  15  16  17  18  19
-20
-
-x
-  16
-
-y
-   1   2   3   4   5   6   7   8   9  10  11  12  13  14  15
-
-x
-  22
-
-y
-   1   2   3   4   5   6   7   8   9  10  11  12  13  14  15  16  17  18  19
-20  21  22
-
-{indexing(i, :), y}
-   1  10   1   1   2   3   4   5   6   7   8   9  10
-{indexing(i, :), y}
-   1  10   2   1   3   5   7   9
-{indexing(i, :), y}
-   1  10   3   1   4   7  10
-{indexing(i, :), y}
-   1  10  -1
-{indexing(i, :), y}
-   1  10   0
-{indexing(i, :), y}
-  10   1  -1  10   9   8   7   6   5   4   3   2   1
-{indexing(i, :), y}
-  10   1  -2  10   8   6   4   2
-{indexing(i, :), y}
-  10   1  -3  10   7   4   1
-{indexing(i, :), y}
-  10   1   1
-{indexing(i, :), y}
-  10   1   0
-
-matrix.sps:66.8-66.9: error: MATRIX: Expression for LOOP must evaluate to
-scalar, not a 0×0 matrix.
-   66 | LOOP i={} TO 5.
-      |        ^~
-
-matrix.sps:69.13-69.14: error: MATRIX: Expression for TO must evaluate to
-scalar, not a 0×0 matrix.
-   69 | LOOP i=5 TO {}.
-      |             ^~
-
-matrix.sps:72.18-72.19: error: MATRIX: Expression for BY must evaluate to
-scalar, not a 0×0 matrix.
-   72 | LOOP i=5 TO 8 BY {}.
-      |                  ^~
-
-matrix.sps:75.9-75.10: error: MATRIX: Expression for LOOP IF must evaluate to
-scalar, not a 0×0 matrix.
-   75 | LOOP IF {}.
-      |         ^~
-
-matrix.sps:79.13-79.14: error: MATRIX: Expression for END LOOP IF must evaluate
-to scalar, not a 0×0 matrix.
-   79 | END LOOP IF {}.
-      |             ^~
-
-matrix.sps:81.8-81.12: error: MATRIX: Expression for LOOP is outside the
-integer range.
-   81 | LOOP i=1e100 to 1e200.
-      |        ^~~~~
-])
-AT_CLEANUP
-
-AT_SETUP([MATRIX - BREAK outside LOOP])
-AT_DATA([matrix.sps], [dnl
-MATRIX.
-BREAK.
-END MATRIX.
-])
-AT_CHECK([pspp matrix.sps], [1], [dnl
-matrix.sps:2.1-2.5: error: BREAK: BREAK not inside LOOP.
-    2 | BREAK.
-      | ^~~~~
-])
-AT_CLEANUP
-
-AT_SETUP([MATRIX - READ])
-AT_DATA([matrix.txt], [dnl
-9
-8
-7
-6
-1 2 3
-4 5 6
-7 8 9
-10 11 12,13
-14, 15 ,16 , 17
-18
-19
-20 21 22 23
-    12        34
-5    6
-    78        89
-10   11
-$1 $2 3
-4 $5 6
-$1   $2   $3   4
-   $5$6      $78
-1% 2% 3% 4
-  56%  7%8
-abcdefghijkl
-ABCDEFGHIJKL
-])
-AT_DATA([matrix2.txt], [dnl
-2, 3, 5, 7
-11, 13, 17, 19
-23, 29, 31, 37
-41, 43, 47, 53
-])
-AT_DATA([matrix3.txt], [dnl
-1 5
-3 1 2 3
-5 6 -1 2 5 1
-2 8 9
-3 1 3 2
-])
-AT_DATA([matrix.sps], [dnl
-MATRIX.
-READ x/FILE='matrix.txt'/SIZE=4/FIELD=1 TO 1.
-PRINT x.
-READ x/FILE='matrix.txt'/SIZE={3,3}/FIELD=1 TO 80.
-PRINT x.
-READ x/SIZE={2,4}/FIELD=1 TO 80.
-PRINT x.
-READ x(:,2)/FILE='matrix.txt'/FIELD=1 TO 80.
-PRINT x.
-READ x(1,:)/SIZE={1,4}/FIELD=1 TO 80.
-PRINT x.
-
-READ x/SIZE={2,6}/FIELD=1 TO 20 BY 5.
-PRINT x.
-READ x/SIZE={2,3}/FIELD=1 TO 20/FORMAT=DOLLAR.
-PRINT x.
-READ x/SIZE={2,4}/FIELD=1 TO 20/FORMAT=DOLLAR5.1.
-PRINT x.
-READ x/SIZE={2,4}/FIELD=1 TO 12/FORMAT='4PCT'.
-PRINT x.
-READ x/SIZE={2,4}/FIELD=1 TO 12/FORMAT='4A'.
-PRINT x/FORMAT=A3.
-
-COMPUTE y={}.
-LOOP IF NOT EOF('matrix2.txt').
-READ x/FILE='matrix2.txt'/SIZE={1,4}/FIELD=1 TO 80.
-COMPUTE y={y; x}.
-END LOOP.
-PRINT y.
-
-COMPUTE m = MAKE(5, 5, 0).
-LOOP i = 1 TO 5.
-READ count /FILE='matrix3.txt' /FIELD=1 TO 1 /SIZE=1.
-READ m(i, 1:count) /FIELD=3 TO 100 /REREAD.
-END LOOP.
-PRINT m.
-END MATRIX.
-])
-AT_CHECK([pspp matrix.sps], [0], [dnl
-x
-  9
-  8
-  7
-  6
-
-x
-  1  2  3
-  4  5  6
-  7  8  9
-
-x
-  10  11  12  13
-  14  15  16  17
-
-x
-  10  18  12  13
-  14  19  16  17
-
-x
-  20  21  22  23
-  14  19  16  17
-
-x
-   1   2   3   4   5   6
-   7   8   8   9  10  11
-
-x
-  1  2  3
-  4  5  6
-
-x
-  1  2  3  4
-  5  6  7  8
-
-x
-  1  2  3  4
-  5  6  7  8
-
-x
- abc def ghi jkl
- ABC DEF GHI JKL
-
-y
-   2   3   5   7
-  11  13  17  19
-  23  29  31  37
-  41  43  47  53
-
-m
-  5  0  0  0  0
-  1  2  3  0  0
-  6 -1  2  5  1
-  8  9  0  0  0
-  1  3  2  0  0
-])
-AT_CLEANUP
-
-AT_SETUP([MATRIX - READ - negative])
-AT_DATA([matrix.sps], [dnl
-MATRIX.
-READ !.
-READ x/FILE=!.
-READ x/ENCODING=!.
-READ x/FIELD=!.
-READ x/FIELD=1 !.
-READ x/FIELD=1 TO !.
-READ x/FIELD=1 TO 0.
-READ x/FIELD=1 TO 10 BY !.
-READ x/FIELD=1 TO 10 BY 6.
-READ x/SIZE=!.
-READ x/MODE=!.
-READ x/FORMAT=!.
-READ x/FORMAT=F8.2/FORMAT=F8.2.
-READ x/FORMAT='5XYZZY'.
-READ x/FORMAT=XYZZY.
-READ x/!.
-READ x.
-READ x/FIELD=1 TO 10.
-READ x/FIELD=1 TO 10/SIZE={1,2}.
-READ x/FIELD=1 TO 10/SIZE={1,2}/FILE='xyzzy.txt'/FORMAT='15F'.
-READ x/FIELD=1 TO 10 BY 2/SIZE={1,2}/FILE='xyzzy.txt'/FORMAT=F5.
-READ x/FIELD=1 TO 10 BY 2/SIZE={1,2}/FILE='xyzzy.txt'/FORMAT='2F'.
-READ x/FIELD=1 TO 10/SIZE={1,2;3,4}/FILE='matrix.txt'.
-READ x/FIELD=1 TO 10/SIZE={1,2,3}/FILE='matrix.txt'.
-READ x/FIELD=1 TO 10/SIZE={-1}/FILE='matrix.txt'.
-COMPUTE x={1,2,3}.
-READ x(:,:)/FIELD=1 TO 10/SIZE={2,2}/FILE='matrix.txt'.
-READ x/FIELD=1 TO 10/SIZE={1,3}/FILE='matrix.txt'/MODE=SYMMETRIC.
-READ x/FIELD=1 TO 10/SIZE=2/FILE='matrix.txt'.
-END MATRIX.
-])
-AT_DATA([matrix.txt], [dnl
-xyzzy
-.
-])
-AT_CHECK([pspp matrix.sps], [1], [dnl
-matrix.sps:2.6: error: READ: Syntax error expecting identifier.
-    2 | READ !.
-      |      ^
-
-matrix.sps:3.13: error: READ: Syntax error expecting a file name or handle
-name.
-    3 | READ x/FILE=!.
-      |             ^
-
-matrix.sps:4.17: error: READ: Syntax error expecting string.
-    4 | READ x/ENCODING=!.
-      |                 ^
-
-matrix.sps:5.14: error: READ: Syntax error expecting positive integer for
-FIELD.
-    5 | READ x/FIELD=!.
-      |              ^
-
-matrix.sps:6.16: error: READ: Syntax error expecting `TO'.
-    6 | READ x/FIELD=1 !.
-      |                ^
-
-matrix.sps:7.19: error: READ: Syntax error expecting positive integer for TO.
-    7 | READ x/FIELD=1 TO !.
-      |                   ^
-
-matrix.sps:8.19: error: READ: Syntax error expecting positive integer for TO.
-    8 | READ x/FIELD=1 TO 0.
-      |                   ^
-
-matrix.sps:9.25: error: READ: Syntax error expecting integer between 1 and 10
-for BY.
-    9 | READ x/FIELD=1 TO 10 BY !.
-      |                         ^
-
-matrix.sps:10.14-10.25: error: READ: Field width 6 does not evenly divide
-record width 10.
-   10 | READ x/FIELD=1 TO 10 BY 6.
-      |              ^~~~~~~~~~~~
-
-matrix.sps:10.14-10.20: note: READ: This syntax designates the record width.
-   10 | READ x/FIELD=1 TO 10 BY 6.
-      |              ^~~~~~~
-
-matrix.sps:10.25: note: READ: This syntax specifies the field width.
-   10 | READ x/FIELD=1 TO 10 BY 6.
-      |                         ^
-
-matrix.sps:11.13: error: READ: Syntax error expecting matrix expression.
-   11 | READ x/SIZE=!.
-      |             ^
-
-matrix.sps:12.13: error: READ: Syntax error expecting RECTANGULAR or SYMMETRIC.
-   12 | READ x/MODE=!.
-      |             ^
-
-matrix.sps:13.15: error: READ: Syntax error expecting identifier.
-   13 | READ x/FORMAT=!.
-      |               ^
-
-matrix.sps:14.20-14.25: error: READ: Subcommand FORMAT may only be specified
-once.
-   14 | READ x/FORMAT=F8.2/FORMAT=F8.2.
-      |                    ^~~~~~
-
-matrix.sps:15.15-15.22: error: READ: Unknown format XYZZY.
-   15 | READ x/FORMAT='5XYZZY'.
-      |               ^~~~~~~~
-
-matrix.sps:16.15-16.19: error: READ: Unknown format type `XYZZY'.
-   16 | READ x/FORMAT=XYZZY.
-      |               ^~~~~
-
-matrix.sps:17.8: error: READ: Syntax error expecting FILE, FIELD, MODE, REREAD,
-or FORMAT.
-   17 | READ x/!.
-      |        ^
-
-matrix.sps:18.1-18.7: error: READ: Required subcommand FIELD was not specified.
-   18 | READ x.
-      | ^~~~~~~
-
-matrix.sps:19: error: READ: SIZE is required for reading data into a full
-matrix (as opposed to a submatrix).
-
-matrix.sps:19.6: note: READ: This expression designates a full matrix.
-   19 | READ x/FIELD=1 TO 10.
-      |      ^
-
-matrix.sps:20.1-20.32: error: READ: Required subcommand FILE was not specified.
-   20 | READ x/FIELD=1 TO 10/SIZE={1,2}.
-      | ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
-
-matrix.sps:21: error: READ: 15 repetitions cannot fit in record width 10.
-
-matrix.sps:21.57-21.61: note: READ: This syntax designates the number of
-repetitions.
-   21 | READ x/FIELD=1 TO 10/SIZE={1,2}/FILE='xyzzy.txt'/FORMAT='15F'.
-      |                                                         ^~~~~
-
-matrix.sps:21.14-21.20: note: READ: This syntax designates the record width.
-   21 | READ x/FIELD=1 TO 10/SIZE={1,2}/FILE='xyzzy.txt'/FORMAT='15F'.
-      |              ^~~~~~~
-
-matrix.sps:22: error: READ: This command specifies two different field widths.
-
-matrix.sps:22.62-22.63: note: READ: This syntax specifies field width 5.
-   22 | READ x/FIELD=1 TO 10 BY 2/SIZE={1,2}/FILE='xyzzy.txt'/FORMAT=F5.
-      |                                                              ^~
-
-matrix.sps:22.25: note: READ: This syntax specifies field width 2.
-   22 | READ x/FIELD=1 TO 10 BY 2/SIZE={1,2}/FILE='xyzzy.txt'/FORMAT=F5.
-      |                         ^
-
-matrix.sps:23: error: READ: This command specifies two different field widths.
-
-matrix.sps:23.62-23.65: note: READ: This syntax specifies 2 repetitions.
-   23 | READ x/FIELD=1 TO 10 BY 2/SIZE={1,2}/FILE='xyzzy.txt'/FORMAT='2F'.
-      |                                                              ^~~~
-
-matrix.sps:23.14-23.20: note: READ: This syntax designates record width 10,
-which divided by 2 repetitions implies field width 5.
-   23 | READ x/FIELD=1 TO 10 BY 2/SIZE={1,2}/FILE='xyzzy.txt'/FORMAT='2F'.
-      |              ^~~~~~~
-
-matrix.sps:23.25: note: READ: This syntax specifies field width 2.
-   23 | READ x/FIELD=1 TO 10 BY 2/SIZE={1,2}/FILE='xyzzy.txt'/FORMAT='2F'.
-      |                         ^
-
-matrix.sps:24.27-24.35: error: MATRIX: SIZE must evaluate to a scalar or a 2-
-element vector, not a 2×2 matrix.
-   24 | READ x/FIELD=1 TO 10/SIZE={1,2;3,4}/FILE='matrix.txt'.
-      |                           ^~~~~~~~~
-
-matrix.sps:25.27-25.33: error: MATRIX: SIZE must evaluate to a scalar or a 2-
-element vector, not a 1×3 matrix.
-   25 | READ x/FIELD=1 TO 10/SIZE={1,2,3}/FILE='matrix.txt'.
-      |                           ^~~~~~~
-
-matrix.sps:26.28-26.29: error: MATRIX: Matrix dimensions -1×1 specified on SIZE
-are outside valid range.
-   26 | READ x/FIELD=1 TO 10/SIZE={-1}/FILE='matrix.txt'.
-      |                            ^~
-
-matrix.sps:28: error: MATRIX: Dimensions specified on SIZE differ from
-dimensions of destination submatrix.
-
-matrix.sps:28.32-28.36: note: MATRIX: SIZE specifies dimensions 2×2.
-   28 | READ x(:,:)/FIELD=1 TO 10/SIZE={2,2}/FILE='matrix.txt'.
-      |                                ^~~~~
-
-matrix.sps:28.6-28.11: note: MATRIX: Destination submatrix has dimensions 1×3.
-   28 | READ x(:,:)/FIELD=1 TO 10/SIZE={2,2}/FILE='matrix.txt'.
-      |      ^~~~~~
-
-matrix.sps:29: error: MATRIX: Cannot read non-square 1×3 matrix using READ with
-MODE=SYMMETRIC.
-
-matrix.txt:1.1-1.5: warning: Error reading "xyzzy" as format F for matrix row
-1, column 1: Field contents are not numeric.
-
-matrix.txt:2.1: warning: Error reading "." as format F for matrix row 2, column
-1: Matrix data may not contain missing value.
-])
-AT_CLEANUP
-
-AT_SETUP([MATRIX - WRITE])
-AT_DATA([matrix.sps], [dnl
-MATRIX.
-WRITE {1.5, 2; 3, 4.12345}/OUTFILE='matrix.txt'/FIELD=1 TO 80.
-WRITE {1.5, 2; 3, 4.12345}/OUTFILE='matrix.txt'/FIELD=1 TO 5.
-WRITE {1, 2; 3, 4}/OUTFILE='matrix.txt'/FIELD=1 TO 80 BY 5.
-WRITE {1, 2; 3, 4}/OUTFILE='matrix.txt'/FIELD=1 TO 80/FORMAT=F8.2.
-WRITE {1, 2; 3, 4}/OUTFILE='matrix.txt'/FIELD=1 TO 80/FORMAT=E.
-WRITE {1, 2; 3, 4}/OUTFILE='matrix.txt'/FIELD=1 TO 10 BY 10/FORMAT=E.
-WRITE "abcdefhi"/OUTFILE='matrix.txt'/FIELD=1 TO 80/FORMAT=A8.
-WRITE "abcdefhi"/OUTFILE='matrix.txt'/FIELD=1 TO 80/FORMAT=A4.
-WRITE "abcdefhi"/OUTFILE='matrix.txt'/FIELD=1 TO 80/FORMAT=AHEX12.
-END MATRIX.
-])
-AT_CHECK([pspp matrix.sps])
-AT_CHECK([cat matrix.txt], [0], [dnl
- 1.5 2
- 3 4.12345
- 1.5 2
- 3
- 4.12345
-     1    2
-     3    4
-     1.00    2.00
-     3.00    4.00
- 1 2
- 3 4
-    1.E+000
-    2.E+000
-    3.E+000
-    4.E+000
- abcdefhi
- abcd
- 616263646566
-])
-AT_CLEANUP
-
-AT_SETUP([MATRIX - WRITE - negative])
-AT_DATA([matrix.sps], [dnl
-MATRIX.
-WRITE !.
-WRITE 1/OUTFILE=!.
-WRITE 1/ENCODING=!.
-WRITE 1/FIELD=!.
-WRITE 1/FIELD=1 !.
-WRITE 1/FIELD=1 TO 0.
-WRITE 1/FIELD=1 TO 10 BY 20.
-WRITE 1/FIELD=1 TO 10 BY 6.
-WRITE 1/MODE=TRAPEZOIDAL.
-WRITE 1/FORMAT=F5/FORMAT=F5.
-WRITE 1/FORMAT='5ASDF'.
-WRITE 1/FORMAT=ASDF5.
-WRITE 1/!.
-WRITE 1.
-WRITE 1/FIELD=1 TO 10.
-WRITE 1/FIELD=1 TO 10/OUTFILE='matrix.txt'/FORMAT='15F'.
-WRITE 1/FIELD=1 TO 10 BY 5/OUTFILE='matrix.txt'/FORMAT='5F'.
-WRITE 1/FIELD=1 TO 10 BY 5/OUTFILE='matrix.txt'/FORMAT=E.
-WRITE 1/FIELD=1 TO 10/OUTFILE='matrix.txt'/FORMAT=A9.
-WRITE {1,2}/FIELD=1 TO 10/OUTFILE='matrix.txt'/MODE=TRIANGULAR.
-END MATRIX.
-])
-AT_CHECK([pspp matrix.sps], [1], [dnl
-matrix.sps:2.7: error: WRITE: Syntax error expecting matrix expression.
-    2 | WRITE !.
-      |       ^
-
-matrix.sps:3.17: error: WRITE: Syntax error expecting a file name or handle
-name.
-    3 | WRITE 1/OUTFILE=!.
-      |                 ^
-
-matrix.sps:4.18: error: WRITE: Syntax error expecting string.
-    4 | WRITE 1/ENCODING=!.
-      |                  ^
-
-matrix.sps:5.15: error: WRITE: Syntax error expecting positive integer for
-FIELD.
-    5 | WRITE 1/FIELD=!.
-      |               ^
-
-matrix.sps:6.17: error: WRITE: Syntax error expecting `TO'.
-    6 | WRITE 1/FIELD=1 !.
-      |                 ^
-
-matrix.sps:7.20: error: WRITE: Syntax error expecting positive integer for TO.
-    7 | WRITE 1/FIELD=1 TO 0.
-      |                    ^
-
-matrix.sps:8.26-8.27: error: WRITE: Syntax error expecting integer between 1
-and 10 for BY.
-    8 | WRITE 1/FIELD=1 TO 10 BY 20.
-      |                          ^~
-
-matrix.sps:9.15-9.26: error: WRITE: Field width 6 does not evenly divide record
-width 10.
-    9 | WRITE 1/FIELD=1 TO 10 BY 6.
-      |               ^~~~~~~~~~~~
-
-matrix.sps:9.15-9.21: note: WRITE: This syntax designates the record width.
-    9 | WRITE 1/FIELD=1 TO 10 BY 6.
-      |               ^~~~~~~
-
-matrix.sps:9.26: note: WRITE: This syntax specifies the field width.
-    9 | WRITE 1/FIELD=1 TO 10 BY 6.
-      |                          ^
-
-matrix.sps:10.14-10.24: error: WRITE: Syntax error expecting RECTANGULAR or
-TRIANGULAR.
-   10 | WRITE 1/MODE=TRAPEZOIDAL.
-      |              ^~~~~~~~~~~
-
-matrix.sps:11.19-11.24: error: WRITE: Subcommand FORMAT may only be specified
-once.
-   11 | WRITE 1/FORMAT=F5/FORMAT=F5.
-      |                   ^~~~~~
-
-matrix.sps:12.16-12.22: error: WRITE: Unknown format ASDF.
-   12 | WRITE 1/FORMAT='5ASDF'.
-      |                ^~~~~~~
-
-matrix.sps:13.16-13.20: error: WRITE: Unknown format type `ASDF'.
-   13 | WRITE 1/FORMAT=ASDF5.
-      |                ^~~~~
-
-matrix.sps:14.9: error: WRITE: Syntax error expecting OUTFILE, FIELD, MODE,
-HOLD, or FORMAT.
-   14 | WRITE 1/!.
-      |         ^
-
-matrix.sps:15.1-15.8: error: WRITE: Required subcommand FIELD was not
-specified.
-   15 | WRITE 1.
-      | ^~~~~~~~
-
-matrix.sps:16.1-16.22: error: WRITE: Required subcommand OUTFILE was not
-specified.
-   16 | WRITE 1/FIELD=1 TO 10.
-      | ^~~~~~~~~~~~~~~~~~~~~~
-
-matrix.sps:17.51-17.55: note: WRITE: This syntax designates the number of
-repetitions.
-   17 | WRITE 1/FIELD=1 TO 10/OUTFILE='matrix.txt'/FORMAT='15F'.
-      |                                                   ^~~~~
-
-matrix.sps:17.15-17.21: note: WRITE: This syntax designates the record width.
-   17 | WRITE 1/FIELD=1 TO 10/OUTFILE='matrix.txt'/FORMAT='15F'.
-      |               ^~~~~~~
-
-matrix.sps:18: error: WRITE: This command specifies two different field widths.
-
-matrix.sps:18.56-18.59: note: WRITE: This syntax specifies 5 repetitions.
-   18 | WRITE 1/FIELD=1 TO 10 BY 5/OUTFILE='matrix.txt'/FORMAT='5F'.
-      |                                                        ^~~~
-
-matrix.sps:18.15-18.21: note: WRITE: This syntax designates record width 10,
-which divided by 5 repetitions implies field width 2.
-   18 | WRITE 1/FIELD=1 TO 10 BY 5/OUTFILE='matrix.txt'/FORMAT='5F'.
-      |               ^~~~~~~
-
-matrix.sps:18.26: note: WRITE: This syntax specifies field width 5.
-   18 | WRITE 1/FIELD=1 TO 10 BY 5/OUTFILE='matrix.txt'/FORMAT='5F'.
-      |                          ^
-
-matrix.sps:19: error: WRITE: Output format E5.0 specifies width 5, but E
-requires a width between 6 and 40.
-
-matrix.sps:19.56: note: WRITE: This syntax specifies format E.
-   19 | WRITE 1/FIELD=1 TO 10 BY 5/OUTFILE='matrix.txt'/FORMAT=E.
-      |                                                        ^
-
-matrix.sps:19.26: note: WRITE: This syntax specifies field width 5.
-   19 | WRITE 1/FIELD=1 TO 10 BY 5/OUTFILE='matrix.txt'/FORMAT=E.
-      |                          ^
-
-matrix.sps:20.51-20.52: error: WRITE: Format A9 is too wide for 8-byte matrix
-elements.
-   20 | WRITE 1/FIELD=1 TO 10/OUTFILE='matrix.txt'/FORMAT=A9.
-      |                                                   ^~
-
-matrix.sps:21.7-21.11: error: MATRIX: WRITE with MODE=TRIANGULAR requires a
-square matrix but the matrix to be written has dimensions 1×2.
-   21 | WRITE {1,2}/FIELD=1 TO 10/OUTFILE='matrix.txt'/MODE=TRIANGULAR.
-      |       ^~~~~
-])
-AT_CLEANUP
-
-AT_SETUP([MATRIX - GET])
-AT_DATA([matrix.sps], [dnl
-DATA LIST LIST NOTABLE /a b c.
-MISSING VALUES a(1) b(5).
-BEGIN DATA.
-0 0 0
-1 2 3
-4 5 6
-7 8 .
-END DATA.
-
-MATRIX.
-GET x0 /NAMES=names0.
-PRINT x0.
-PRINT names0/FORMAT=A8.
-END MATRIX.
-
-MATRIX.
-GET x1 /VARIABLES=a b c /NAMES=names1 /MISSING=OMIT.
-PRINT x1.
-PRINT names1/FORMAT=A8.
-END MATRIX.
-
-MATRIX.
-GET x2 /VARIABLES=a b /NAMES=names2 /MISSING=OMIT.
-PRINT x2.
-PRINT names2/FORMAT=A8.
-END MATRIX.
-
-MATRIX.
-GET x3 /FILE=* /VARIABLES=a b c /NAMES=names3 /MISSING=5.
-PRINT x3.
-PRINT names3/FORMAT=A8.
-END MATRIX.
-
-MATRIX.
-GET x4 /FILE=* /VARIABLES=a b /NAMES=names4 /MISSING=5.
-PRINT x4.
-PRINT names4/FORMAT=A8.
-END MATRIX.
-
-SAVE OUTFILE='matrix.sav'.
-NEW FILE.
-
-MATRIX.
-GET x5 /FILE='matrix.sav' /VARIABLES=a b c /NAMES=names5 /MISSING=ACCEPT.
-PRINT x5.
-PRINT names5/FORMAT=A8.
-END MATRIX.
-
-MATRIX.
-GET x6 /FILE='matrix.sav' /VARIABLES=a b c /NAMES=names6 /MISSING=ACCEPT /SYSMIS=9.
-PRINT x6.
-PRINT names6/FORMAT=A8.
-END MATRIX.
-
-MATRIX.
-GET x7 /FILE='matrix.sav' /VARIABLES=a b c /NAMES=names7 /MISSING=ACCEPT /SYSMIS=OMIT.
-PRINT x7.
-PRINT names7/FORMAT=A8.
-END MATRIX.
-])
-AT_CHECK([pspp matrix.sps], [1], [dnl
-matrix.sps:11: error: MATRIX: Variable a in case 2 has user-missing value 1.
-
-matrix.sps:12.7-12.8: error: MATRIX: Uninitialized variable x0 used in
-expression.
-   12 | PRINT x0.
-      |       ^~
-
-names0
- a
- b
- c
-
-matrix.sps:17: error: MATRIX: Variable c in case 4 is system-missing.
-
-matrix.sps:18.7-18.8: error: MATRIX: Uninitialized variable x1 used in
-expression.
-   18 | PRINT x1.
-      |       ^~
-
-names1
- a
- b
- c
-
-x2
-  0  0
-  7  8
-
-names2
- a
- b
-
-matrix.sps:29: error: MATRIX: Variable c in case 4 is system-missing.
-
-matrix.sps:30.7-30.8: error: MATRIX: Uninitialized variable x3 used in
-expression.
-   30 | PRINT x3.
-      |       ^~
-
-names3
- a
- b
- c
-
-x4
-  0  0
-  5  2
-  4  5
-  7  8
-
-names4
- a
- b
-
-matrix.sps:44: error: MATRIX: Variable c in case 4 is system-missing.
-
-matrix.sps:45.7-45.8: error: MATRIX: Uninitialized variable x5 used in
-expression.
-   45 | PRINT x5.
-      |       ^~
-
-names5
- a
- b
- c
-
-x6
-  0  0  0
-  1  2  3
-  4  5  6
-  7  8  9
-
-names6
- a
- b
- c
-
-x7
-  0  0  0
-  1  2  3
-  4  5  6
-
-names7
- a
- b
- c
-])
-AT_CLEANUP
-
-AT_SETUP([MATRIX - GET - negative])
-AT_DATA([matrix.sps], [dnl
-DATA LIST LIST NOTABLE /a b c * d(a1).
-MISSING VALUES a(1) b(5).
-BEGIN DATA.
-0 0 0 a
-1 2 3 b
-4 5 6 b
-7 8 . d
-END DATA.
-SAVE OUTFILE='matrix.sav'.
-
-MATRIX.
-GET !.
-GET x/VARIABLES=!.
-GET x/FILE=!.
-GET x/ENCODING=!.
-GET x/NAMES=!.
-GET x/MISSING=!.
-GET x/SYSMIS=!.
-GET x/!.
-GET x/VARIABLES=!.
-GET x/VARIABLES=x TO !.
-GET x/VARIABLES=x.
-GET x/VARIABLES=c TO a.
-GET x/VARIABLES=d.
-GET x.
-END MATRIX.
-
-NEW FILE.
-MATRIX.
-GET x/VARIABLES=a.
-END MATRIX.
-])
-AT_CHECK([pspp matrix.sps], [1], [dnl
-matrix.sps:12.5: error: GET: Syntax error expecting identifier.
-   12 | GET !.
-      |     ^
-
-matrix.sps:13.17: error: GET: Syntax error expecting variable name.
-   13 | GET x/VARIABLES=!.
-      |                 ^
-
-matrix.sps:14.12: error: GET: Syntax error expecting a file name or handle
-name.
-   14 | GET x/FILE=!.
-      |            ^
-
-matrix.sps:15.16: error: GET: Syntax error expecting string.
-   15 | GET x/ENCODING=!.
-      |                ^
-
-matrix.sps:16.13: error: GET: Syntax error expecting identifier.
-   16 | GET x/NAMES=!.
-      |             ^
-
-matrix.sps:17.15: error: GET: Syntax error expecting ACCEPT or OMIT or a number
-for MISSING.
-   17 | GET x/MISSING=!.
-      |               ^
-
-matrix.sps:18.14: error: GET: Syntax error expecting OMIT or a number for
-SYSMIS.
-   18 | GET x/SYSMIS=!.
-      |              ^
-
-matrix.sps:19.7: error: GET: Syntax error expecting FILE, VARIABLES, NAMES,
-MISSING, or SYSMIS.
-   19 | GET x/!.
-      |       ^
-
-matrix.sps:20.17: error: GET: Syntax error expecting variable name.
-   20 | GET x/VARIABLES=!.
-      |                 ^
-
-matrix.sps:21.22: error: GET: Syntax error expecting variable name.
-   21 | GET x/VARIABLES=x TO !.
-      |                      ^
-
-matrix.sps:22.17: error: MATRIX: x is not a variable name.
-   22 | GET x/VARIABLES=x.
-      |                 ^
-
-matrix.sps:23.17-23.22: error: MATRIX: c TO a is not valid syntax since c
-precedes a in the dictionary.
-   23 | GET x/VARIABLES=c TO a.
-      |                 ^~~~~~
-
-matrix.sps:24.17: error: MATRIX: d is not a numeric variable.
-   24 | GET x/VARIABLES=d.
-      |                 ^
-
-matrix.sps:25: error: MATRIX: Variable d is not numeric.
-
-matrix.sps:30: error: MATRIX: The GET command cannot read an empty active file.
-])
-AT_CLEANUP
-
-AT_SETUP([MATRIX - SAVE])
-AT_DATA([matrix.sps], [dnl
-MATRIX.
-SAVE {1,2,3; 4,5,6}/OUTFILE='matrix.sav'.
-SAVE {7,8,9}/VARIABLES=a b c d.
-
-SAVE {1,2,3}/OUTFILE='matrix2.sav'/VARIABLES=v01 TO v03.
-SAVE {4,5,6}/NAMES={'x', 'y', 'z', 'w'}.
-
-SAVE {1,'abcd',3}/OUTFILE='matrix3.sav'/NAMES={'a', 'b', 'c'}/STRINGS=b.
-SAVE {4,'xyzw',6}/STRINGS=a, b.
-END MATRIX.
-])
-AT_CHECK([pspp matrix.sps])
-AT_CHECK([pspp-convert matrix.sav matrix.csv && cat matrix.csv], [0], [dnl
-COL1,COL2,COL3
-1,2,3
-4,5,6
-7,8,9
-])
-AT_CHECK([pspp-convert matrix2.sav matrix2.csv && cat matrix2.csv], [0], [dnl
-v01,v02,v03
-1,2,3
-4,5,6
-])
-AT_CHECK([pspp-convert matrix3.sav matrix3.csv && cat matrix3.csv], [0], [dnl
-a,b,c
-1,abcd,3
-4,xyzw,6
-])
-AT_CLEANUP
-
-AT_SETUP([MATRIX - SAVE - inline])
-AT_DATA([matrix.sps], [dnl
-MATRIX.
-SAVE {1,2,3; 4,5,6}/OUTFILE=*.
-SAVE {7,8,9}/VARIABLES=a b c d.
-END MATRIX.
-LIST.
-
-MATRIX.
-SAVE {1,2,3}/OUTFILE=*/VARIABLES=v01 TO v03.
-SAVE {4,5,6}/NAMES={'x', 'y', 'z', 'w'}.
-END MATRIX.
-LIST.
-
-MATRIX.
-SAVE {1,'abcd',3}/OUTFILE=*/NAMES={'a', 'b', 'c'}/STRINGS=b.
-SAVE {4,'xyzw',6}/STRINGS=a, b.
-END MATRIX.
-LIST.
-])
-AT_CHECK([pspp matrix.sps -O format=csv], [0], [dnl
-Table: Data List
-COL1,COL2,COL3
-1.00,2.00,3.00
-4.00,5.00,6.00
-7.00,8.00,9.00
-
-Table: Data List
-v01,v02,v03
-1.00,2.00,3.00
-4.00,5.00,6.00
-
-Table: Data List
-a,b,c
-1.00,abcd,3.00
-4.00,xyzw,6.00
-])
-AT_CLEANUP
-
-AT_SETUP([MATRIX - SAVE - negative])
-AT_DATA([matrix.sps], [dnl
-MATRIX.
-SAVE !.
-SAVE 1/OUTFILE=!.
-SAVE 1/VARIABLES=!.
-SAVE 1/NAMES=!.
-SAVE 1/!.
-SAVE 1.
-SAVE 1/OUTFILE='matrix.sav'/NAMES={'a'}/VARIABLES=a.
-SAVE 1/OUTFILE='matrix2.sav'.
-SAVE {1,2}/OUTFILE='matrix2.sav'.
-SAVE {1,2}/OUTFILE='matrix3.sav'/NAMES={'a', 'a'}.
-SAVE {1,2}/OUTFILE='matrix4.sav'/STRINGS=a.
-SAVE {1,2}/OUTFILE='matrix5.sav'/STRINGS=a, b.
-END MATRIX.
-])
-AT_CHECK([pspp matrix.sps], [1], [dnl
-matrix.sps:2.6: error: SAVE: Syntax error expecting matrix expression.
-    2 | SAVE !.
-      |      ^
-
-matrix.sps:3.16: error: SAVE: Syntax error expecting a file name or handle
-name.
-    3 | SAVE 1/OUTFILE=!.
-      |                ^
-
-matrix.sps:4.18: error: SAVE: Syntax error expecting variable name.
-    4 | SAVE 1/VARIABLES=!.
-      |                  ^
-
-matrix.sps:5.14: error: SAVE: Syntax error expecting matrix expression.
-    5 | SAVE 1/NAMES=!.
-      |              ^
-
-matrix.sps:6.8: error: SAVE: Syntax error expecting OUTFILE, VARIABLES, NAMES,
-or STRINGS.
-    6 | SAVE 1/!.
-      |        ^
-
-matrix.sps:7.1-7.7: error: SAVE: Required subcommand OUTFILE was not specified.
-    7 | SAVE 1.
-      | ^~~~~~~
-
-matrix.sps:8.35-8.39: warning: SAVE: Ignoring NAMES because VARIABLES was also
-specified.
-    8 | SAVE 1/OUTFILE='matrix.sav'/NAMES={'a'}/VARIABLES=a.
-      |                                   ^~~~~
-
-matrix.sps:10: error: MATRIX: Cannot save 1×2 matrix to `matrix2.sav' because
-the first SAVE to `matrix2.sav' in this matrix program wrote a 1-column matrix.
-
-matrix.sps:9: error: MATRIX: This is the location of the first SAVE to
-`matrix2.sav'.
-
-error: Duplicate variable name a in SAVE statement.
-
-error: The SAVE command STRINGS subcommand specifies an unknown variable a.
-
-error: The SAVE command STRINGS subcommand specifies 2 unknown variables,
-including a.
-])
-AT_CLEANUP
-
-AT_SETUP([MATRIX - MGET])
-AT_DATA([matrix.sps], [dnl
-MATRIX DATA
-    VARIABLES=ROWTYPE_ var01 TO var08.
-BEGIN DATA.
-MEAN  24.3   5.4  69.7  20.1  13.4   2.7  27.9   3.7
-SD     5.7   1.5  23.5   5.8   2.8   4.5   5.4   1.5
-N       92    92    92    92    92    92    92    92
-CORR  1.00
-CORR   .18  1.00
-CORR  -.22  -.17  1.00
-CORR   .36   .31  -.14  1.00
-CORR   .27   .16  -.12   .22  1.00
-CORR   .33   .15  -.17   .24   .21  1.00
-CORR   .50   .29  -.20   .32   .12   .38  1.00
-CORR   .17   .29  -.05   .20   .27   .20   .04  1.00
-END DATA.
-
-MATRIX.
-MGET.
-PRINT MN/FORMAT=F5.1.
-PRINT SD/FORMAT=F5.1.
-PRINT NC/FORMAT=F5.0.
-PRINT CR/FORMAT=F5.2.
-END MATRIX.
-])
-AT_CHECK([pspp matrix.sps -O format=csv], [0], [dnl
-Table: Matrix Variables Created by MGET
-,Dimensions,
-,Rows,Columns
-MN,1,8
-SD,1,8
-NC,1,8
-CR,8,8
-
-MN
-24.3   5.4  69.7  20.1  13.4   2.7  27.9   3.7
-
-SD
-5.7   1.5  23.5   5.8   2.8   4.5   5.4   1.5
-
-NC
-92    92    92    92    92    92    92    92
-
-CR
-1.00   .18  -.22   .36   .27   .33   .50   .17
-.18  1.00  -.17   .31   .16   .15   .29   .29
--.22  -.17  1.00  -.14  -.12  -.17  -.20  -.05
-.36   .31  -.14  1.00   .22   .24   .32   .20
-.27   .16  -.12   .22  1.00   .21   .12   .27
-.33   .15  -.17   .24   .21  1.00   .38   .20
-.50   .29  -.20   .32   .12   .38  1.00   .04
-.17   .29  -.05   .20   .27   .20   .04  1.00
-])
-AT_CLEANUP
-
-AT_SETUP([MATRIX - MGET with split variables])
-AT_DATA([matrix.sps], [dnl
-matrix data
-    variables = s1 s2 rowtype_  var01 var02 var03
-    /split=s1 s2.
-
-begin data
-8 0   mean     21.4  5.0  72.9
-8 0   sd       6.5   1.6  22.8
-8 0   n        106   106  106
-8 0   corr     1
-8 0   corr    .41  1
-8 0   corr    -.16  -.22  1
-8 1   mean     11.4  1.0  52.9
-8 1   sd       9.5   8.6  12.8
-8 1   n        10   11  12
-8 1   corr     1
-8 1   corr    .51  1
-8 1   corr    .36  -.41  1
-end data.
-
-MATRIX.
-MGET.
-PRINT MNS1/FORMAT=F5.1.
-PRINT SDS1/FORMAT=F5.1.
-PRINT NCS1/FORMAT=F5.0.
-PRINT CRS1/FORMAT=F5.2.
-PRINT MNS2/FORMAT=F5.1.
-PRINT SDS2/FORMAT=F5.1.
-PRINT NCS2/FORMAT=F5.0.
-PRINT CRS2/FORMAT=F5.2.
-END MATRIX.
-])
-AT_CHECK([pspp -O format=csv matrix.sps], [0], [dnl
-Table: Matrix Variables Created by MGET
-,Split Values,,Dimensions,
-,s1,s2,Rows,Columns
-MNS1,8,0,1,3
-SDS1,8,0,1,3
-NCS1,8,0,1,3
-CRS1,8,0,3,3
-MNS2,8,1,1,3
-SDS2,8,1,1,3
-NCS2,8,1,1,3
-CRS2,8,1,3,3
-
-MNS1
-21.4   5.0  72.9
-
-SDS1
-6.5   1.6  22.8
-
-NCS1
-106   106   106
-
-CRS1
-1.00   .41  -.16
-.41  1.00  -.22
--.16  -.22  1.00
-
-MNS2
-11.4   1.0  52.9
-
-SDS2
-9.5   8.6  12.8
-
-NCS2
-10    11    12
-
-CRS2
-1.00   .51   .36
-.51  1.00  -.41
-.36  -.41  1.00
-])
-AT_CLEANUP
-
-AT_SETUP([MATRIX - MGET with factor variables])
-AT_DATA([matrix.sps], [dnl
-MATRIX DATA
-    VARIABLES=ROWTYPE_ f1 var01 TO var04
-    /FACTOR=f1.
-BEGIN DATA.
-MEAN 0 34 35 36 37
-SD   0 22 11 55 66
-N    0 99 98 99 92
-MEAN 1 44 45 34 39
-SD   1 23 15 51 46
-N    1 98 34 87 23
-CORR .  1
-CORR . .9  1
-CORR . .8 .6  1
-CORR . .7 .5 .4  1
-END DATA.
-FORMATS var01 TO var04(F5.1).
-SAVE OUTFILE='matrix.sav'.
-])
-AT_DATA([matrix2.sps], [dnl
-MATRIX.
-MGET FILE='matrix.sav'.
-PRINT MNF1/FORMAT=F2.0.
-PRINT SDF1/FORMAT=F2.0.
-PRINT NCF1/FORMAT=F2.0.
-PRINT MNF2/FORMAT=F2.0.
-PRINT SDF2/FORMAT=F2.0.
-PRINT NCF2/FORMAT=F2.0.
-PRINT CR/FORMAT=F3.1.
-END MATRIX.
-])
-AT_CHECK([pspp matrix.sps])
-AT_CHECK([pspp -O format=csv matrix2.sps], [0], [dnl
-Table: Matrix Variables Created by MGET
-,Factors,Dimensions,
-,f1,Rows,Columns
-MNF1,0,1,4
-SDF1,0,1,4
-NCF1,0,1,4
-MNF2,1,1,4
-SDF2,1,1,4
-NCF2,1,1,4
-CR,.,4,4
-
-MNF1
-34 35 36 37
-
-SDF1
-22 11 55 66
-
-NCF1
-99 98 99 92
-
-MNF2
-44 45 34 39
-
-SDF2
-23 15 51 46
-
-NCF2
-98 34 87 23
-
-CR
-1.0  .9  .8  .7
-.9 1.0  .6  .5
-.8  .6 1.0  .4
-.7  .5  .4 1.0
-])
-AT_CLEANUP
-
-AT_SETUP([MATRIX - MGET with factor and split variables])
-AT_DATA([matrix.sps], [dnl
-matrix data
-    variables = s f rowtype_  var01 var02 var03
-    /split=s
-    /factor=f.
-
-begin data
-8 0   mean     21.4  5.0  72.9
-8 0   sd       6.5   1.6  22.8
-8 0   n        106   106  106
-8 .   corr     1
-8 .   corr    .41  1
-8 .   corr    -.16  -.22  1
-9 1   mean     11.4  1.0  52.9
-9 1   sd       9.5   8.6  12.8
-9 1   n        10   11  12
-9 .   corr     1
-9 .   corr    .51  1
-9 .   corr    .36  -.41  1
-end data.
-
-MATRIX.
-MGET.
-PRINT MNF1S1/FORMAT=F5.1.
-PRINT SDF1S1/FORMAT=F5.1.
-PRINT NCF1S1/FORMAT=F5.0.
-PRINT CRS1/FORMAT=F5.2.
-PRINT MNF1S2/FORMAT=F5.1.
-PRINT SDF1S2/FORMAT=F5.1.
-PRINT NCF1S2/FORMAT=F5.0.
-PRINT CRS2/FORMAT=F5.2.
-END MATRIX.
-])
-AT_CHECK([pspp matrix.sps -O format=csv], [0], [dnl
-Table: Matrix Variables Created by MGET
-,Split Values,Factors,Dimensions,
-,s,f,Rows,Columns
-MNF1S1,8,0,1,3
-SDF1S1,8,0,1,3
-NCF1S1,8,0,1,3
-CRS1,8,.,3,3
-MNF1S2,9,1,1,3
-SDF1S2,9,1,1,3
-NCF1S2,9,1,1,3
-CRS2,9,.,3,3
-
-MNF1S1
-21.4   5.0  72.9
-
-SDF1S1
-6.5   1.6  22.8
-
-NCF1S1
-106   106   106
-
-CRS1
-1.00   .41  -.16
-.41  1.00  -.22
--.16  -.22  1.00
-
-MNF1S2
-11.4   1.0  52.9
-
-SDF1S2
-9.5   8.6  12.8
-
-NCF1S2
-10    11    12
-
-CRS2
-1.00   .51   .36
-.51  1.00  -.41
-.36  -.41  1.00
-])
-AT_CLEANUP
-
-AT_SETUP([MATRIX - MGET with TYPE])
-AT_DATA([matrix.sps], [dnl
-MATRIX DATA
-    VARIABLES=ROWTYPE_ f1 var01 TO var04
-    /FACTOR=f1.
-BEGIN DATA.
-MEAN 0 34 35 36 37
-SD   0 22 11 55 66
-N    0 99 98 99 92
-MEAN 1 44 45 34 39
-SD   1 23 15 51 46
-N    1 98 34 87 23
-CORR .  1
-CORR . .9  1
-CORR . .8 .6  1
-CORR . .7 .5 .4  1
-END DATA.
-FORMATS var01 TO var04(F5.1).
-SAVE OUTFILE='matrix.sav'.
-])
-AT_DATA([matrix2.sps], [dnl
-MATRIX.
-MGET/FILE='matrix.sav'/TYPE=CORR.
-PRINT CR/FORMAT=F3.1.
-END MATRIX.
-])
-AT_CHECK([pspp matrix.sps])
-AT_CHECK([pspp -O format=csv matrix2.sps], [0], [dnl
-Table: Matrix Variables Created by MGET
-,Factors,Dimensions,
-,f1,Rows,Columns
-CR,.,4,4
-
-CR
-1.0  .9  .8  .7
-.9 1.0  .6  .5
-.8  .6 1.0  .4
-.7  .5  .4 1.0
-])
-AT_CLEANUP
-
-AT_SETUP([MATRIX - MGET - negative - parsing])
-AT_DATA([matrix.sps], [dnl
-MATRIX.
-MGET !.
-MGET FILE=!.
-MGET ENCODING=!.
-MGET TYPE=!.
-MGET TYPE=CORR !.
-END MATRIX.
-])
-AT_CHECK([pspp matrix.sps], [1], [dnl
-matrix.sps:2.6: error: MGET: Syntax error expecting FILE or TYPE.
-    2 | MGET !.
-      |      ^
-
-matrix.sps:3.11: error: MGET: Syntax error expecting a file name or handle
-name.
-    3 | MGET FILE=!.
-      |           ^
-
-matrix.sps:4.15: error: MGET: Syntax error expecting string.
-    4 | MGET ENCODING=!.
-      |               ^
-
-matrix.sps:5.11: error: MGET: Syntax error expecting COV, CORR, MEAN, STDDEV,
-N, or COUNT.
-    5 | MGET TYPE=!.
-      |           ^
-
-matrix.sps:6.16: error: MGET: Syntax error expecting COV, CORR, MEAN, STDDEV,
-N, or COUNT.
-    6 | MGET TYPE=CORR !.
-      |                ^
-])
-AT_CLEANUP
-
-AT_SETUP([MATRIX - MGET - missing VARNAME_ and ROWTYPE_])
-AT_DATA([matrix.sps], [dnl
-DATA LIST LIST NOTABLE /x.
-BEGIN DATA.
-1
-END DATA.
-
-MATRIX.
-MGET.
-END MATRIX.
-])
-AT_CHECK([pspp matrix.sps], [1], [dnl
-matrix.sps:7: error: MATRIX: Matrix data file lacks ROWTYPE_ variable.
-
-matrix.sps:7: error: MATRIX: Matrix data file lacks VARNAME_ variable.
-])
-AT_CLEANUP
-
-AT_SETUP([MATRIX - MGET - wrong format for VARNAME_ and ROWTYPE_])
-AT_DATA([matrix.sps], [dnl
-DATA LIST LIST NOTABLE /VARNAME_ * ROWTYPE_ (A7).
-BEGIN DATA.
-1 asdf
-END DATA.
-
-MATRIX.
-MGET.
-END MATRIX.
-])
-AT_CHECK([pspp matrix.sps], [1], [dnl
-matrix.sps:7: error: MATRIX: ROWTYPE_ variable in matrix data file must be 8-
-byte string, but it has width 7.
-
-matrix.sps:7: error: MATRIX: VARNAME_ variable in matrix data file must be 8-
-byte string, but it has width 0.
-])
-AT_CLEANUP
-
-AT_SETUP([MATRIX - MGET - wrong order for VARNAME_ and ROWTYPE_])
-AT_DATA([matrix.sps], [dnl
-DATA LIST LIST NOTABLE /VARNAME_ ROWTYPE_ (A8).
-BEGIN DATA.
-asdf jkl;
-END DATA.
-
-MATRIX.
-MGET.
-END MATRIX.
-])
-AT_CHECK([pspp matrix.sps], [1], [dnl
-matrix.sps:7: error: MATRIX: ROWTYPE_ must precede VARNAME_ in matrix data
-file.
-])
-AT_CLEANUP
-
-AT_SETUP([MATRIX - MGET - no continuous variables])
-AT_DATA([matrix.sps], [dnl
-DATA LIST LIST NOTABLE /ROWTYPE_ VARNAME_ (A8).
-BEGIN DATA.
-asdf jkl;
-END DATA.
-
-MATRIX.
-MGET.
-END MATRIX.
-])
-AT_CHECK([pspp matrix.sps], [1], [dnl
-matrix.sps:7: error: MATRIX: Matrix data file contains no continuous variables.
-])
-AT_CLEANUP
-
-AT_SETUP([MATRIX - MGET - unexpected string variables])
-AT_DATA([matrix.sps], [dnl
-DATA LIST LIST NOTABLE /ROWTYPE_ VARNAME_ cvar1 (A8).
-BEGIN DATA.
-asdf jkl; zxcv
-END DATA.
-
-MATRIX.
-MGET.
-END MATRIX.
-])
-AT_CHECK([pspp matrix.sps], [1], [dnl
-matrix.sps:7: error: MATRIX: Matrix data file contains unexpected string
-variable cvar1.
-])
-AT_CLEANUP
-
-AT_SETUP([MATRIX - MGET - unknown ROWTYPE_])
-AT_DATA([matrix.sps], [dnl
-DATA LIST LIST NOTABLE /ROWTYPE_ VARNAME_ (A8) cvar1.
-BEGIN DATA.
-asdf jkl; 1
-END DATA.
-
-MATRIX.
-MGET.
-END MATRIX.
-])
-AT_CHECK([pspp matrix.sps -O format=csv], [1], [dnl
-"matrix.sps:7: error: MATRIX: Matrix data file contains unknown ROWTYPE_ ""asdf""."
-])
-AT_CLEANUP
-
-AT_SETUP([MATRIX - MGET - duplicate matrix variable name])
-AT_DATA([matrix.sps], [dnl
-DATA LIST LIST NOTABLE /ROWTYPE_ VARNAME_ (A8) cvar1.
-BEGIN DATA.
-corr jkl; 1
-END DATA.
-
-MATRIX.
-MGET.
-MGET.
-END MATRIX.
-])
-AT_CHECK([pspp matrix.sps -O format=csv], [0], [dnl
-Table: Matrix Variables Created by MGET
-,Dimensions,
-,Rows,Columns
-CR,1,1
-
-matrix.sps:8: warning: MATRIX: Matrix data file contains variable with existing name CR.
-])
-AT_CLEANUP
-
-AT_SETUP([MATRIX - MGET - missing values in input])
-AT_DATA([matrix.sps], [dnl
-DATA LIST LIST NOTABLE /s1 * ROWTYPE_ VARNAME_ (A8) cvar1 cvar2.
-BEGIN DATA.
-1 n "" 1 .
-2 n "" . .
-END DATA.
-
-MATRIX.
-MGET.
-PRINT ncs1/FORMAT=F5.
-PRINT ncs2/FORMAT=F5.
-END MATRIX.
-])
-AT_CHECK([pspp matrix.sps -O format=csv], [1], [dnl
-"matrix.sps:8: error: MATRIX: Matrix data file variable NCS1 contains a missing value, which was treated as zero."
-
-"matrix.sps:8: error: MATRIX: Matrix data file variable NCS2 contains 2 missing values, which were treated as zero."
-
-Table: Matrix Variables Created by MGET
-,Split Values,Dimensions,
-,s1,Rows,Columns
-NCS1,1.00,1,2
-NCS2,2.00,1,2
-
-ncs1
-1     0
-
-ncs2
-0     0
-])
-AT_CLEANUP
-
-AT_SETUP([MATRIX - MSAVE])
-AT_DATA([matrix.sps], [dnl
-MATRIX.
-MSAVE {1, 2; 3, 4}/TYPE=CORR/VARIABLES=X,Y/OUTFILE='matrix.sav'.
-MSAVE {5, 6; 7, 8; 9, 10}/TYPE=COV/VARIABLES=X,Y.
-MSAVE {11, 12}/TYPE=MEAN.
-MSAVE {13, 14}/TYPE=STDDEV.
-MSAVE {15, 16}/TYPE=N.
-MSAVE {17, 18}/TYPE=COUNT.
-END MATRIX.
-GET 'matrix.sav'.
-LIST.
-])
-AT_CHECK([pspp matrix.sps -O format=csv], [0], [dnl
-Table: Data List
-ROWTYPE_,VARNAME_,X,Y
-CORR,X,1.00,2.00
-CORR,Y,3.00,4.00
-COV,X,5.00,6.00
-COV,Y,7.00,8.00
-COV,,9.00,10.00
-MEAN,,11.00,12.00
-STDDEV,,13.00,14.00
-N,,15.00,16.00
-COUNT,,17.00,18.00
-])
-AT_CLEANUP
-
-AT_SETUP([MATRIX - MSAVE with factor variables])
-AT_DATA([matrix.sps], [dnl
-MATRIX.
-MSAVE {1, 2; 3, 4}/TYPE=CORR/FACTOR={1,1}/FNAMES=X,Y/OUTFILE='matrix.sav'.
-MSAVE {5, 6; 7, 8; 9, 10}/TYPE=COV.
-MSAVE {11, 12}/TYPE=MEAN.
-MSAVE {13, 14}/FACTOR={2,1}/TYPE=STDDEV.
-MSAVE {15, 16}/TYPE=N.
-MSAVE {17, 18}/FACTOR={1,2}/TYPE=COUNT.
-END MATRIX.
-GET 'matrix.sav'.
-LIST.
-
-MATRIX.
-MSAVE {1, 2; 3, 4}/TYPE=CORR/FACTOR={5,6,7,8}/OUTFILE='matrix2.sav'.
-END MATRIX.
-GET 'matrix2.sav'.
-LIST.
-])
-AT_CHECK([pspp matrix.sps -O format=csv], [0], [dnl
-Table: Data List
-ROWTYPE_,X,Y,VARNAME_,COL1,COL2
-CORR,1.00,1.00,COL1,1.00,2.00
-CORR,1.00,1.00,COL2,3.00,4.00
-COV,1.00,1.00,COL1,5.00,6.00
-COV,1.00,1.00,COL2,7.00,8.00
-COV,1.00,1.00,,9.00,10.00
-MEAN,1.00,1.00,,11.00,12.00
-STDDEV,2.00,1.00,,13.00,14.00
-N,2.00,1.00,,15.00,16.00
-COUNT,1.00,2.00,,17.00,18.00
-
-Table: Data List
-ROWTYPE_,FAC1,FAC2,FAC3,FAC4,VARNAME_,COL1,COL2
-CORR,5.00,6.00,7.00,8.00,COL1,1.00,2.00
-CORR,5.00,6.00,7.00,8.00,COL2,3.00,4.00
-])
-AT_CLEANUP
-
-AT_SETUP([MATRIX - MSAVE with split variables])
-AT_DATA([matrix.sps], [dnl
-MATRIX.
-MSAVE {1, 2; 3, 4}/TYPE=CORR/SPLIT={1,1}/SNAMES=X,Y/OUTFILE='matrix.sav'.
-MSAVE {5, 6; 7, 8; 9, 10}/TYPE=COV.
-MSAVE {11, 12}/TYPE=MEAN.
-MSAVE {13, 14}/SPLIT={2,1}/TYPE=STDDEV.
-MSAVE {15, 16}/TYPE=N.
-MSAVE {17, 18}/SPLIT={1,2}/TYPE=COUNT.
-END MATRIX.
-GET 'matrix.sav'.
-LIST.
-
-MATRIX.
-MSAVE {1, 2; 3, 4}/TYPE=CORR/SPLIT={5,6,7,8}/OUTFILE='matrix2.sav'.
-END MATRIX.
-GET 'matrix2.sav'.
-LIST.
-])
-AT_CHECK([pspp matrix.sps -O format=csv], [0], [dnl
-Table: Data List
-X,Y,ROWTYPE_,VARNAME_,COL1,COL2
-1.00,1.00,CORR,COL1,1.00,2.00
-1.00,1.00,CORR,COL2,3.00,4.00
-1.00,1.00,COV,COL1,5.00,6.00
-1.00,1.00,COV,COL2,7.00,8.00
-1.00,1.00,COV,,9.00,10.00
-1.00,1.00,MEAN,,11.00,12.00
-2.00,1.00,STDDEV,,13.00,14.00
-2.00,1.00,N,,15.00,16.00
-1.00,2.00,COUNT,,17.00,18.00
-
-Table: Data List
-SPL1,SPL2,SPL3,SPL4,ROWTYPE_,VARNAME_,COL1,COL2
-5.00,6.00,7.00,8.00,CORR,COL1,1.00,2.00
-5.00,6.00,7.00,8.00,CORR,COL2,3.00,4.00
-])
-AT_CLEANUP
-
-AT_SETUP([MATRIX - MSAVE with factor and split variables])
-AT_DATA([matrix.sps], [dnl
-MATRIX.
-MSAVE {1, 2; 3, 4}/TYPE=CORR/SPLIT=1/FACTOR=1/OUTFILE='matrix.sav'.
-MSAVE {5, 6; 7, 8; 9, 10}/TYPE=COV.
-MSAVE {11, 12}/FACTOR=2/TYPE=MEAN.
-MSAVE {13, 14}/FACTOR=1/SPLIT=2/TYPE=STDDEV.
-MSAVE {15, 16}/TYPE=N.
-MSAVE {17, 18}/FACTOR=2/TYPE=COUNT.
-END MATRIX.
-GET 'matrix.sav'.
-LIST.
-])
-AT_CHECK([pspp matrix.sps -O format=csv], [0], [dnl
-Table: Data List
-SPL1,ROWTYPE_,FAC1,VARNAME_,COL1,COL2
-1.00,CORR,1.00,COL1,1.00,2.00
-1.00,CORR,1.00,COL2,3.00,4.00
-1.00,COV,1.00,COL1,5.00,6.00
-1.00,COV,1.00,COL2,7.00,8.00
-1.00,COV,1.00,,9.00,10.00
-1.00,MEAN,2.00,,11.00,12.00
-2.00,STDDEV,1.00,,13.00,14.00
-2.00,N,1.00,,15.00,16.00
-2.00,COUNT,2.00,,17.00,18.00
-])
-AT_CLEANUP
-
-AT_SETUP([MATRIX - MSAVE - negative])
-AT_DATA([matrix.sps], [dnl
-MATRIX.
-MSAVE !.
-MSAVE 1/TYPE=!.
-MSAVE 1/OUTFILE=!.
-MSAVE 1/VARIABLES=!.
-MSAVE 1/FNAMES=!.
-MSAVE 1/SNAMES=!.
-MSAVE 1/SPLIT=!.
-MSAVE 1/FACTOR=!.
-MSAVE 1/!.
-MSAVE 1.
-MSAVE 1/TYPE=COV/FNAMES=x.
-MSAVE 1/TYPE=COV/SNAMES=x.
-MSAVE 1/TYPE=COV.
-
-MSAVE 1/TYPE=COV/OUTFILE='matrix.sav'
-    /FACTOR=1 /FNAMES=y
-    /SPLIT=2 /SNAMES=z
-    /VARIABLES=w.
-MSAVE 1/TYPE=COV/OUTFILE='matrix2.sav'.
-MSAVE 1/TYPE=COV/VARIABLES=x.
-MSAVE 1/TYPE=COV/FNAMES=x.
-MSAVE 1/TYPE=COV/SNAMES=x.
-END MATRIX.
-
-MATRIX.
-MSAVE 1/TYPE=COV/VARIABLES=x/OUTFILE='matrix3.sav'/FACTOR=1/SPLIT=2.
-MSAVE {1,2}/TYPE=COV/VARIABLES=x/OUTFILE='matrix3.sav'/FACTOR=1/SPLIT=2.
-MSAVE {1,2;3}/TYPE=COV.
-MSAVE 0/TYPE=COV/FACTOR={1,2}.
-MSAVE 0/TYPE=COV/FACTOR=1/SPLIT={1;2}.
-END MATRIX.
-
-MATRIX.
-MSAVE 1/TYPE=COV/OUTFILE='matrix4.sav'/SNAMES=x,x/SPLIT=1.
-END MATRIX.
-
-MATRIX.
-MSAVE 1/TYPE=COV/OUTFILE='matrix5.sav'/SNAMES=x/FNAMES=x/SPLIT=1/FACTOR=1.
-END MATRIX.
-
-MATRIX.
-MSAVE 1/TYPE=COV/OUTFILE='matrix6.sav'/VARIABLES=x/FNAMES=x/FACTOR=1.
-END MATRIX.
-
-MATRIX.
-MSAVE 1/TYPE=COV/OUTFILE='matrix6.sav'/VARIABLES=x/SNAMES=x/SPLIT=1.
-END MATRIX.
-
-MATRIX.
-MSAVE 1/TYPE=COV/OUTFILE='matrix7.sav'/SNAMES=VARNAME_.
-MSAVE 1/TYPE=COV/OUTFILE='matrix7.sav'/SNAMES=ROWTYPE_.
-MSAVE 1/TYPE=COV/OUTFILE='matrix7.sav'/FNAMES=VARNAME_.
-MSAVE 1/TYPE=COV/OUTFILE='matrix7.sav'/FNAMES=ROWTYPE_.
-MSAVE 1/TYPE=COV/OUTFILE='matrix7.sav'/VARIABLES=VARNAME_.
-MSAVE 1/TYPE=COV/OUTFILE='matrix7.sav'/VARIABLES=ROWTYPE_.
-END MATRIX.
-])
-AT_CHECK([pspp matrix.sps], [1], [dnl
-matrix.sps:2.7: error: MSAVE: Syntax error expecting matrix expression.
-    2 | MSAVE !.
-      |       ^
-
-matrix.sps:3.14: error: MSAVE: Syntax error expecting COV, CORR, MEAN, STDDEV,
-N, or COUNT.
-    3 | MSAVE 1/TYPE=!.
-      |              ^
-
-matrix.sps:4.17: error: MSAVE: Syntax error expecting a file name or handle
-name.
-    4 | MSAVE 1/OUTFILE=!.
-      |                 ^
-
-matrix.sps:5.19: error: MSAVE: Syntax error expecting variable name.
-    5 | MSAVE 1/VARIABLES=!.
-      |                   ^
-
-matrix.sps:6.16: error: MSAVE: Syntax error expecting variable name.
-    6 | MSAVE 1/FNAMES=!.
-      |                ^
-
-matrix.sps:7.16: error: MSAVE: Syntax error expecting variable name.
-    7 | MSAVE 1/SNAMES=!.
-      |                ^
-
-matrix.sps:8.15: error: MSAVE: Syntax error expecting matrix expression.
-    8 | MSAVE 1/SPLIT=!.
-      |               ^
-
-matrix.sps:9.16: error: MSAVE: Syntax error expecting matrix expression.
-    9 | MSAVE 1/FACTOR=!.
-      |                ^
-
-matrix.sps:10.9: error: MSAVE: Syntax error expecting TYPE, OUTFILE, VARIABLES,
-FNAMES, SNAMES, SPLIT, or FACTOR.
-   10 | MSAVE 1/!.
-      |         ^
-
-matrix.sps:11.1-11.8: error: MSAVE: Required subcommand TYPE was not specified.
-   11 | MSAVE 1.
-      | ^~~~~~~~
-
-matrix.sps:12.25: error: MSAVE: FNAMES requires FACTOR.
-   12 | MSAVE 1/TYPE=COV/FNAMES=x.
-      |                         ^
-
-matrix.sps:13.25: error: MSAVE: SNAMES requires SPLIT.
-   13 | MSAVE 1/TYPE=COV/SNAMES=x.
-      |                         ^
-
-matrix.sps:14.1-14.17: error: MSAVE: Required subcommand OUTFILE was not
-specified.
-   14 | MSAVE 1/TYPE=COV.
-      | ^~~~~~~~~~~~~~~~~
-
-matrix.sps:20: error: MSAVE: OUTFILE must name the same file on each MSAVE
-within a single MATRIX command.
-
-matrix.sps:16.26-16.37: note: MSAVE: This is the OUTFILE on the first MSAVE
-command.
-   16 | MSAVE 1/TYPE=COV/OUTFILE='matrix.sav'
-      |                          ^~~~~~~~~~~~
-
-matrix.sps:20.26-20.38: note: MSAVE: This is the OUTFILE on a later MSAVE
-command.
-   20 | MSAVE 1/TYPE=COV/OUTFILE='matrix2.sav'.
-      |                          ^~~~~~~~~~~~~
-
-matrix.sps:21: error: MSAVE: VARIABLES must specify the same variables on each
-MSAVE within a given MATRIX.
-
-matrix.sps:19.16: error: MSAVE: This is the specification of VARIABLES on the
-first MSAVE.
-   19 |     /VARIABLES=w.
-      |                ^
-
-matrix.sps:21.28: error: MSAVE: This is a different specification of VARIABLES
-on a later MSAVE.
-   21 | MSAVE 1/TYPE=COV/VARIABLES=x.
-      |                            ^
-
-matrix.sps:22: error: MSAVE: FNAMES must specify the same variables on each
-MSAVE within a given MATRIX.
-
-matrix.sps:17.23: error: MSAVE: This is the specification of FNAMES on the
-first MSAVE.
-   17 |     /FACTOR=1 /FNAMES=y
-      |                       ^
-
-matrix.sps:22.25: error: MSAVE: This is a different specification of FNAMES on
-a later MSAVE.
-   22 | MSAVE 1/TYPE=COV/FNAMES=x.
-      |                         ^
-
-matrix.sps:23: error: MSAVE: SNAMES must specify the same variables on each
-MSAVE within a given MATRIX.
-
-matrix.sps:18.22: error: MSAVE: This is the specification of SNAMES on the
-first MSAVE.
-   18 |     /SPLIT=2 /SNAMES=z
-      |                      ^
-
-matrix.sps:23.25: error: MSAVE: This is a different specification of SNAMES on
-a later MSAVE.
-   23 | MSAVE 1/TYPE=COV/SNAMES=x.
-      |                         ^
-
-matrix.sps:28.7-28.11: error: MATRIX: Matrix on MSAVE has 2 columns but there
-are 1 variables.
-   28 | MSAVE {1,2}/TYPE=COV/VARIABLES=x/OUTFILE='matrix3.sav'/FACTOR=1/
-SPLIT=2.
-      |       ^~~~~
-
-matrix.sps:29.7-29.13: error: MATRIX: This expression tries to vertically join
-matrices with differing numbers of columns.
-   29 | MSAVE {1,2;3}/TYPE=COV.
-      |       ^~~~~~~
-
-matrix.sps:29.8-29.10: note: MATRIX: This operand is a 1×2 matrix.
-   29 | MSAVE {1,2;3}/TYPE=COV.
-      |        ^~~
-
-matrix.sps:29.12: note: MATRIX: This operand is a 1×1 matrix.
-   29 | MSAVE {1,2;3}/TYPE=COV.
-      |            ^
-
-matrix.sps:30.25-30.29: error: MATRIX: There are 1 factor variables, but 2
-factor values were supplied.
-   30 | MSAVE 0/TYPE=COV/FACTOR={1,2}.
-      |                         ^~~~~
-
-matrix.sps:31.33-31.37: error: MATRIX: There are 1 split variables, but 2 split
-values were supplied.
-   31 | MSAVE 0/TYPE=COV/FACTOR=1/SPLIT={1;2}.
-      |                                 ^~~~~
-
-matrix.sps:35.49: error: MSAVE: Variable x appears twice in variable list.
-   35 | MSAVE 1/TYPE=COV/OUTFILE='matrix4.sav'/SNAMES=x,x/SPLIT=1.
-      |                                                 ^
-
-matrix.sps:39.56: error: MATRIX: Duplicate or invalid FACTOR variable name x.
-   39 | MSAVE 1/TYPE=COV/OUTFILE='matrix5.sav'/SNAMES=x/FNAMES=x/SPLIT=1/
-FACTOR=1.
-      |                                                        ^
-
-matrix.sps:43.50: error: MATRIX: Duplicate or invalid variable name x.
-   43 | MSAVE 1/TYPE=COV/OUTFILE='matrix6.sav'/VARIABLES=x/FNAMES=x/FACTOR=1.
-      |                                                  ^
-
-matrix.sps:47.50: error: MATRIX: Duplicate or invalid variable name x.
-   47 | MSAVE 1/TYPE=COV/OUTFILE='matrix6.sav'/VARIABLES=x/SNAMES=x/SPLIT=1.
-      |                                                  ^
-
-matrix.sps:51.47-51.54: error: MSAVE: Variable name VARNAME_ is reserved.
-   51 | MSAVE 1/TYPE=COV/OUTFILE='matrix7.sav'/SNAMES=VARNAME_.
-      |                                               ^~~~~~~~
-
-matrix.sps:52.47-52.54: error: MSAVE: Variable name ROWTYPE_ is reserved.
-   52 | MSAVE 1/TYPE=COV/OUTFILE='matrix7.sav'/SNAMES=ROWTYPE_.
-      |                                               ^~~~~~~~
-
-matrix.sps:53.47-53.54: error: MSAVE: Variable name VARNAME_ is reserved.
-   53 | MSAVE 1/TYPE=COV/OUTFILE='matrix7.sav'/FNAMES=VARNAME_.
-      |                                               ^~~~~~~~
-
-matrix.sps:54.47-54.54: error: MSAVE: Variable name ROWTYPE_ is reserved.
-   54 | MSAVE 1/TYPE=COV/OUTFILE='matrix7.sav'/FNAMES=ROWTYPE_.
-      |                                               ^~~~~~~~
-
-matrix.sps:55.50-55.57: error: MSAVE: Variable name VARNAME_ is reserved.
-   55 | MSAVE 1/TYPE=COV/OUTFILE='matrix7.sav'/VARIABLES=VARNAME_.
-      |                                                  ^~~~~~~~
-
-matrix.sps:56.50-56.57: error: MSAVE: Variable name ROWTYPE_ is reserved.
-   56 | MSAVE 1/TYPE=COV/OUTFILE='matrix7.sav'/VARIABLES=ROWTYPE_.
-      |                                                  ^~~~~~~~
-])
-AT_CLEANUP
-
-AT_SETUP([MATRIX - DISPLAY])
-AT_DATA([matrix-template.sps], [dnl
-MATRIX.
-COMPUTE a={1,2,3}.
-COMPUTE b={1;2;3}.
-COMPUTE c={T(b),a}.
-COMPUTE d={T(a),b}.
-command.
-END MATRIX.
-])
-for command in 'DISPLAY' 'DISPLAY DICTIONARY' 'DISPLAY STATUS'; do
-    sed "s/command/$command/" < matrix-template.sps > matrix.sps
-    AT_CHECK([pspp matrix.sps -O format=csv], [0], [dnl
-Table: Matrix Variables
-,Dimension,,Size (kB)
-,Rows,Columns,
-a,1,3,0
-b,3,1,0
-c,1,6,0
-d,3,2,0
-])
-done
-AT_CLEANUP
-
-AT_SETUP([MATRIX - DISPLAY - negative])
-AT_DATA([matrix.sps], [dnl
-MATRIX.
-DISPLAY !.
-END MATRIX.
-])
-AT_CHECK([pspp matrix.sps], [1], [dnl
-matrix.sps:2.9: error: DISPLAY: Syntax error expecting DICTIONARY or STATUS.
-    2 | DISPLAY !.
-      |         ^
-])
-AT_CLEANUP
-
-AT_SETUP([MATRIX - RELEASE])
-AT_DATA([matrix.sps], [dnl
-MATRIX.
-COMPUTE x=1.
-PRINT x.
-RELEASE X.
-PRINT x.
-END MATRIX.
-])
-AT_CHECK([pspp matrix.sps], [1], [dnl
-x
-  1
-
-matrix.sps:5.7: error: MATRIX: Uninitialized variable x used in expression.
-    5 | PRINT x.
-      |       ^
-])
-AT_CLEANUP
-
-AT_SETUP([MATRIX - RELEASE - negative])
-AT_DATA([matrix.sps], [dnl
-MATRIX.
-RELEASE !.
-RELEASE x.
-COMPUTE x=1.
-RELEASE x, !.
-COMPUTE x=1.
-RELEASE x y.
-COMPUTE x=1.
-RELEASE x.
-RELEASE x.
-END MATRIX.
-])
-AT_CHECK([pspp matrix.sps], [1], [dnl
-matrix.sps:2.9: error: RELEASE: Syntax error expecting end of command.
-    2 | RELEASE !.
-      |         ^
-
-matrix.sps:3.9: error: RELEASE: Syntax error expecting variable name.
-    3 | RELEASE x.
-      |         ^
-
-matrix.sps:5.12: error: RELEASE: Syntax error expecting end of command.
-    5 | RELEASE x, !.
-      |            ^
-
-matrix.sps:7.11: error: RELEASE: Syntax error expecting end of command.
-    7 | RELEASE x y.
-      |           ^
-])
-AT_CLEANUP
\ No newline at end of file