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: error: MATRIX: 0 is not a valid row index for a matrix with dimensions (3,3). matrix.sps:25: error: MATRIX: 0 is not a valid column index for a matrix with dimensions (3,3). matrix.sps:26: error: MATRIX: 4 is not a valid row index for a matrix with dimensions (3,3). matrix.sps:27: error: MATRIX: 4 is not a valid column index for a matrix with dimensions (3,3). {}(:,{}) {}({},:) {}({},{}) matrix.sps:33: error: MATRIX: Matrix row index must be scalar or vector, not a matrix with dimensions (2,2). matrix.sps:34: error: MATRIX: Matrix column index must be scalar or vector, not a matrix with dimensions (2,2). ]) 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: error: MATRIX: Row index vector for assignment to x has 1 elements but source matrix has 0 rows. matrix.sps:4: error: MATRIX: Column index vector for assignment to x has 3 elements but source matrix has 1 columns. matrix.sps:5: error: MATRIX: Column index vector for assignment to x has 3 elements but source matrix has 2 columns. matrix.sps:6: error: MATRIX: Column index vector for assignment to x has 3 elements but source matrix has 4 columns. matrix.sps:7: error: MATRIX: Row index vector for assignment to x has 3 elements but source matrix has 0 rows. matrix.sps:8: error: MATRIX: Row index vector for assignment to x has 3 elements but source matrix has 1 rows. matrix.sps:9: error: MATRIX: Row index vector for assignment to x has 3 elements but source matrix has 1 rows. matrix.sps:10: error: MATRIX: Row index vector for assignment to x has 3 elements but source matrix has 1 rows. matrix.sps:11: error: MATRIX: Can't use vector indexing on matrix x with dimensions (3,3). matrix.sps:12: error: MATRIX: 0 is not a valid row index for a matrix with dimensions (3,3). matrix.sps:13: error: MATRIX: 0 is not a valid column index for a matrix with dimensions (3,3). matrix.sps:14: error: MATRIX: 0 is not a valid row index for a matrix with dimensions (3,3). matrix.sps:15: error: MATRIX: 4 is not a valid row index for a matrix with dimensions (3,3). matrix.sps:16: error: MATRIX: 4 is not a valid column index for a matrix with dimensions (3,3). matrix.sps:17: error: MATRIX: Matrix row index must be scalar or vector, not a matrix with dimensions (2,2). matrix.sps:18: error: MATRIX: Matrix column index must be scalar or vector, not a matrix with dimensions (2,2). 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: error: MATRIX: Vector index operator must be applied to vector, not a matrix with dimensions (2,2). matrix.sps:25: error: MATRIX: Vector index must be scalar or vector, not a matrix with dimensions (2,2). matrix.sps:26: error: MATRIX: Index 0 is out of range for vector with 4 elements. matrix.sps:27: error: MATRIX: Index 5 is out of range for vector with 4 elements. ]) 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: error: MATRIX: Can't assign matrix with dimensions (2,2) to subvector. matrix.sps:4: error: MATRIX: Can't assign vector with 0 elements to subvector with 3. matrix.sps:5: error: MATRIX: Can't assign vector with 1 elements to subvector with 3. matrix.sps:6: error: MATRIX: Can't assign vector with 2 elements to subvector with 3. matrix.sps:7: error: MATRIX: Can't assign vector with 4 elements to subvector with 3. matrix.sps:8: error: MATRIX: Can't assign vector with 0 elements to subvector with 3. matrix.sps:9: error: MATRIX: Can't assign vector with 1 elements to subvector with 3. matrix.sps:10: error: MATRIX: Can't assign vector with 2 elements to subvector with 3. matrix.sps:11: error: MATRIX: Can't assign vector with 4 elements to subvector with 3. matrix.sps:12: error: MATRIX: Can't assign vector with 4 elements to subvector with 9. matrix.sps:13: error: MATRIX: Index 0 is out of range for vector with 9 elements. matrix.sps:14: error: MATRIX: Index 10 is out of range for vector with 9 elements. matrix.sps:15: error: MATRIX: Vector index must be scalar or vector, not a matrix with dimensions (2,2). matrix.sps:18: error: MATRIX: Can't assign matrix with dimensions (2,2) to subvector. matrix.sps:19: error: MATRIX: Can't assign vector with 0 elements to subvector with 3. matrix.sps:20: error: MATRIX: Can't assign vector with 1 elements to subvector with 3. matrix.sps:21: error: MATRIX: Can't assign vector with 2 elements to subvector with 3. matrix.sps:22: error: MATRIX: Can't assign vector with 4 elements to subvector with 3. matrix.sps:23: error: MATRIX: Can't assign vector with 0 elements to subvector with 3. matrix.sps:24: error: MATRIX: Can't assign vector with 1 elements to subvector with 3. matrix.sps:25: error: MATRIX: Can't assign vector with 2 elements to subvector with 3. matrix.sps:26: error: MATRIX: Can't assign vector with 4 elements to subvector with 3. matrix.sps:27: error: MATRIX: Can't assign vector with 4 elements to subvector with 9. matrix.sps:28: error: MATRIX: Index 0 is out of range for vector with 9 elements. matrix.sps:29: error: MATRIX: Index 10 is out of range for vector with 9 elements. matrix.sps:30: error: MATRIX: Vector index must be scalar or vector, not a matrix with dimensions (2,2). matrix.sps:33: error: MATRIX: Can't use vector indexing on matrix m with dimensions (2,2). matrix.sps:34: error: MATRIX: Can't use vector indexing on matrix m with dimensions (2,2). ]) 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 at end of command: expecting `='. matrix.sps:3.11: error: COMPUTE: Syntax error at end of command. matrix.sps:4: error: MATRIX: Undefined variable x. matrix.sps:5: error: COMPUTE: Undefined variable y. ]) 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: error: MATRIX: Operands to + must have the same dimensions or one must be a scalar, not matrices with dimensions (2,2) and (1,2). ({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: error: MATRIX: Operands to - must have the same dimensions or one must be a scalar, not matrices with dimensions (2,2) and (1,2). ({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: error: MATRIX: Operands to &* must have the same dimensions or one must be a scalar, not matrices with dimensions (2,2) and (1,2). ({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: error: MATRIX: Operands to &** must have the same dimensions or one must be a scalar, not matrices with dimensions (2,2) and (1,2). ]) 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: error: MATRIX: Operands to > must have the same dimensions or one must be a scalar, not matrices with dimensions (1,2) and (2,1). ({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: error: MATRIX: Operands to < must have the same dimensions or one must be a scalar, not matrices with dimensions (1,2) and (2,1). ({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: error: MATRIX: Operands to <> must have the same dimensions or one must be a scalar, not matrices with dimensions (1,2) and (2,1). ({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: error: MATRIX: Operands to >= must have the same dimensions or one must be a scalar, not matrices with dimensions (1,2) and (2,1). ({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: error: MATRIX: Operands to <= must have the same dimensions or one must be a scalar, not matrices with dimensions (1,2) and (2,1). ({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: error: MATRIX: Operands to = must have the same dimensions or one must be a scalar, not matrices with dimensions (1,2) and (2,1). ]) 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: error: MATRIX: Operands to AND must have the same dimensions or one must be a scalar, not matrices with dimensions (1,2) and (2,1). ({-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: error: MATRIX: Operands to OR must have the same dimensions or one must be a scalar, not matrices with dimensions (1,2) and (2,1). ({-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: error: MATRIX: Operands to XOR must have the same dimensions or one must be a scalar, not matrices with dimensions (1,2) and (2,1). ]) 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: error: MATRIX: Matrices with dimensions (1,3) and (1,2) are not conformable for multiplication. matrix.sps:17: error: MATRIX: Matrix exponentation with ** requires a square matrix on the left-hand size, not one with dimensions (1,3). matrix.sps:18: error: MATRIX: Matrix exponentiation with ** requires a scalar on the right-hand side, not a matrix with dimensions (1,2). matrix.sps:19: error: MATRIX: Exponent 1.5 in matrix multiplication is non- integer or outside the valid range. ]) 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: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 matrix.sps:12: error: MATRIX: The increment operand to : must be nonzero. matrix.sps:13: error: MATRIX: The increment operand to : must be nonzero. matrix.sps:15: error: MATRIX: All rows in a matrix must have the same number of columns, but this tries to stack matrices with 2 and 1 columns. matrix.sps:16: error: MATRIX: All columns in a matrix must have the same number of rows, but this tries to paste matrices with 2 and 1 rows. ]) 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}). 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.0000000000 2.0000000000 1.0000000000 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: error: MATRIX: GSCH requires its argument to have at least as many columns as rows, but it has dimensions (2,1). matrix.sps:23: error: MATRIX: Argument to GSCH with dimensions (2,3) contains only 0 linearly independent columns. ]) 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. END MATRIX. ]) AT_CHECK([pspp matrix.sps], [0], [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 ]) 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: error: MATRIX: Function MDIAG argument 1 must be a vector, but it has dimensions (2,2). 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: error: MATRIX: Divisor argument to MOD function must be nonzero. ]) 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, 2, 3; 4, 5, 6; 7, 8, 9; 10, 11, 12}, 1, 12). PRINT RESHAPE({1, 2, 3; 4, 5, 6; 7, 8, 9; 10, 11, 12}, 2, 6). PRINT RESHAPE({1, 2, 3; 4, 5, 6; 7, 8, 9; 10, 11, 12}, 3, 4). PRINT RESHAPE({1, 2, 3; 4, 5, 6; 7, 8, 9; 10, 11, 12}, 4, 3). PRINT RESHAPE({1, 2, 3; 4, 5, 6; 7, 8, 9; 10, 11, 12}, 6, 2). PRINT RESHAPE({1, 2, 3; 4, 5, 6; 7, 8, 9; 10, 11, 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, 2, 3; 4, 5, 6; 7, 8, 9; 10, 11, 12}, 1, 12) 1 2 3 4 5 6 7 8 9 10 11 12 RESHAPE({1, 2, 3; 4, 5, 6; 7, 8, 9; 10, 11, 12}, 2, 6) 1 2 3 4 5 6 7 8 9 10 11 12 RESHAPE({1, 2, 3; 4, 5, 6; 7, 8, 9; 10, 11, 12}, 3, 4) 1 2 3 4 5 6 7 8 9 10 11 12 RESHAPE({1, 2, 3; 4, 5, 6; 7, 8, 9; 10, 11, 12}, 4, 3) 1 2 3 4 5 6 7 8 9 10 11 12 RESHAPE({1, 2, 3; 4, 5, 6; 7, 8, 9; 10, 11, 12}, 6, 2) 1 2 3 4 5 6 7 8 9 10 11 12 RESHAPE({1, 2, 3; 4, 5, 6; 7, 8, 9; 10, 11, 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: error: MATRIX: SOLVE requires its arguments to have the same number of rows, but the first argument has dimensions (2,2) and the second (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: error: MATRIX: Argument to SQRT must be nonnegative. ]) 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). 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 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 - 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: error: MATRIX: SETDIAG argument 2 must be a scalar or a vector but it has dimensions (2,2). 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}, evec, eval). PRINT evec. PRINT eval. END MATRIX. ]) AT_CHECK([pspp matrix.sps], [0], [dnl evec 1 0 0 1 eval 1 1 evec -.6666666667 .0000000000 .7453559925 -.3333333333 -.8944271910 -.2981423970 -.6666666667 .4472135955 -.5962847940 eval 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:21: error: MATRIX: Expression for DO IF must evaluate to scalar, not a matrix with dimensions (1,2). matrix.sps:25: error: MATRIX: Expression for ELSE IF must evaluate to scalar, not a matrix with dimensions (0,0). ]) 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:67: error: MATRIX: Expression for LOOP must evaluate to scalar, not a matrix with dimensions (0,0). matrix.sps:70: error: MATRIX: Expression for TO must evaluate to scalar, not a matrix with dimensions (0,0). matrix.sps:73: error: MATRIX: Expression for BY must evaluate to scalar, not a matrix with dimensions (0,0). matrix.sps:76: error: MATRIX: Expression for LOOP IF must evaluate to scalar, not a matrix with dimensions (0,0). matrix.sps:79: error: MATRIX: Expression for END LOOP IF must evaluate to scalar, not a matrix with dimensions (0,0). matrix.sps:82: error: MATRIX: Expression for LOOP is outside the integer range. ]) 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: error: BREAK: BREAK not inside LOOP. ]) AT_CLEANUP AT_SETUP([MATRIX - READ]) AT_DATA([matrix.txt], [dnl 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 ]) AT_DATA([matrix2.txt], [dnl 2, 3, 5, 7 11, 13, 17, 19 23, 29, 31, 37 41, 43, 47, 53 ]) AT_DATA([matrix.sps], [dnl MATRIX. 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. 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. END MATRIX. ]) AT_CHECK([pspp matrix.sps], [0], [dnl 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 y 2 3 5 7 11 13 17 19 23 29 31 37 41 43 47 53 ]) AT_CLEANUP