Improve error messages by citing syntax in more of them.
[pspp] / tests / language / stats / matrix.at
1 AT_BANNER([MATRIX])
2
3 AT_SETUP([MATRIX - empty matrices])
4 AT_DATA([matrix.sps], [dnl
5 MATRIX.
6 COMPUTE a={}.
7 PRINT a.
8 COMPUTE b={a; 1; 2; 3}.
9 PRINT b.
10 COMPUTE c={a, 1, 2, 3}.
11 PRINT c.
12 END MATRIX.
13 ])
14 AT_CHECK([pspp matrix.sps], [0], [dnl
15 a
16
17 b
18   1
19   2
20   3
21
22 c
23   1  2  3
24 ])
25 AT_CLEANUP
26
27 AT_SETUP([MATRIX - submatrices as rvalues - all columns or all rows])
28 AT_DATA([matrix.sps], [dnl
29 MATRIX.
30 PRINT {1, 2, 3; 4, 5, 6; 7, 8, 9}(1, :).
31 PRINT {1, 2, 3; 4, 5, 6; 7, 8, 9}({1}, :).
32 PRINT {1, 2, 3; 4, 5, 6; 7, 8, 9}({1, 2}, :).
33 PRINT {1, 2, 3; 4, 5, 6; 7, 8, 9}({1, 2, 3}, :).
34 PRINT {1, 2, 3; 4, 5, 6; 7, 8, 9}({1; 3; 2}, :).
35 PRINT {1, 2, 3; 4, 5, 6; 7, 8, 9}({1, 3, 3}, :).
36 PRINT {1, 2, 3; 4, 5, 6; 7, 8, 9}(1:2, :).
37 PRINT {1, 2, 3; 4, 5, 6; 7, 8, 9}(1:3, :).
38 PRINT {1, 2, 3; 4, 5, 6; 7, 8, 9}({}, :).
39
40 PRINT {1, 2, 3; 4, 5, 6; 7, 8, 9}(:, 1).
41 PRINT {1, 2, 3; 4, 5, 6; 7, 8, 9}(:, {1}).
42 PRINT {1, 2, 3; 4, 5, 6; 7, 8, 9}(:, {1, 2}).
43 PRINT {1, 2, 3; 4, 5, 6; 7, 8, 9}(:, {1, 2, 3}).
44 PRINT {1, 2, 3; 4, 5, 6; 7, 8, 9}(:, {1; 3; 2}).
45 PRINT {1, 2, 3; 4, 5, 6; 7, 8, 9}(:, {1, 3, 3}).
46 PRINT {1, 2, 3; 4, 5, 6; 7, 8, 9}(:, 1:2).
47 PRINT {1, 2, 3; 4, 5, 6; 7, 8, 9}(:, 1:3).
48 PRINT {1, 2, 3; 4, 5, 6; 7, 8, 9}(:, {}).
49
50 PRINT {1, 2, 3; 4, 5, 6; 7, 8, 9}(:, :).
51
52 PRINT {1, 2, 3; 4, 5, 6; 7, 8, 9}(0, :).
53 PRINT {1, 2, 3; 4, 5, 6; 7, 8, 9}(:, 0).
54 PRINT {1, 2, 3; 4, 5, 6; 7, 8, 9}(4, :).
55 PRINT {1, 2, 3; 4, 5, 6; 7, 8, 9}(:, 4).
56
57 PRINT {}(:,{}).
58 PRINT {}({},:).
59 PRINT {}({},{}).
60
61 PRINT {1, 2, 3, 4}({1, 2; 3, 4}, :).
62 PRINT {1, 2, 3, 4}(:, {1, 2; 3, 4}).
63 END MATRIX.
64 ])
65 AT_CHECK([pspp matrix.sps], [1], [dnl
66 {1, 2, 3; 4, 5, 6; 7, 8, 9}(1, :)
67   1  2  3
68
69 {1, 2, 3; 4, 5, 6; 7, 8, 9}({1}, :)
70   1  2  3
71
72 {1, 2, 3; 4, 5, 6; 7, 8, 9}({1, 2}, :)
73   1  2  3
74   4  5  6
75
76 {1, 2, 3; 4, 5, 6; 7, 8, 9}({1, 2, 3}, :)
77   1  2  3
78   4  5  6
79   7  8  9
80
81 {1, 2, 3; 4, 5, 6; 7, 8, 9}({1; 3; 2}, :)
82   1  2  3
83   7  8  9
84   4  5  6
85
86 {1, 2, 3; 4, 5, 6; 7, 8, 9}({1, 3, 3}, :)
87   1  2  3
88   7  8  9
89   7  8  9
90
91 {1, 2, 3; 4, 5, 6; 7, 8, 9}(1:2, :)
92   1  2  3
93   4  5  6
94
95 {1, 2, 3; 4, 5, 6; 7, 8, 9}(1:3, :)
96   1  2  3
97   4  5  6
98   7  8  9
99
100 {1, 2, 3; 4, 5, 6; 7, 8, 9}({}, :)
101
102 {1, 2, 3; 4, 5, 6; 7, 8, 9}(:, 1)
103   1
104   4
105   7
106
107 {1, 2, 3; 4, 5, 6; 7, 8, 9}(:, {1})
108   1
109   4
110   7
111
112 {1, 2, 3; 4, 5, 6; 7, 8, 9}(:, {1, 2})
113   1  2
114   4  5
115   7  8
116
117 {1, 2, 3; 4, 5, 6; 7, 8, 9}(:, {1, 2, 3})
118   1  2  3
119   4  5  6
120   7  8  9
121
122 {1, 2, 3; 4, 5, 6; 7, 8, 9}(:, {1; 3; 2})
123   1  3  2
124   4  6  5
125   7  9  8
126
127 {1, 2, 3; 4, 5, 6; 7, 8, 9}(:, {1, 3, 3})
128   1  3  3
129   4  6  6
130   7  9  9
131
132 {1, 2, 3; 4, 5, 6; 7, 8, 9}(:, 1:2)
133   1  2
134   4  5
135   7  8
136
137 {1, 2, 3; 4, 5, 6; 7, 8, 9}(:, 1:3)
138   1  2  3
139   4  5  6
140   7  8  9
141
142 {1, 2, 3; 4, 5, 6; 7, 8, 9}(:, {})
143
144
145
146 {1, 2, 3; 4, 5, 6; 7, 8, 9}(:, :)
147   1  2  3
148   4  5  6
149   7  8  9
150
151 matrix.sps:24.35: error: MATRIX: 0 is not a valid row index for a 3×3 matrix.
152    24 | PRINT {1, 2, 3; 4, 5, 6; 7, 8, 9}(0, :).
153       |                                   ^
154
155 matrix.sps:25.38: error: MATRIX: 0 is not a valid column index for a 3×3
156 matrix.
157    25 | PRINT {1, 2, 3; 4, 5, 6; 7, 8, 9}(:, 0).
158       |                                      ^
159
160 matrix.sps:26.35: error: MATRIX: 4 is not a valid row index for a 3×3 matrix.
161    26 | PRINT {1, 2, 3; 4, 5, 6; 7, 8, 9}(4, :).
162       |                                   ^
163
164 matrix.sps:27.38: error: MATRIX: 4 is not a valid column index for a 3×3
165 matrix.
166    27 | PRINT {1, 2, 3; 4, 5, 6; 7, 8, 9}(:, 4).
167       |                                      ^
168
169 {}(:,{})
170
171 {}({},:)
172
173 {}({},{})
174
175 matrix.sps:33.20-33.31: error: MATRIX: Matrix row index must be scalar or
176 vector, not a 2×2 matrix.
177    33 | PRINT {1, 2, 3, 4}({1, 2; 3, 4}, :).
178       |                    ^~~~~~~~~~~~
179
180 matrix.sps:34.23-34.34: error: MATRIX: Matrix column index must be scalar or
181 vector, not a 2×2 matrix.
182    34 | PRINT {1, 2, 3, 4}(:, {1, 2; 3, 4}).
183       |                       ^~~~~~~~~~~~
184 ])
185 AT_CLEANUP
186
187 AT_SETUP([MATRIX - COMPUTE submatrices as lvalues])
188 AT_DATA([matrix.sps], [dnl
189 MATRIX.
190 COMPUTE y={1, 2, 3; 4, 5, 6; 7, 8, 9}.
191
192 COMPUTE x1=y.
193 COMPUTE x1(1, :) = {11, 12, 13}.
194 PRINT x1.
195
196 COMPUTE x2=y.
197 COMPUTE x2(2, :) = {14, 15, 16}.
198 PRINT x2.
199
200 COMPUTE x3=y.
201 COMPUTE x3(3, :) = {17, 18, 19}.
202 PRINT x3.
203
204 COMPUTE x4=y.
205 COMPUTE x4(:, 1) = {11; 14; 17}.
206 PRINT x4.
207
208 COMPUTE x5=y.
209 COMPUTE x5(:, 2) = {12; 15; 18}.
210 PRINT x5.
211
212 COMPUTE x6=y.
213 COMPUTE x6(:, 3) = {13; 16; 19}.
214 PRINT x6.
215
216 COMPUTE x7=y.
217 COMPUTE x7(1, 1) = 11.
218 PRINT x7.
219
220 COMPUTE x8=y.
221 COMPUTE x8(1:2, 2:3) = {12, 13; 15, 16}.
222 PRINT x8.
223
224 COMPUTE x9=y.
225 COMPUTE x9({3, 1}, {2; 3}) = {18, 19; 12, 13}.
226 PRINT x9.
227 END MATRIX.
228 ])
229 AT_CHECK([pspp matrix.sps], [0], [dnl
230 x1
231   11  12  13
232    4   5   6
233    7   8   9
234
235 x2
236    1   2   3
237   14  15  16
238    7   8   9
239
240 x3
241    1   2   3
242    4   5   6
243   17  18  19
244
245 x4
246   11   2   3
247   14   5   6
248   17   8   9
249
250 x5
251    1  12   3
252    4  15   6
253    7  18   9
254
255 x6
256    1   2  13
257    4   5  16
258    7   8  19
259
260 x7
261   11   2   3
262    4   5   6
263    7   8   9
264
265 x8
266    1  12  13
267    4  15  16
268    7   8   9
269
270 x9
271    1  12  13
272    4   5   6
273    7  18  19
274 ])
275 AT_CLEANUP
276
277 AT_SETUP([MATRIX - COMPUTE submatrices as lvalues - negative])
278 AT_DATA([matrix.sps], [dnl
279 MATRIX.
280 COMPUTE x={1, 2, 3; 4, 5, 6; 7, 8, 9}.
281 COMPUTE x(1, :) = {}.
282 COMPUTE x(1, :) = 15.
283 COMPUTE x(1, :) = {11, 12}.
284 COMPUTE x(1, :) = {11, 12, 13, 14}.
285 COMPUTE x(:, 1) = {}.
286 COMPUTE x(:, 1) = 15.
287 COMPUTE x(:, 1) = {11, 12}.
288 COMPUTE x(:, 1) = {11, 12, 13, 14}.
289 COMPUTE x(:) = 1.
290 COMPUTE x(0, 1) = 1.
291 COMPUTE x(1, 0) = 1.
292 COMPUTE x({1, 0, 2}, 1) = {1; 2; 3}.
293 COMPUTE x(4, 3) = 1.
294 COMPUTE x(3, 4) = 1.
295 COMPUTE x({1, 2; 3, 4}, 5) = 1.
296 COMPUTE x(3, {1, 2; 3, 4}) = 1.
297 PRINT x.
298 END MATRIX.
299 ])
300 AT_CHECK([pspp matrix.sps], [1], [dnl
301 matrix.sps:3.9-3.15: error: MATRIX: Numbers of indexes for assigning to x
302 differ from the size of the source matrix.
303     3 | COMPUTE x(1, :) = {}.
304       |         ^~~~~~~
305
306 matrix.sps:3.11: note: MATRIX: There is 1 row index.
307     3 | COMPUTE x(1, :) = {}.
308       |           ^
309
310 matrix.sps:3.14: note: MATRIX: Destination matrix x has 3 columns.
311     3 | COMPUTE x(1, :) = {}.
312       |              ^
313
314 matrix.sps:3.19-3.20: note: MATRIX: The source matrix is 0×0.
315     3 | COMPUTE x(1, :) = {}.
316       |                   ^~
317
318 matrix.sps:4.9-4.15: error: MATRIX: Number of column indexes for assigning to x
319 differs from number of columns in source matrix.
320     4 | COMPUTE x(1, :) = 15.
321       |         ^~~~~~~
322
323 matrix.sps:4.14: note: MATRIX: Destination matrix x has 3 columns.
324     4 | COMPUTE x(1, :) = 15.
325       |              ^
326
327 matrix.sps:4.19-4.20: note: MATRIX: The source matrix is 1×1.
328     4 | COMPUTE x(1, :) = 15.
329       |                   ^~
330
331 matrix.sps:5.9-5.15: error: MATRIX: Number of column indexes for assigning to x
332 differs from number of columns in source matrix.
333     5 | COMPUTE x(1, :) = {11, 12}.
334       |         ^~~~~~~
335
336 matrix.sps:5.14: note: MATRIX: Destination matrix x has 3 columns.
337     5 | COMPUTE x(1, :) = {11, 12}.
338       |              ^
339
340 matrix.sps:5.19-5.26: note: MATRIX: The source matrix is 1×2.
341     5 | COMPUTE x(1, :) = {11, 12}.
342       |                   ^~~~~~~~
343
344 matrix.sps:6.9-6.15: error: MATRIX: Number of column indexes for assigning to x
345 differs from number of columns in source matrix.
346     6 | COMPUTE x(1, :) = {11, 12, 13, 14}.
347       |         ^~~~~~~
348
349 matrix.sps:6.14: note: MATRIX: Destination matrix x has 3 columns.
350     6 | COMPUTE x(1, :) = {11, 12, 13, 14}.
351       |              ^
352
353 matrix.sps:6.19-6.34: note: MATRIX: The source matrix is 1×4.
354     6 | COMPUTE x(1, :) = {11, 12, 13, 14}.
355       |                   ^~~~~~~~~~~~~~~~
356
357 matrix.sps:7.9-7.15: error: MATRIX: Numbers of indexes for assigning to x
358 differ from the size of the source matrix.
359     7 | COMPUTE x(:, 1) = {}.
360       |         ^~~~~~~
361
362 matrix.sps:7.11: note: MATRIX: Destination matrix x has 3 rows.
363     7 | COMPUTE x(:, 1) = {}.
364       |           ^
365
366 matrix.sps:7.14: note: MATRIX: There is 1 column index.
367     7 | COMPUTE x(:, 1) = {}.
368       |              ^
369
370 matrix.sps:7.19-7.20: note: MATRIX: The source matrix is 0×0.
371     7 | COMPUTE x(:, 1) = {}.
372       |                   ^~
373
374 matrix.sps:8.9-8.15: error: MATRIX: Number of row indexes for assigning to x
375 differs from number of rows in source matrix.
376     8 | COMPUTE x(:, 1) = 15.
377       |         ^~~~~~~
378
379 matrix.sps:8.11: note: MATRIX: Destination matrix x has 3 rows.
380     8 | COMPUTE x(:, 1) = 15.
381       |           ^
382
383 matrix.sps:8.19-8.20: note: MATRIX: The source matrix is 1×1.
384     8 | COMPUTE x(:, 1) = 15.
385       |                   ^~
386
387 matrix.sps:9.9-9.15: error: MATRIX: Numbers of indexes for assigning to x
388 differ from the size of the source matrix.
389     9 | COMPUTE x(:, 1) = {11, 12}.
390       |         ^~~~~~~
391
392 matrix.sps:9.11: note: MATRIX: Destination matrix x has 3 rows.
393     9 | COMPUTE x(:, 1) = {11, 12}.
394       |           ^
395
396 matrix.sps:9.14: note: MATRIX: There is 1 column index.
397     9 | COMPUTE x(:, 1) = {11, 12}.
398       |              ^
399
400 matrix.sps:9.19-9.26: note: MATRIX: The source matrix is 1×2.
401     9 | COMPUTE x(:, 1) = {11, 12}.
402       |                   ^~~~~~~~
403
404 matrix.sps:10.9-10.15: error: MATRIX: Numbers of indexes for assigning to x
405 differ from the size of the source matrix.
406    10 | COMPUTE x(:, 1) = {11, 12, 13, 14}.
407       |         ^~~~~~~
408
409 matrix.sps:10.11: note: MATRIX: Destination matrix x has 3 rows.
410    10 | COMPUTE x(:, 1) = {11, 12, 13, 14}.
411       |           ^
412
413 matrix.sps:10.14: note: MATRIX: There is 1 column index.
414    10 | COMPUTE x(:, 1) = {11, 12, 13, 14}.
415       |              ^
416
417 matrix.sps:10.19-10.34: note: MATRIX: The source matrix is 1×4.
418    10 | COMPUTE x(:, 1) = {11, 12, 13, 14}.
419       |                   ^~~~~~~~~~~~~~~~
420
421 matrix.sps:11.9-11.12: error: MATRIX: Can't use vector indexing on 3×3 matrix
422 x.
423    11 | COMPUTE x(:) = 1.
424       |         ^~~~
425
426 matrix.sps:12.11: error: MATRIX: 0 is not a valid row index for a 3×3 matrix.
427    12 | COMPUTE x(0, 1) = 1.
428       |           ^
429
430 matrix.sps:13.14: error: MATRIX: 0 is not a valid column index for a 3×3
431 matrix.
432    13 | COMPUTE x(1, 0) = 1.
433       |              ^
434
435 matrix.sps:14.11-14.19: error: MATRIX: 0 is not a valid row index for a 3×3
436 matrix.
437    14 | COMPUTE x({1, 0, 2}, 1) = {1; 2; 3}.
438       |           ^~~~~~~~~
439
440 matrix.sps:15.11: error: MATRIX: 4 is not a valid row index for a 3×3 matrix.
441    15 | COMPUTE x(4, 3) = 1.
442       |           ^
443
444 matrix.sps:16.14: error: MATRIX: 4 is not a valid column index for a 3×3
445 matrix.
446    16 | COMPUTE x(3, 4) = 1.
447       |              ^
448
449 matrix.sps:17.11-17.22: error: MATRIX: Matrix row index must be scalar or
450 vector, not a 2×2 matrix.
451    17 | COMPUTE x({1, 2; 3, 4}, 5) = 1.
452       |           ^~~~~~~~~~~~
453
454 matrix.sps:18.14-18.25: error: MATRIX: Matrix column index must be scalar or
455 vector, not a 2×2 matrix.
456    18 | COMPUTE x(3, {1, 2; 3, 4}) = 1.
457       |              ^~~~~~~~~~~~
458
459 x
460   1  2  3
461   4  5  6
462   7  8  9
463 ])
464 AT_CLEANUP
465
466 AT_SETUP([MATRIX - subvectors as rvalues])
467 AT_DATA([matrix.sps], [dnl
468 MATRIX.
469 PRINT {10, 20, 30}({}).
470 PRINT {10, 20, 30}(2).
471 PRINT {10, 20, 30}({2}).
472 PRINT {10, 20, 30}({1,3}).
473 PRINT {10, 20, 30}({2,3}).
474 PRINT {10, 20, 30}({1;3}).
475 PRINT {10, 20, 30}({2;3}).
476 PRINT {10, 20, 30}(2:3).
477 PRINT {10, 20, 30}(:).
478
479 PRINT {10; 20; 30}({}).
480 PRINT {10; 20; 30}(2).
481 PRINT {10; 20; 30}({2}).
482 PRINT {10; 20; 30}({1,3}).
483 PRINT {10; 20; 30}({2,3}).
484 PRINT {10; 20; 30}({1;3}).
485 PRINT {10; 20; 30}({2;3}).
486 PRINT {10; 20; 30}(2:3).
487 PRINT {10; 20; 30}(:).
488
489 PRINT {}({}).
490
491 PRINT {1, 2; 3, 4}(:).
492 PRINT {1, 2, 3, 4}({1, 2; 3, 4}).
493 PRINT {1, 2, 3, 4}(0).
494 PRINT {1, 2, 3, 4}(5).
495 END MATRIX.
496 ])
497 AT_CHECK([pspp matrix.sps], [1], [dnl
498 {10, 20, 30}({})
499
500 {10, 20, 30}(2)
501   20
502
503 {10, 20, 30}({2})
504   20
505
506 {10, 20, 30}({1,3})
507   10  30
508
509 {10, 20, 30}({2,3})
510   20  30
511
512 {10, 20, 30}({1;3})
513   10  30
514
515 {10, 20, 30}({2;3})
516   20  30
517
518 {10, 20, 30}(2:3)
519   20  30
520
521 {10, 20, 30}(:)
522   10  20  30
523
524 {10; 20; 30}({})
525
526 {10; 20; 30}(2)
527   20
528
529 {10; 20; 30}({2})
530   20
531
532 {10; 20; 30}({1,3})
533   10
534   30
535
536 {10; 20; 30}({2,3})
537   20
538   30
539
540 {10; 20; 30}({1;3})
541   10
542   30
543
544 {10; 20; 30}({2;3})
545   20
546   30
547
548 {10; 20; 30}(2:3)
549   20
550   30
551
552 {10; 20; 30}(:)
553   10
554   20
555   30
556
557 {}({})
558
559 matrix.sps:24.7-24.18: error: MATRIX: Vector index operator may not be applied
560 to a 2×2 matrix.
561    24 | PRINT {1, 2; 3, 4}(:).
562       |       ^~~~~~~~~~~~
563
564 matrix.sps:25.20-25.31: error: MATRIX: Vector index must be scalar or vector,
565 not a 2×2 matrix.
566    25 | PRINT {1, 2, 3, 4}({1, 2; 3, 4}).
567       |                    ^~~~~~~~~~~~
568
569 matrix.sps:26.20: error: MATRIX: Index 0 is out of range for vector with 4
570 elements.
571    26 | PRINT {1, 2, 3, 4}(0).
572       |                    ^
573
574 matrix.sps:27.20: error: MATRIX: Index 5 is out of range for vector with 4
575 elements.
576    27 | PRINT {1, 2, 3, 4}(5).
577       |                    ^
578 ])
579 AT_CLEANUP
580
581 AT_SETUP([MATRIX - COMPUTE subvectors as lvalues])
582 AT_DATA([matrix.sps], [dnl
583 MATRIX.
584 COMPUTE r={1, 2, 3, 4, 5, 6, 7, 8, 9}.
585
586 COMPUTE r1=r.
587 COMPUTE r1(:) = {11, 12, 13, 14, 15, 16, 17, 18, 19}.
588 PRINT r1.
589
590 COMPUTE r2=r.
591 COMPUTE r2(:) = {11; 12; 13; 14; 15; 16; 17; 18; 19}.
592 PRINT r2.
593
594 COMPUTE r3=r.
595 COMPUTE r3(1) = 11.
596 PRINT r3.
597
598 COMPUTE r4=r.
599 COMPUTE r4(1:2) = {11:12}.
600 PRINT r4.
601
602 COMPUTE r5=r.
603 COMPUTE r5({8;9}) = {18:19}.
604 PRINT r5.
605
606 COMPUTE c={1, 2, 3, 4, 5, 6, 7, 8, 9}.
607
608 COMPUTE c1=c.
609 COMPUTE c1(:) = {11, 12, 13, 14, 15, 16, 17, 18, 19}.
610 PRINT c1.
611
612 COMPUTE c2=c.
613 COMPUTE c2(:) = {11; 12; 13; 14; 15; 16; 17; 18; 19}.
614 PRINT c2.
615
616 COMPUTE c3=c.
617 COMPUTE c3(1) = 11.
618 PRINT c3.
619
620 COMPUTE c4=c.
621 COMPUTE c4(1:2) = {11:12}.
622 PRINT c4.
623
624 COMPUTE c5=c.
625 COMPUTE c5(8:9) = {18:19}.
626 PRINT c5.
627 END MATRIX.
628 ])
629 AT_CHECK([pspp matrix.sps], [0], [dnl
630 r1
631   11  12  13  14  15  16  17  18  19
632
633 r2
634   11  12  13  14  15  16  17  18  19
635
636 r3
637   11   2   3   4   5   6   7   8   9
638
639 r4
640   11  12   3   4   5   6   7   8   9
641
642 r5
643    1   2   3   4   5   6   7  18  19
644
645 c1
646   11  12  13  14  15  16  17  18  19
647
648 c2
649   11  12  13  14  15  16  17  18  19
650
651 c3
652   11   2   3   4   5   6   7   8   9
653
654 c4
655   11  12   3   4   5   6   7   8   9
656
657 c5
658    1   2   3   4   5   6   7  18  19
659 ])
660 AT_CLEANUP
661
662 AT_SETUP([MATRIX - COMPUTE subvectors as lvalues - negative])
663 AT_DATA([matrix.sps], [dnl
664 MATRIX.
665 COMPUTE r={1, 2, 3, 4, 5, 6, 7, 8, 9}.
666 COMPUTE r(1:3) = {1, 2; 3, 4}.
667 COMPUTE r(1:3) = {}.
668 COMPUTE r(1:3) = {1}.
669 COMPUTE r(1:3) = {1, 2}.
670 COMPUTE r(1:3) = {1, 2, 3, 4}.
671 COMPUTE r(1:3) = {}.
672 COMPUTE r(1:3) = {1}.
673 COMPUTE r(1:3) = {1; 2}.
674 COMPUTE r(1:3) = {1; 2; 3; 4}.
675 COMPUTE r(:) = {1; 2; 3; 4}.
676 COMPUTE r(0) = 5.
677 COMPUTE r(10) = 5.
678 COMPUTE r({1, 2; 3, 4}) = 1.
679
680 COMPUTE c={1, 2, 3, 4, 5, 6, 7, 8, 9}.
681 COMPUTE c(1:3) = {1, 2; 3, 4}.
682 COMPUTE c(1:3) = {}.
683 COMPUTE c(1:3) = {1}.
684 COMPUTE c(1:3) = {1, 2}.
685 COMPUTE c(1:3) = {1, 2, 3, 4}.
686 COMPUTE c(1:3) = {}.
687 COMPUTE c(1:3) = {1}.
688 COMPUTE c(1:3) = {1; 2}.
689 COMPUTE c(1:3) = {1; 2; 3; 4}.
690 COMPUTE c(:) = {1; 2; 3; 4}.
691 COMPUTE c(0) = 5.
692 COMPUTE c(10) = 5.
693 COMPUTE c({1, 2; 3, 4}) = 1.
694
695 COMPUTE m = {1, 2; 3, 4}.
696 COMPUTE m(5) = 1.
697 COMPUTE m(:) = 1.
698 END MATRIX.
699 ])
700 AT_CHECK([pspp matrix.sps], [1], [dnl
701 matrix.sps:3.9-3.14: error: MATRIX: Only an 3-element vector may be assigned to
702 this 3-element subvector of r.
703     3 | COMPUTE r(1:3) = {1, 2; 3, 4}.
704       |         ^~~~~~
705
706 matrix.sps:3.18-3.29: error: MATRIX: The source is an 2×2 matrix.
707     3 | COMPUTE r(1:3) = {1, 2; 3, 4}.
708       |                  ^~~~~~~~~~~~
709
710 matrix.sps:4.9-4.14: error: MATRIX: Only an 3-element vector may be assigned to
711 this 3-element subvector of r.
712     4 | COMPUTE r(1:3) = {}.
713       |         ^~~~~~
714
715 matrix.sps:4.18-4.19: error: MATRIX: The source vector has 0 elements.
716     4 | COMPUTE r(1:3) = {}.
717       |                  ^~
718
719 matrix.sps:5.9-5.14: error: MATRIX: Only an 3-element vector may be assigned to
720 this 3-element subvector of r.
721     5 | COMPUTE r(1:3) = {1}.
722       |         ^~~~~~
723
724 matrix.sps:5.19: error: MATRIX: The source vector has 1 element.
725     5 | COMPUTE r(1:3) = {1}.
726       |                   ^
727
728 matrix.sps:6.9-6.14: error: MATRIX: Only an 3-element vector may be assigned to
729 this 3-element subvector of r.
730     6 | COMPUTE r(1:3) = {1, 2}.
731       |         ^~~~~~
732
733 matrix.sps:6.18-6.23: error: MATRIX: The source vector has 2 elements.
734     6 | COMPUTE r(1:3) = {1, 2}.
735       |                  ^~~~~~
736
737 matrix.sps:7.9-7.14: error: MATRIX: Only an 3-element vector may be assigned to
738 this 3-element subvector of r.
739     7 | COMPUTE r(1:3) = {1, 2, 3, 4}.
740       |         ^~~~~~
741
742 matrix.sps:7.18-7.29: error: MATRIX: The source vector has 4 elements.
743     7 | COMPUTE r(1:3) = {1, 2, 3, 4}.
744       |                  ^~~~~~~~~~~~
745
746 matrix.sps:8.9-8.14: error: MATRIX: Only an 3-element vector may be assigned to
747 this 3-element subvector of r.
748     8 | COMPUTE r(1:3) = {}.
749       |         ^~~~~~
750
751 matrix.sps:8.18-8.19: error: MATRIX: The source vector has 0 elements.
752     8 | COMPUTE r(1:3) = {}.
753       |                  ^~
754
755 matrix.sps:9.9-9.14: error: MATRIX: Only an 3-element vector may be assigned to
756 this 3-element subvector of r.
757     9 | COMPUTE r(1:3) = {1}.
758       |         ^~~~~~
759
760 matrix.sps:9.19: error: MATRIX: The source vector has 1 element.
761     9 | COMPUTE r(1:3) = {1}.
762       |                   ^
763
764 matrix.sps:10.9-10.14: error: MATRIX: Only an 3-element vector may be assigned
765 to this 3-element subvector of r.
766    10 | COMPUTE r(1:3) = {1; 2}.
767       |         ^~~~~~
768
769 matrix.sps:10.18-10.23: error: MATRIX: The source vector has 2 elements.
770    10 | COMPUTE r(1:3) = {1; 2}.
771       |                  ^~~~~~
772
773 matrix.sps:11.9-11.14: error: MATRIX: Only an 3-element vector may be assigned
774 to this 3-element subvector of r.
775    11 | COMPUTE r(1:3) = {1; 2; 3; 4}.
776       |         ^~~~~~
777
778 matrix.sps:11.18-11.29: error: MATRIX: The source vector has 4 elements.
779    11 | COMPUTE r(1:3) = {1; 2; 3; 4}.
780       |                  ^~~~~~~~~~~~
781
782 matrix.sps:12.9-12.12: error: MATRIX: Only an 9-element vector may be assigned
783 to this 9-element subvector of r.
784    12 | COMPUTE r(:) = {1; 2; 3; 4}.
785       |         ^~~~
786
787 matrix.sps:12.16-12.27: error: MATRIX: The source vector has 4 elements.
788    12 | COMPUTE r(:) = {1; 2; 3; 4}.
789       |                ^~~~~~~~~~~~
790
791 matrix.sps:13.11: error: MATRIX: Index 0 is out of range for vector with 9
792 elements.
793    13 | COMPUTE r(0) = 5.
794       |           ^
795
796 matrix.sps:14.11-14.12: error: MATRIX: Index 10 is out of range for vector with
797 9 elements.
798    14 | COMPUTE r(10) = 5.
799       |           ^~
800
801 matrix.sps:15.11-15.22: error: MATRIX: Vector index must be scalar or vector,
802 not a 2×2 matrix.
803    15 | COMPUTE r({1, 2; 3, 4}) = 1.
804       |           ^~~~~~~~~~~~
805
806 matrix.sps:18.9-18.14: error: MATRIX: Only an 3-element vector may be assigned
807 to this 3-element subvector of c.
808    18 | COMPUTE c(1:3) = {1, 2; 3, 4}.
809       |         ^~~~~~
810
811 matrix.sps:18.18-18.29: error: MATRIX: The source is an 2×2 matrix.
812    18 | COMPUTE c(1:3) = {1, 2; 3, 4}.
813       |                  ^~~~~~~~~~~~
814
815 matrix.sps:19.9-19.14: error: MATRIX: Only an 3-element vector may be assigned
816 to this 3-element subvector of c.
817    19 | COMPUTE c(1:3) = {}.
818       |         ^~~~~~
819
820 matrix.sps:19.18-19.19: error: MATRIX: The source vector has 0 elements.
821    19 | COMPUTE c(1:3) = {}.
822       |                  ^~
823
824 matrix.sps:20.9-20.14: error: MATRIX: Only an 3-element vector may be assigned
825 to this 3-element subvector of c.
826    20 | COMPUTE c(1:3) = {1}.
827       |         ^~~~~~
828
829 matrix.sps:20.19: error: MATRIX: The source vector has 1 element.
830    20 | COMPUTE c(1:3) = {1}.
831       |                   ^
832
833 matrix.sps:21.9-21.14: error: MATRIX: Only an 3-element vector may be assigned
834 to this 3-element subvector of c.
835    21 | COMPUTE c(1:3) = {1, 2}.
836       |         ^~~~~~
837
838 matrix.sps:21.18-21.23: error: MATRIX: The source vector has 2 elements.
839    21 | COMPUTE c(1:3) = {1, 2}.
840       |                  ^~~~~~
841
842 matrix.sps:22.9-22.14: error: MATRIX: Only an 3-element vector may be assigned
843 to this 3-element subvector of c.
844    22 | COMPUTE c(1:3) = {1, 2, 3, 4}.
845       |         ^~~~~~
846
847 matrix.sps:22.18-22.29: error: MATRIX: The source vector has 4 elements.
848    22 | COMPUTE c(1:3) = {1, 2, 3, 4}.
849       |                  ^~~~~~~~~~~~
850
851 matrix.sps:23.9-23.14: error: MATRIX: Only an 3-element vector may be assigned
852 to this 3-element subvector of c.
853    23 | COMPUTE c(1:3) = {}.
854       |         ^~~~~~
855
856 matrix.sps:23.18-23.19: error: MATRIX: The source vector has 0 elements.
857    23 | COMPUTE c(1:3) = {}.
858       |                  ^~
859
860 matrix.sps:24.9-24.14: error: MATRIX: Only an 3-element vector may be assigned
861 to this 3-element subvector of c.
862    24 | COMPUTE c(1:3) = {1}.
863       |         ^~~~~~
864
865 matrix.sps:24.19: error: MATRIX: The source vector has 1 element.
866    24 | COMPUTE c(1:3) = {1}.
867       |                   ^
868
869 matrix.sps:25.9-25.14: error: MATRIX: Only an 3-element vector may be assigned
870 to this 3-element subvector of c.
871    25 | COMPUTE c(1:3) = {1; 2}.
872       |         ^~~~~~
873
874 matrix.sps:25.18-25.23: error: MATRIX: The source vector has 2 elements.
875    25 | COMPUTE c(1:3) = {1; 2}.
876       |                  ^~~~~~
877
878 matrix.sps:26.9-26.14: error: MATRIX: Only an 3-element vector may be assigned
879 to this 3-element subvector of c.
880    26 | COMPUTE c(1:3) = {1; 2; 3; 4}.
881       |         ^~~~~~
882
883 matrix.sps:26.18-26.29: error: MATRIX: The source vector has 4 elements.
884    26 | COMPUTE c(1:3) = {1; 2; 3; 4}.
885       |                  ^~~~~~~~~~~~
886
887 matrix.sps:27.9-27.12: error: MATRIX: Only an 9-element vector may be assigned
888 to this 9-element subvector of c.
889    27 | COMPUTE c(:) = {1; 2; 3; 4}.
890       |         ^~~~
891
892 matrix.sps:27.16-27.27: error: MATRIX: The source vector has 4 elements.
893    27 | COMPUTE c(:) = {1; 2; 3; 4}.
894       |                ^~~~~~~~~~~~
895
896 matrix.sps:28.11: error: MATRIX: Index 0 is out of range for vector with 9
897 elements.
898    28 | COMPUTE c(0) = 5.
899       |           ^
900
901 matrix.sps:29.11-29.12: error: MATRIX: Index 10 is out of range for vector with
902 9 elements.
903    29 | COMPUTE c(10) = 5.
904       |           ^~
905
906 matrix.sps:30.11-30.22: error: MATRIX: Vector index must be scalar or vector,
907 not a 2×2 matrix.
908    30 | COMPUTE c({1, 2; 3, 4}) = 1.
909       |           ^~~~~~~~~~~~
910
911 matrix.sps:33.9-33.12: error: MATRIX: Can't use vector indexing on 2×2 matrix
912 m.
913    33 | COMPUTE m(5) = 1.
914       |         ^~~~
915
916 matrix.sps:34.9-34.12: error: MATRIX: Can't use vector indexing on 2×2 matrix
917 m.
918    34 | COMPUTE m(:) = 1.
919       |         ^~~~
920 ])
921 AT_CLEANUP
922
923 AT_SETUP([MATRIX - COMPUTE - negative])
924 AT_DATA([matrix.sps], [dnl
925 MATRIX.
926 COMPUTE x.
927 COMPUTE x=.
928 COMPUTE x(5)=1.
929 COMPUTE y(5)=1.
930 END MATRIX.
931 ])
932 AT_CHECK([pspp matrix.sps], [1], [dnl
933 matrix.sps:2.10: error: COMPUTE: Syntax error expecting `='.
934     2 | COMPUTE x.
935       |          ^
936
937 matrix.sps:3.11: error: COMPUTE: Syntax error.
938     3 | COMPUTE x=.
939       |           ^
940
941 matrix.sps:4.9: error: MATRIX: Undefined variable x.
942     4 | COMPUTE x(5)=1.
943       |         ^
944
945 matrix.sps:5.9: error: COMPUTE: Undefined variable y.
946     5 | COMPUTE y(5)=1.
947       |         ^
948 ])
949 AT_CLEANUP
950
951 AT_SETUP([MATRIX - elementwise arithmetic operators])
952 AT_DATA([matrix.sps], [dnl
953 MATRIX.
954 PRINT (-(5)).
955 PRINT (-{1,2;3,4}).
956
957 PRINT ({1,2;3,4} + {5,6;7,8}).
958 PRINT ({1,2;3,4} + 5).
959 PRINT (5 + {5,6;7,8}).
960 PRINT ({1,2;3,4} + {5,6}).
961
962 PRINT ({1,2;3,4} - {5,6;7,8}).
963 PRINT ({1,2;3,4} - 5).
964 PRINT (5 - {5,6;7,8}).
965 PRINT ({1,2;3,4} - {5,6}).
966
967 PRINT ({1,2;3,4} * 5).
968 PRINT (5 * {5,6;7,8}).
969
970 PRINT ({2,4;6,8} / 2).
971 PRINT (12 / {1,2;3,4}).
972 PRINT ({2,8;18,32} / {1,2;3,4}).
973
974 PRINT ({1,2;3,4} &* {5,6;7,8}).
975 PRINT ({1,2;3,4} &* 5).
976 PRINT (5 &* {5,6;7,8}).
977 PRINT ({1,2;3,4} &* {5,6}).
978
979 PRINT ({2,4;6,8} &/ 2).
980 PRINT (12 &/ {1,2;3,4}).
981 PRINT ({2,8;18,32} &/ {1,2;3,4}).
982
983 PRINT ({1,2;3,4} &** 2).
984 PRINT (2 &** {1,2;3,4}).
985 PRINT ({1,2;3,4} &** {2,3;4,5}).
986 PRINT ({1,2;3,4} &** {5,6}).
987 END MATRIX.
988 ])
989 AT_CHECK([pspp matrix.sps], [1], [dnl
990 (-(5))
991  -5
992
993 (-{1,2;3,4})
994  -1 -2
995  -3 -4
996
997 ({1,2;3,4} + {5,6;7,8})
998    6   8
999   10  12
1000
1001 ({1,2;3,4} + 5)
1002   6  7
1003   8  9
1004
1005 (5 + {5,6;7,8})
1006   10  11
1007   12  13
1008
1009 matrix.sps:8.8-8.24: error: MATRIX: The operands of + must have the same
1010 dimensions or one must be a scalar.
1011     8 | PRINT ({1,2;3,4} + {5,6}).
1012       |        ^~~~~~~~~~~~~~~~~
1013
1014 matrix.sps:8.8-8.16: note: MATRIX: The left-hand operand is a 2×2 matrix.
1015     8 | PRINT ({1,2;3,4} + {5,6}).
1016       |        ^~~~~~~~~
1017
1018 matrix.sps:8.20-8.24: note: MATRIX: The right-hand operand is a 1×2 matrix.
1019     8 | PRINT ({1,2;3,4} + {5,6}).
1020       |                    ^~~~~
1021
1022 ({1,2;3,4} - {5,6;7,8})
1023  -4 -4
1024  -4 -4
1025
1026 ({1,2;3,4} - 5)
1027  -4 -3
1028  -2 -1
1029
1030 (5 - {5,6;7,8})
1031   0 -1
1032  -2 -3
1033
1034 matrix.sps:13.8-13.24: error: MATRIX: The operands of - must have the same
1035 dimensions or one must be a scalar.
1036    13 | PRINT ({1,2;3,4} - {5,6}).
1037       |        ^~~~~~~~~~~~~~~~~
1038
1039 matrix.sps:13.8-13.16: note: MATRIX: The left-hand operand is a 2×2 matrix.
1040    13 | PRINT ({1,2;3,4} - {5,6}).
1041       |        ^~~~~~~~~
1042
1043 matrix.sps:13.20-13.24: note: MATRIX: The right-hand operand is a 1×2 matrix.
1044    13 | PRINT ({1,2;3,4} - {5,6}).
1045       |                    ^~~~~
1046
1047 ({1,2;3,4} * 5)
1048    5  10
1049   15  20
1050
1051 (5 * {5,6;7,8})
1052   25  30
1053   35  40
1054
1055 ({2,4;6,8} / 2)
1056   1  2
1057   3  4
1058
1059 (12 / {1,2;3,4})
1060   12   6
1061    4   3
1062
1063 ({2,8;18,32} / {1,2;3,4})
1064   2  4
1065   6  8
1066
1067 ({1,2;3,4} &* {5,6;7,8})
1068    5  12
1069   21  32
1070
1071 ({1,2;3,4} &* 5)
1072    5  10
1073   15  20
1074
1075 (5 &* {5,6;7,8})
1076   25  30
1077   35  40
1078
1079 matrix.sps:25.8-25.25: error: MATRIX: The operands of &* must have the same
1080 dimensions or one must be a scalar.
1081    25 | PRINT ({1,2;3,4} &* {5,6}).
1082       |        ^~~~~~~~~~~~~~~~~~
1083
1084 matrix.sps:25.8-25.16: note: MATRIX: The left-hand operand is a 2×2 matrix.
1085    25 | PRINT ({1,2;3,4} &* {5,6}).
1086       |        ^~~~~~~~~
1087
1088 matrix.sps:25.21-25.25: note: MATRIX: The right-hand operand is a 1×2 matrix.
1089    25 | PRINT ({1,2;3,4} &* {5,6}).
1090       |                     ^~~~~
1091
1092 ({2,4;6,8} &/ 2)
1093   1  2
1094   3  4
1095
1096 (12 &/ {1,2;3,4})
1097   12   6
1098    4   3
1099
1100 ({2,8;18,32} &/ {1,2;3,4})
1101   2  4
1102   6  8
1103
1104 ({1,2;3,4} &** 2)
1105    1   4
1106    9  16
1107
1108 (2 &** {1,2;3,4})
1109    2   4
1110    8  16
1111
1112 ({1,2;3,4} &** {2,3;4,5})
1113      1     8
1114     81  1024
1115
1116 matrix.sps:34.8-34.26: error: MATRIX: The operands of &** must have the same
1117 dimensions or one must be a scalar.
1118    34 | PRINT ({1,2;3,4} &** {5,6}).
1119       |        ^~~~~~~~~~~~~~~~~~~
1120
1121 matrix.sps:34.8-34.16: note: MATRIX: The left-hand operand is a 2×2 matrix.
1122    34 | PRINT ({1,2;3,4} &** {5,6}).
1123       |        ^~~~~~~~~
1124
1125 matrix.sps:34.22-34.26: note: MATRIX: The right-hand operand is a 1×2 matrix.
1126    34 | PRINT ({1,2;3,4} &** {5,6}).
1127       |                      ^~~~~
1128 ])
1129 AT_CLEANUP
1130
1131 AT_SETUP([MATRIX - relational operators])
1132 AT_DATA([matrix.sps], [dnl
1133 MATRIX.
1134 PRINT ({1, 1; 2, 2} > {1, 2; 1, 2}).
1135 PRINT ({1, 1; 2, 2} > 1).
1136 PRINT (2 > {1, 2; 1, 2}).
1137 PRINT ({1, 2} > {1; 2}).
1138
1139 PRINT ({1, 1; 2, 2} < {1, 2; 1, 2}).
1140 PRINT ({1, 1; 2, 2} < 2).
1141 PRINT (1 < {1, 2; 1, 2}).
1142 PRINT ({1, 2} < {1; 2}).
1143
1144 PRINT ({1, 1; 2, 2} <> {1, 2; 1, 2}).
1145 PRINT ({1, 1; 2, 2} <> 2).
1146 PRINT (1 <> {1, 2; 1, 2}).
1147 PRINT ({1, 2} <> {1; 2}).
1148
1149 PRINT ({1, 1; 2, 2} >= {1, 2; 1, 2}).
1150 PRINT ({1, 1; 2, 2} >= 2).
1151 PRINT (1 >= {1, 2; 1, 2}).
1152 PRINT ({1, 2} >= {1; 2}).
1153
1154 PRINT ({1, 1; 2, 2} <= {1, 2; 1, 2}).
1155 PRINT ({1, 1; 2, 2} <= 2).
1156 PRINT (1 <= {1, 2; 1, 2}).
1157 PRINT ({1, 2} <= {1; 2}).
1158
1159 PRINT ({1, 1; 2, 2} = {1, 2; 1, 2}).
1160 PRINT ({1, 1; 2, 2} = 2).
1161 PRINT (1 = {1, 2; 1, 2}).
1162 PRINT ({1, 2} = {1; 2}).
1163 END MATRIX.
1164 ])
1165 AT_CHECK([pspp matrix.sps], [1], [dnl
1166 ({1, 1; 2, 2} > {1, 2; 1, 2})
1167   0  0
1168   1  0
1169
1170 ({1, 1; 2, 2} > 1)
1171   0  0
1172   1  1
1173
1174 (2 > {1, 2; 1, 2})
1175   1  0
1176   1  0
1177
1178 matrix.sps:5.8-5.22: error: MATRIX: The operands of > must have the same
1179 dimensions or one must be a scalar.
1180     5 | PRINT ({1, 2} > {1; 2}).
1181       |        ^~~~~~~~~~~~~~~
1182
1183 matrix.sps:5.8-5.13: note: MATRIX: The left-hand operand is a 1×2 matrix.
1184     5 | PRINT ({1, 2} > {1; 2}).
1185       |        ^~~~~~
1186
1187 matrix.sps:5.17-5.22: note: MATRIX: The right-hand operand is a 2×1 matrix.
1188     5 | PRINT ({1, 2} > {1; 2}).
1189       |                 ^~~~~~
1190
1191 ({1, 1; 2, 2} < {1, 2; 1, 2})
1192   0  1
1193   0  0
1194
1195 ({1, 1; 2, 2} < 2)
1196   1  1
1197   0  0
1198
1199 (1 < {1, 2; 1, 2})
1200   0  1
1201   0  1
1202
1203 matrix.sps:10.8-10.22: error: MATRIX: The operands of < must have the same
1204 dimensions or one must be a scalar.
1205    10 | PRINT ({1, 2} < {1; 2}).
1206       |        ^~~~~~~~~~~~~~~
1207
1208 matrix.sps:10.8-10.13: note: MATRIX: The left-hand operand is a 1×2 matrix.
1209    10 | PRINT ({1, 2} < {1; 2}).
1210       |        ^~~~~~
1211
1212 matrix.sps:10.17-10.22: note: MATRIX: The right-hand operand is a 2×1 matrix.
1213    10 | PRINT ({1, 2} < {1; 2}).
1214       |                 ^~~~~~
1215
1216 ({1, 1; 2, 2} <> {1, 2; 1, 2})
1217   0  1
1218   1  0
1219
1220 ({1, 1; 2, 2} <> 2)
1221   1  1
1222   0  0
1223
1224 (1 <> {1, 2; 1, 2})
1225   0  1
1226   0  1
1227
1228 matrix.sps:15.8-15.23: error: MATRIX: The operands of <> must have the same
1229 dimensions or one must be a scalar.
1230    15 | PRINT ({1, 2} <> {1; 2}).
1231       |        ^~~~~~~~~~~~~~~~
1232
1233 matrix.sps:15.8-15.13: note: MATRIX: The left-hand operand is a 1×2 matrix.
1234    15 | PRINT ({1, 2} <> {1; 2}).
1235       |        ^~~~~~
1236
1237 matrix.sps:15.18-15.23: note: MATRIX: The right-hand operand is a 2×1 matrix.
1238    15 | PRINT ({1, 2} <> {1; 2}).
1239       |                  ^~~~~~
1240
1241 ({1, 1; 2, 2} >= {1, 2; 1, 2})
1242   1  0
1243   1  1
1244
1245 ({1, 1; 2, 2} >= 2)
1246   0  0
1247   1  1
1248
1249 (1 >= {1, 2; 1, 2})
1250   1  0
1251   1  0
1252
1253 matrix.sps:20.8-20.23: error: MATRIX: The operands of >= must have the same
1254 dimensions or one must be a scalar.
1255    20 | PRINT ({1, 2} >= {1; 2}).
1256       |        ^~~~~~~~~~~~~~~~
1257
1258 matrix.sps:20.8-20.13: note: MATRIX: The left-hand operand is a 1×2 matrix.
1259    20 | PRINT ({1, 2} >= {1; 2}).
1260       |        ^~~~~~
1261
1262 matrix.sps:20.18-20.23: note: MATRIX: The right-hand operand is a 2×1 matrix.
1263    20 | PRINT ({1, 2} >= {1; 2}).
1264       |                  ^~~~~~
1265
1266 ({1, 1; 2, 2} <= {1, 2; 1, 2})
1267   1  1
1268   0  1
1269
1270 ({1, 1; 2, 2} <= 2)
1271   1  1
1272   1  1
1273
1274 (1 <= {1, 2; 1, 2})
1275   1  1
1276   1  1
1277
1278 matrix.sps:25.8-25.23: error: MATRIX: The operands of <= must have the same
1279 dimensions or one must be a scalar.
1280    25 | PRINT ({1, 2} <= {1; 2}).
1281       |        ^~~~~~~~~~~~~~~~
1282
1283 matrix.sps:25.8-25.13: note: MATRIX: The left-hand operand is a 1×2 matrix.
1284    25 | PRINT ({1, 2} <= {1; 2}).
1285       |        ^~~~~~
1286
1287 matrix.sps:25.18-25.23: note: MATRIX: The right-hand operand is a 2×1 matrix.
1288    25 | PRINT ({1, 2} <= {1; 2}).
1289       |                  ^~~~~~
1290
1291 ({1, 1; 2, 2} = {1, 2; 1, 2})
1292   1  0
1293   0  1
1294
1295 ({1, 1; 2, 2} = 2)
1296   0  0
1297   1  1
1298
1299 (1 = {1, 2; 1, 2})
1300   1  0
1301   1  0
1302
1303 matrix.sps:30.8-30.22: error: MATRIX: The operands of = must have the same
1304 dimensions or one must be a scalar.
1305    30 | PRINT ({1, 2} = {1; 2}).
1306       |        ^~~~~~~~~~~~~~~
1307
1308 matrix.sps:30.8-30.13: note: MATRIX: The left-hand operand is a 1×2 matrix.
1309    30 | PRINT ({1, 2} = {1; 2}).
1310       |        ^~~~~~
1311
1312 matrix.sps:30.17-30.22: note: MATRIX: The right-hand operand is a 2×1 matrix.
1313    30 | PRINT ({1, 2} = {1; 2}).
1314       |                 ^~~~~~
1315 ])
1316 AT_CLEANUP
1317
1318 AT_SETUP([MATRIX - logical operators])
1319 AT_DATA([matrix.sps], [dnl
1320 MATRIX.
1321 PRINT (NOT {-1, 0, 1}).
1322
1323 PRINT ({-1, 0, 1; -1, 0, 1; -1, 0, 1} AND {-1, -1, -1; 0, 0, 0; 1, 1, 1}).
1324 PRINT ({-1, 0, 1} AND -1).
1325 PRINT ({-1, 0, 1} AND 0).
1326 PRINT ({-1, 0, 1} AND 1).
1327 PRINT ({-1, 0} AND {2; 3}).
1328
1329 PRINT ({-1, 0, 1; -1, 0, 1; -1, 0, 1} OR {-1, -1, -1; 0, 0, 0; 1, 1, 1}).
1330 PRINT ({-1, 0, 1} OR -1).
1331 PRINT ({-1, 0, 1} OR 0).
1332 PRINT ({-1, 0, 1} OR 1).
1333 PRINT ({-1, 0} OR {2; 3}).
1334
1335 PRINT ({-1, 0, 1; -1, 0, 1; -1, 0, 1} XOR {-1, -1, -1; 0, 0, 0; 1, 1, 1}).
1336 PRINT ({-1, 0, 1} XOR -1).
1337 PRINT ({-1, 0, 1} XOR 0).
1338 PRINT ({-1, 0, 1} XOR 1).
1339 PRINT ({-1, 0} XOR {2; 3}).
1340 END MATRIX.
1341 ])
1342 AT_CHECK([pspp matrix.sps], [1], [dnl
1343 (NOT {-1, 0, 1})
1344   1  1  0
1345
1346 ({-1, 0, 1; -1, 0, 1; -1, 0, 1} AND {-1, -1, -1; 0, 0, 0; 1, 1, 1})
1347   0  0  0
1348   0  0  0
1349   0  0  1
1350
1351 ({-1, 0, 1} AND -1)
1352  0 0 0
1353
1354 ({-1, 0, 1} AND 0)
1355  0 0 0
1356
1357 ({-1, 0, 1} AND 1)
1358   0  0  1
1359
1360 matrix.sps:8.8-8.25: error: MATRIX: The operands of AND must have the same
1361 dimensions or one must be a scalar.
1362     8 | PRINT ({-1, 0} AND {2; 3}).
1363       |        ^~~~~~~~~~~~~~~~~~
1364
1365 matrix.sps:8.8-8.14: note: MATRIX: The left-hand operand is a 1×2 matrix.
1366     8 | PRINT ({-1, 0} AND {2; 3}).
1367       |        ^~~~~~~
1368
1369 matrix.sps:8.20-8.25: note: MATRIX: The right-hand operand is a 2×1 matrix.
1370     8 | PRINT ({-1, 0} AND {2; 3}).
1371       |                    ^~~~~~
1372
1373 ({-1, 0, 1; -1, 0, 1; -1, 0, 1} OR {-1, -1, -1; 0, 0, 0; 1, 1, 1})
1374   0  0  1
1375   0  0  1
1376   1  1  1
1377
1378 ({-1, 0, 1} OR -1)
1379   0  0  1
1380
1381 ({-1, 0, 1} OR 0)
1382   0  0  1
1383
1384 ({-1, 0, 1} OR 1)
1385   1  1  1
1386
1387 matrix.sps:14.8-14.24: error: MATRIX: The operands of OR must have the same
1388 dimensions or one must be a scalar.
1389    14 | PRINT ({-1, 0} OR {2; 3}).
1390       |        ^~~~~~~~~~~~~~~~~
1391
1392 matrix.sps:14.8-14.14: note: MATRIX: The left-hand operand is a 1×2 matrix.
1393    14 | PRINT ({-1, 0} OR {2; 3}).
1394       |        ^~~~~~~
1395
1396 matrix.sps:14.19-14.24: note: MATRIX: The right-hand operand is a 2×1 matrix.
1397    14 | PRINT ({-1, 0} OR {2; 3}).
1398       |                   ^~~~~~
1399
1400 ({-1, 0, 1; -1, 0, 1; -1, 0, 1} XOR {-1, -1, -1; 0, 0, 0; 1, 1, 1})
1401   0  0  1
1402   0  0  1
1403   1  1  0
1404
1405 ({-1, 0, 1} XOR -1)
1406   0  0  1
1407
1408 ({-1, 0, 1} XOR 0)
1409   0  0  1
1410
1411 ({-1, 0, 1} XOR 1)
1412   1  1  0
1413
1414 matrix.sps:20.8-20.25: error: MATRIX: The operands of XOR must have the same
1415 dimensions or one must be a scalar.
1416    20 | PRINT ({-1, 0} XOR {2; 3}).
1417       |        ^~~~~~~~~~~~~~~~~~
1418
1419 matrix.sps:20.8-20.14: note: MATRIX: The left-hand operand is a 1×2 matrix.
1420    20 | PRINT ({-1, 0} XOR {2; 3}).
1421       |        ^~~~~~~
1422
1423 matrix.sps:20.20-20.25: note: MATRIX: The right-hand operand is a 2×1 matrix.
1424    20 | PRINT ({-1, 0} XOR {2; 3}).
1425       |                    ^~~~~~
1426 ])
1427 AT_CLEANUP
1428
1429 AT_SETUP([MATRIX - matrix operators])
1430 AT_DATA([matrix.sps], [dnl
1431 MATRIX.
1432 PRINT ({0, 1; 0, 0} * {0, 0; 1, 0}).
1433 PRINT ({0, 0; 1, 0} * {0, 1; 0, 0}).
1434 PRINT ({1, 2, 3; 4, 5, 6} * {7, 8; 9, 10; 11, 12}).
1435 PRINT ({3, 4, 2} * {13, 9, 7, 15; 8, 7, 4, 6; 6, 4, 0, 3}).
1436 COMPUTE m = {0, 1, 0, 0; 1, 0, 1, 0; 0, 1, 0, 1; 0, 0, 1, 0}.
1437 PRINT m**-2.
1438 PRINT m**-1.
1439 PRINT m**0.
1440 PRINT m**1.
1441 PRINT m**2.
1442 PRINT m**3.
1443 PRINT m**5.
1444 PRINT {3, 3.5; 3.2, 3.6}**-1/FORMAT F6.2.
1445
1446 PRINT ({1, 2, 3} * {1, 2}).
1447 PRINT {1, 2, 3}**2.
1448 PRINT m**{1, 2}.
1449 PRINT m**1.5.
1450 END MATRIX.
1451 ])
1452 AT_CHECK([pspp matrix.sps], [1], [dnl
1453 ({0, 1; 0, 0} * {0, 0; 1, 0})
1454   1  0
1455   0  0
1456
1457 ({0, 0; 1, 0} * {0, 1; 0, 0})
1458   0  0
1459   0  1
1460
1461 ({1, 2, 3; 4, 5, 6} * {7, 8; 9, 10; 11, 12})
1462    58   64
1463   139  154
1464
1465 ({3, 4, 2} * {13, 9, 7, 15; 8, 7, 4, 6; 6, 4, 0, 3})
1466   83  63  37  75
1467
1468 m**-2
1469   2  0 -1  0
1470   0  1  0 -1
1471  -1  0  1  0
1472   0 -1  0  2
1473
1474 m**-1
1475   0  1  0 -1
1476   1  0  0  0
1477   0  0  0  1
1478  -1  0  1  0
1479
1480 m**0
1481   1  0  0  0
1482   0  1  0  0
1483   0  0  1  0
1484   0  0  0  1
1485
1486 m**1
1487   0  1  0  0
1488   1  0  1  0
1489   0  1  0  1
1490   0  0  1  0
1491
1492 m**2
1493   1  0  1  0
1494   0  2  0  1
1495   1  0  2  0
1496   0  1  0  1
1497
1498 m**3
1499   0  2  0  1
1500   2  0  3  0
1501   0  3  0  2
1502   1  0  2  0
1503
1504 m**5
1505   0  5  0  3
1506   5  0  8  0
1507   0  8  0  5
1508   3  0  5  0
1509
1510 {3, 3.5; 3.2, 3.6}**-1
1511   -9.00   8.75
1512    8.00  -7.50
1513
1514 matrix.sps:16.8-16.25: error: MATRIX: Matrices not conformable for
1515 multiplication.
1516    16 | PRINT ({1, 2, 3} * {1, 2}).
1517       |        ^~~~~~~~~~~~~~~~~~
1518
1519 matrix.sps:16.8-16.16: note: MATRIX: The left-hand operand is a 1×3 matrix.
1520    16 | PRINT ({1, 2, 3} * {1, 2}).
1521       |        ^~~~~~~~~
1522
1523 matrix.sps:16.20-16.25: note: MATRIX: The right-hand operand is a 1×2 matrix.
1524    16 | PRINT ({1, 2, 3} * {1, 2}).
1525       |                    ^~~~~~
1526
1527 matrix.sps:17.7-17.15: error: MATRIX: Matrix exponentation with ** requires a
1528 square matrix on the left-hand size, not one with dimensions 1×3.
1529    17 | PRINT {1, 2, 3}**2.
1530       |       ^~~~~~~~~
1531
1532 matrix.sps:18.10-18.15: error: MATRIX: Matrix exponentiation with ** requires a
1533 scalar on the right-hand side, not a matrix with dimensions 1×2.
1534    18 | PRINT m**{1, 2}.
1535       |          ^~~~~~
1536
1537 matrix.sps:19.10-19.12: error: MATRIX: Exponent 1.5 in matrix exponentiation is
1538 non-integer or outside the valid range.
1539    19 | PRINT m**1.5.
1540       |          ^~~
1541 ])
1542 AT_CLEANUP
1543
1544 AT_SETUP([MATRIX - sequences and construction])
1545 AT_DATA([matrix.sps], [dnl
1546 MATRIX.
1547 PRINT {1:3:-1}.
1548 PRINT {1:3}.
1549 PRINT {1:10:2}.
1550 PRINT {1:11:2}.
1551
1552 PRINT {-1:-3}.
1553 PRINT {-1:-3:-1}.
1554 PRINT {-1:-10:-2}.
1555 PRINT {-1:-11:-2}.
1556
1557 PRINT {1:1}.
1558 PRINT {1:1:-1}.
1559
1560 PRINT {1:3:0}.
1561 PRINT {-1:-3:0}.
1562
1563 PRINT {1, 2; 3}.
1564 PRINT {{2; 5}, 3}.
1565 END MATRIX.
1566 ])
1567 AT_CHECK([pspp matrix.sps], [1], [dnl
1568 {1:3:-1}
1569
1570 {1:3}
1571   1  2  3
1572
1573 {1:10:2}
1574   1  3  5  7  9
1575
1576 {1:11:2}
1577    1   3   5   7   9  11
1578
1579 {-1:-3}
1580
1581 {-1:-3:-1}
1582  -1 -2 -3
1583
1584 {-1:-10:-2}
1585  -1 -3 -5 -7 -9
1586
1587 {-1:-11:-2}
1588   -1  -3  -5  -7  -9 -11
1589
1590 {1:1}
1591   1
1592
1593 {1:1:-1}
1594   1
1595
1596 matrix.sps:15.12: error: MATRIX: The increment operand to : must be nonzero.
1597    15 | PRINT {1:3:0}.
1598       |            ^
1599
1600 matrix.sps:16.14: error: MATRIX: The increment operand to : must be nonzero.
1601    16 | PRINT {-1:-3:0}.
1602       |              ^
1603
1604 matrix.sps:18.7-18.15: error: MATRIX: This expression tries to vertically join
1605 matrices with differing numbers of columns.
1606    18 | PRINT {1, 2; 3}.
1607       |       ^~~~~~~~~
1608
1609 matrix.sps:18.8-18.11: note: MATRIX: This operand is a 1×2 matrix.
1610    18 | PRINT {1, 2; 3}.
1611       |        ^~~~
1612
1613 matrix.sps:18.14: note: MATRIX: This operand is a 1×1 matrix.
1614    18 | PRINT {1, 2; 3}.
1615       |              ^
1616
1617 matrix.sps:19.7-19.17: error: MATRIX: This expression tries to horizontally
1618 join matrices with differing numbers of rows.
1619    19 | PRINT {{2; 5}, 3}.
1620       |       ^~~~~~~~~~~
1621
1622 matrix.sps:19.8-19.13: note: MATRIX: This operand is a 2×1 matrix.
1623    19 | PRINT {{2; 5}, 3}.
1624       |        ^~~~~~
1625
1626 matrix.sps:19.16: note: MATRIX: This operand is a 1×1 matrix.
1627    19 | PRINT {{2; 5}, 3}.
1628       |                ^
1629 ])
1630 AT_CLEANUP
1631
1632 AT_SETUP([MATRIX - comments])
1633 AT_DATA([matrix.sps], [dnl
1634 MATRIX.
1635 * Comment one.
1636 PRINT (1+2).
1637 COMMENT Comment two.
1638 PRINT (3+4).
1639 END MATRIX.
1640 ])
1641 AT_CHECK([pspp matrix.sps], [0], [dnl
1642 (1+2)
1643   3
1644
1645 (3+4)
1646   7
1647 ])
1648 AT_CLEANUP
1649
1650 AT_SETUP([MATRIX - string matrices])
1651 AT_DATA([matrix.sps], [dnl
1652 MATRIX.
1653 COMPUTE m={'This is', 'a string', 'matrix', 'including', 'some', 'long strings'}.
1654 PRINT m/FORMAT=A8.
1655 END MATRIX.
1656 ])
1657 AT_CHECK([pspp matrix.sps], [0], [dnl
1658 m
1659  This is a string matrix includin some long str
1660 ])
1661 AT_CLEANUP
1662
1663 AT_SETUP([MATRIX - ABS ALL ANY ARSIN ARTAN])
1664 AT_DATA([matrix.sps], [dnl
1665 MATRIX.
1666 PRINT ABS({-1, 0, 1}).
1667
1668 PRINT ALL({0, 0, 0}).
1669 PRINT ALL({-1, 1}).
1670 PRINT ALL({-1, 0, 1}).
1671
1672 PRINT ANY({0, 0, 0}).
1673 PRINT ANY({-1, 1}).
1674 PRINT ANY({-1, 0, 1}).
1675
1676 PRINT ARSIN({-1, 0, 1})/FORMAT=F5.2.
1677
1678 PRINT ARTAN({-5, -1, 0, 1, 5})/FORMAT=F5.2.
1679 END MATRIX.
1680 ])
1681 AT_CHECK([pspp matrix.sps], [0], [dnl
1682 ABS({-1, 0, 1})
1683   1  0  1
1684
1685 ALL({0, 0, 0})
1686  0
1687
1688 ALL({-1, 1})
1689   1
1690
1691 ALL({-1, 0, 1})
1692  0
1693
1694 ANY({0, 0, 0})
1695  0
1696
1697 ANY({-1, 1})
1698   1
1699
1700 ANY({-1, 0, 1})
1701   1
1702
1703 ARSIN({-1, 0, 1})
1704  -1.57   .00  1.57
1705
1706 ARTAN({-5, -1, 0, 1, 5})
1707  -1.37  -.79   .00   .79  1.37
1708 ])
1709 AT_CLEANUP
1710
1711 AT_SETUP([MATRIX - BLOCK CHOL CMAX CMIN COS])
1712 AT_DATA([matrix.sps], [dnl
1713 MATRIX.
1714 PRINT BLOCK({1, 2; 3, 4}, 5, {7; 8; 9}, {10, 11}).
1715
1716 COMPUTE b=CHOL({4, 12, -16; 12, 37, -43; -16, -43, 98}).
1717 PRINT b.
1718 PRINT (T(b)*b).
1719
1720 PRINT CMAX({9, 3, 4; 5, 8, 6; 7, 4, 11}).
1721
1722 PRINT CMIN({9, 3, 4; 5, 8, 6; 7, 4, 11}).
1723
1724 PRINT COS({0.785, 1.57; 3.14, 1.57 + 3.14}) /FORMAT=F5.2.
1725
1726 END MATRIX.
1727 ])
1728 AT_CHECK([pspp matrix.sps], [0], [dnl
1729 BLOCK({1, 2; 3, 4}, 5, {7; 8; 9}, {10, 11})
1730    1   2   0   0   0   0
1731    3   4   0   0   0   0
1732    0   0   5   0   0   0
1733    0   0   0   7   0   0
1734    0   0   0   8   0   0
1735    0   0   0   9   0   0
1736    0   0   0   0  10  11
1737
1738 b
1739   2  6 -8
1740   0  1  5
1741   0  0  3
1742
1743 (T(b)*b)
1744    4  12 -16
1745   12  37 -43
1746  -16 -43  98
1747
1748 CMAX({9, 3, 4; 5, 8, 6; 7, 4, 11})
1749    9   8  11
1750
1751 CMIN({9, 3, 4; 5, 8, 6; 7, 4, 11})
1752   5  3  4
1753
1754 COS({0.785, 1.57; 3.14, 1.57 + 3.14})
1755    .71   .00
1756  -1.00   .00
1757 ])
1758 AT_CLEANUP
1759
1760 AT_SETUP([MATRIX - CSSQ CSUM DESIGN DET DIAG])
1761 AT_DATA([matrix.sps], [dnl
1762 MATRIX.
1763 PRINT CSSQ({1, 2, 3; 4, 5, 6; 7, 8, 9}).
1764 PRINT CSUM({1, 2, 3; 4, 5, 6; 7, 8, 9}).
1765 PRINT DESIGN({1, 2, 0; 2, 1, 0; 3, 0, 1}).
1766 PRINT DESIGN({1, 2, 0; 2, 2, 0; 3, 2, 1}).
1767 PRINT DET({1, 2, 3; 4, 5, 6; 7, 8, 9}) /FORMAT F4.1.
1768 PRINT DIAG({1, 2, 3, 4; 4, 5, 6, 7; 7, 8, 9, 10}).
1769 END MATRIX.
1770 ])
1771 AT_CHECK([pspp matrix.sps], [0], [dnl
1772 CSSQ({1, 2, 3; 4, 5, 6; 7, 8, 9})
1773    66   93  126
1774
1775 CSUM({1, 2, 3; 4, 5, 6; 7, 8, 9})
1776   12  15  18
1777
1778 DESIGN({1, 2, 0; 2, 1, 0; 3, 0, 1})
1779   1  0  0  0  0  1  1  0
1780   0  1  0  0  1  0  1  0
1781   0  0  1  1  0  0  0  1
1782
1783 warning: Column 2 in DESIGN argument has constant value.
1784
1785 DESIGN({1, 2, 0; 2, 2, 0; 3, 2, 1})
1786   1  0  0  1  0
1787   0  1  0  1  0
1788   0  0  1  0  1
1789
1790 DET({1, 2, 3; 4, 5, 6; 7, 8, 9})
1791    .0
1792
1793 DIAG({1, 2, 3, 4; 4, 5, 6, 7; 7, 8, 9, 10})
1794   1
1795   5
1796   9
1797 ])
1798 AT_CLEANUP
1799
1800 AT_SETUP([MATRIX - EVAL EXP GINV GRADE GSCH])
1801 AT_DATA([matrix.sps], [dnl
1802 MATRIX.
1803 PRINT EVAL({2, 0, 0; 0, 3, 4; 0, 4, 9})/FORMAT=F5.2.
1804
1805 PRINT EXP({2, 3; 4, 5})/FORMAT F5.2.
1806
1807 PRINT GINV({1, 2})/FORMAT F5.2.
1808 COMPUTE a={1, 2, 3; 4, 5, 6; 7, 8, 9}.
1809 COMPUTE g=GINV(a).
1810 PRINT (a*g*a)/FORMAT F5.2.
1811
1812 PRINT GRADE({1, 0, 3; 3, 1, 2; 3, 0, 5}).
1813 COMPUTE x={26, 690, 323, 208, 671, 818, 732, 711, 585, 792}.
1814 COMPUTE asort=x.
1815 COMPUTE asort(GRADE(asort))=asort.
1816 PRINT asort.
1817 COMPUTE dsort=x.
1818 COMPUTE dsort(GRADE(-dsort))=dsort.
1819 PRINT dsort.
1820
1821 PRINT (GSCH({3, 2; 1, 2}) * SQRT(10))/FORMAT F5.2.
1822 PRINT (GSCH({0, 3, 6, 2; 0, 1, 2, 2}) * SQRT(10))/FORMAT F5.2.
1823 PRINT GSCH({0; 0}).
1824 PRINT GSCH({0, 0, 0; 0, 0, 0}).
1825 END MATRIX.
1826 ])
1827 AT_CHECK([pspp matrix.sps], [1], [dnl
1828 EVAL({2, 0, 0; 0, 3, 4; 0, 4, 9})
1829  11.00
1830   2.00
1831   1.00
1832
1833 EXP({2, 3; 4, 5})
1834   7.39 20.09
1835  54.60 148.4
1836
1837 GINV({1, 2})
1838    .20
1839    .40
1840
1841 (a*g*a)
1842   1.00  2.00  3.00
1843   4.00  5.00  6.00
1844   7.00  8.00  9.00
1845
1846 GRADE({1, 0, 3; 3, 1, 2; 3, 0, 5})
1847   3  1  6
1848   7  4  5
1849   8  2  9
1850
1851 asort
1852    26  208  323  585  671  690  711  732  792  818
1853
1854 dsort
1855   818  792  732  711  690  671  585  323  208   26
1856
1857 (GSCH({3, 2; 1, 2}) * SQRT(10))
1858   3.00 -1.00
1859   1.00  3.00
1860
1861 (GSCH({0, 3, 6, 2; 0, 1, 2, 2}) * SQRT(10))
1862   3.00 -1.00
1863   1.00  3.00
1864
1865 matrix.sps:22.12-22.17: error: MATRIX: GSCH requires its argument to have at
1866 least as many columns as rows, but it has dimensions 2×1.
1867    22 | PRINT GSCH({0; 0}).
1868       |            ^~~~~~
1869
1870 matrix.sps:23.12-23.29: error: MATRIX: 2×3 argument to GSCH contains only 0
1871 linearly independent columns.
1872    23 | PRINT GSCH({0, 0, 0; 0, 0, 0}).
1873       |            ^~~~~~~~~~~~~~~~~~
1874 ])
1875 AT_CLEANUP
1876
1877 AT_SETUP([MATRIX - IDENT INV KRONEKER LG10 LN])
1878 AT_DATA([matrix.sps], [dnl
1879 MATRIX.
1880 PRINT IDENT(1).
1881 PRINT IDENT(2).
1882 PRINT IDENT(3,5).
1883 PRINT IDENT(5,3).
1884
1885 PRINT INV({3, 3.5; 3.2, 3.6})/FORMAT F8.2.
1886 PRINT INV({4, 7; 2, 6})/FORMAT F8.2.
1887 PRINT (INV({4, -2, 1; 5, 0, 3; -1, 2, 6})*52)/FORMAT F8.2.
1888
1889 PRINT KRONEKER({1, 2; 3, 4}, {0, 5; 6, 7}).
1890
1891 PRINT LG10({1, 10, 100, 1000}).
1892
1893 PRINT LN({1, 2; 3, 4})/FORMAT F5.2.
1894 PRINT LN(0).
1895 END MATRIX.
1896 ])
1897 AT_CHECK([pspp matrix.sps], [1], [dnl
1898 IDENT(1)
1899   1
1900
1901 IDENT(2)
1902   1  0
1903   0  1
1904
1905 IDENT(3,5)
1906   1  0  0  0  0
1907   0  1  0  0  0
1908   0  0  1  0  0
1909
1910 IDENT(5,3)
1911   1  0  0
1912   0  1  0
1913   0  0  1
1914   0  0  0
1915   0  0  0
1916
1917 INV({3, 3.5; 3.2, 3.6})
1918     -9.00     8.75
1919      8.00    -7.50
1920
1921 INV({4, 7; 2, 6})
1922       .60     -.70
1923      -.20      .40
1924
1925 (INV({4, -2, 1; 5, 0, 3; -1, 2, 6})*52)
1926     -6.00    14.00    -6.00
1927    -33.00    25.00    -7.00
1928     10.00    -6.00    10.00
1929
1930 KRONEKER({1, 2; 3, 4}, {0, 5; 6, 7})
1931    0   5   0  10
1932    6   7  12  14
1933    0  15   0  20
1934   18  21  24  28
1935
1936 LG10({1, 10, 100, 1000})
1937   0  1  2  3
1938
1939 LN({1, 2; 3, 4})
1940    .00   .69
1941   1.10  1.39
1942
1943 matrix.sps:16.7-16.11: error: MATRIX: Argument 1 to matrix function LN must be
1944 greater than 0.
1945    16 | PRINT LN(0).
1946       |       ^~~~~
1947
1948 matrix.sps:16.10: note: MATRIX: Argument 1 is 0.
1949    16 | PRINT LN(0).
1950       |          ^
1951 ])
1952 AT_CLEANUP
1953
1954 AT_SETUP([MATRIX - MAGIC])
1955 AT_DATA([matrix.sps], [dnl
1956 MATRIX.
1957
1958 LOOP n=3 to 10.
1959     COMPUTE m=MAGIC(n).
1960     COMPUTE total=n*(n**2 + 1) / 2.
1961     COMPUTE tb={MSUM(DIAG(T(m))), CSUM(m), MSUM(DIAG(m))} - total.
1962     COMPUTE lr=RSUM(m) - total.
1963     PRINT {tb; lr, m, lr; tb}/FORMAT F4.0.
1964 END LOOP.
1965 END MATRIX.
1966 ])
1967 AT_CHECK([pspp matrix.sps], [0], [dnl
1968 {tb; lr, m, lr; tb}
1969     0    0    0    0    0
1970     0    8    1    6    0
1971     0    3    5    7    0
1972     0    4    9    2    0
1973     0    0    0    0    0
1974 {tb; lr, m, lr; tb}
1975     0    0    0    0    0    0
1976     0    1    5   12   16    0
1977     0   15   11    6    2    0
1978     0   14    8    9    3    0
1979     0    4   10    7   13    0
1980     0    0    0    0    0    0
1981 {tb; lr, m, lr; tb}
1982     0    0    0    0    0    0    0
1983     0   17   24    1    8   15    0
1984     0   23    5    7   14   16    0
1985     0    4    6   13   20   22    0
1986     0   10   12   19   21    3    0
1987     0   11   18   25    2    9    0
1988     0    0    0    0    0    0    0
1989 {tb; lr, m, lr; tb}
1990     0    0    0    0    0    0    0    0
1991     0    1    5    9   28   32   36    0
1992     0   35   30   27   10    7    2    0
1993     0   24   14   22   18   17   16    0
1994     0   13   23   15   19   20   21    0
1995     0   34   31   26   11    6    3    0
1996     0    4    8   12   25   29   33    0
1997     0    0    0    0    0    0    0    0
1998 {tb; lr, m, lr; tb}
1999     0    0    0    0    0    0    0    0    0
2000     0   30   39   48    1   10   19   28    0
2001     0   38   47    7    9   18   27   29    0
2002     0   46    6    8   17   26   35   37    0
2003     0    5   14   16   25   34   36   45    0
2004     0   13   15   24   33   42   44    4    0
2005     0   21   23   32   41   43    3   12    0
2006     0   22   31   40   49    2   11   20    0
2007     0    0    0    0    0    0    0    0    0
2008 {tb; lr, m, lr; tb}
2009     0    0    0    0    0    0    0    0    0    0
2010     0    1    9   17   25   40   48   56   64    0
2011     0   63   55   47   39   26   18   10    2    0
2012     0    3   11   19   27   38   46   54   62    0
2013     0   61   53   45   37   28   20   12    4    0
2014     0   60   52   44   32   33   21   13    5    0
2015     0    6   14   22   30   35   43   51   59    0
2016     0   58   50   42   34   31   23   15    7    0
2017     0    8   16   24   36   29   41   49   57    0
2018     0    0    0    0    0    0    0    0    0    0
2019 {tb; lr, m, lr; tb}
2020     0    0    0    0    0    0    0    0    0    0    0
2021     0   47   58   69   80    1   12   23   34   45    0
2022     0   57   68   79    9   11   22   33   44   46    0
2023     0   67   78    8   10   21   32   43   54   56    0
2024     0   77    7   18   20   31   42   53   55   66    0
2025     0    6   17   19   30   41   52   63   65   76    0
2026     0   16   27   29   40   51   62   64   75    5    0
2027     0   26   28   39   50   61   72   74    4   15    0
2028     0   36   38   49   60   71   73    3   14   25    0
2029     0   37   48   59   70   81    2   13   24   35    0
2030     0    0    0    0    0    0    0    0    0    0    0
2031 {tb; lr, m, lr; tb}
2032     0    0    0    0    0    0    0    0    0    0    0    0
2033     0    1    9   17   25   33   68   76   84   92  100    0
2034     0   99   91   83   75   67   34   26   18   10    2    0
2035     0    3   11   19   27   35   66   74   82   90   98    0
2036     0   97   89   81   72   65   36   29   20   12    4    0
2037     0   60   42   58   44   56   50   49   53   47   46    0
2038     0   41   59   43   57   45   51   52   48   54   55    0
2039     0   96   88   80   73   64   37   28   21   13    5    0
2040     0    6   14   22   30   38   63   71   79   87   95    0
2041     0   94   86   78   70   62   39   31   23   15    7    0
2042     0    8   16   24   32   40   61   69   77   85   93    0
2043     0    0    0    0    0    0    0    0    0    0    0    0
2044 ])
2045 AT_CLEANUP
2046
2047 AT_SETUP([MATRIX - MAKE MDIAG MMAX MMIN MOD])
2048 AT_DATA([matrix.sps], [dnl
2049 MATRIX.
2050 PRINT MAKE(1, 2, 3).
2051 PRINT MAKE(2, 1, 4).
2052 PRINT MAKE(2, 3, 5).
2053
2054 PRINT MDIAG({1, 2, 3, 4}).
2055 PRINT MDIAG({1; 2; 3; 4}).
2056 PRINT MDIAG({1, 2; 3, 4}).
2057
2058 PRINT MMAX({55, 44; 66, 11}).
2059
2060 PRINT MMIN({55, 44; 66, 11}).
2061
2062 PRINT MOD({5, 4, 3, 2, 1, 0}, 3).
2063 PRINT MOD({5, 4, 3, 2, 1, 0}, -3).
2064 PRINT MOD({-5, -4, -3, -2, -1, 0}, 3).
2065 PRINT MOD({-5, -4, -3, -2, -1, 0}, -3).
2066 PRINT MOD({5, 4, 3, 2, 1, 0}, 1.5) /FORMAT F5.1.
2067 PRINT MOD({5, 4, 3, 2, 1, 0}, 0).
2068 END MATRIX.
2069 ])
2070 AT_CHECK([pspp matrix.sps], [1], [dnl
2071 MAKE(1, 2, 3)
2072   3  3
2073
2074 MAKE(2, 1, 4)
2075   4
2076   4
2077
2078 MAKE(2, 3, 5)
2079   5  5  5
2080   5  5  5
2081
2082 MDIAG({1, 2, 3, 4})
2083   1  0  0  0
2084   0  2  0  0
2085   0  0  3  0
2086   0  0  0  4
2087
2088 MDIAG({1; 2; 3; 4})
2089   1  0  0  0
2090   0  2  0  0
2091   0  0  3  0
2092   0  0  0  4
2093
2094 matrix.sps:8.13-8.24: error: MATRIX: Function MDIAG argument 1 must be a
2095 vector, not a 2×2 matrix.
2096     8 | PRINT MDIAG({1, 2; 3, 4}).
2097       |             ^~~~~~~~~~~~
2098
2099 MMAX({55, 44; 66, 11})
2100   66
2101
2102 MMIN({55, 44; 66, 11})
2103   11
2104
2105 MOD({5, 4, 3, 2, 1, 0}, 3)
2106   2  1  0  2  1  0
2107
2108 MOD({5, 4, 3, 2, 1, 0}, -3)
2109   2  1  0  2  1  0
2110
2111 MOD({-5, -4, -3, -2, -1, 0}, 3)
2112  -2 -1  0 -2 -1  0
2113
2114 MOD({-5, -4, -3, -2, -1, 0}, -3)
2115  -2 -1  0 -2 -1  0
2116
2117 MOD({5, 4, 3, 2, 1, 0}, 1.5)
2118     .5   1.0    .0    .5   1.0    .0
2119
2120 matrix.sps:19.7-19.32: error: MATRIX: Argument 2 to matrix function MOD must
2121 not be equal to 0.
2122    19 | PRINT MOD({5, 4, 3, 2, 1, 0}, 0).
2123       |       ^~~~~~~~~~~~~~~~~~~~~~~~~~
2124 ])
2125 AT_CLEANUP
2126
2127 AT_SETUP([MATRIX - MSSQ MSUM NCOL NROW RANK])
2128 AT_DATA([matrix.sps], [dnl
2129 MATRIX.
2130 PRINT MSSQ({1, 0, 1; -2, -3, 1; 3, 3, 0}).
2131
2132 PRINT MSUM({1, 0, 1; -2, -3, 1; 3, 3, 0}).
2133
2134 PRINT NCOL({1, 0; -2, -3; 3, 3}).
2135
2136 PRINT NROW({1, 0; -2, -3; 3, 3}).
2137
2138 PRINT RANK({1, 0, 1; -2, -3, 1; 3, 3, 0}).
2139 PRINT RANK({1, 1, 0, 2; -1, -1, 0, -2}).
2140 PRINT RANK({1, -1; 1, -1; 0, 0; 2, -2}).
2141 PRINT RANK({1, 2, 1; -2, -3, 1; 3, 5, 0}).
2142 PRINT RANK({1, 0, 2; 2, 1, 0; 3, 2, 1}).
2143 END MATRIX.
2144 ])
2145 AT_CHECK([pspp matrix.sps], [0], [dnl
2146 MSSQ({1, 0, 1; -2, -3, 1; 3, 3, 0})
2147   34
2148
2149 MSUM({1, 0, 1; -2, -3, 1; 3, 3, 0})
2150   4
2151
2152 NCOL({1, 0; -2, -3; 3, 3})
2153   2
2154
2155 NROW({1, 0; -2, -3; 3, 3})
2156   3
2157
2158 RANK({1, 0, 1; -2, -3, 1; 3, 3, 0})
2159   2
2160
2161 RANK({1, 1, 0, 2; -1, -1, 0, -2})
2162   1
2163
2164 RANK({1, -1; 1, -1; 0, 0; 2, -2})
2165   1
2166
2167 RANK({1, 2, 1; -2, -3, 1; 3, 5, 0})
2168   2
2169
2170 RANK({1, 0, 2; 2, 1, 0; 3, 2, 1})
2171   3
2172 ])
2173 AT_CLEANUP
2174
2175 AT_SETUP([MATRIX - RESHAPE RMAX RMIN RND RNKORDER])
2176 AT_DATA([matrix.sps], [dnl
2177 MATRIX.
2178 PRINT RESHAPE(1:12, 1, 12).
2179 PRINT RESHAPE(1:12, 2, 6).
2180 PRINT RESHAPE(1:12, 3, 4).
2181 PRINT RESHAPE(1:12, 4, 3).
2182 PRINT RESHAPE(1:12, 6, 2).
2183 PRINT RESHAPE(1:12, 12, 1).
2184
2185 PRINT RMAX({1, 0, 1; -2, -3, 1; 3, 3, 0}).
2186
2187 PRINT RMIN({1, 0, 1; -2, -3, 1; 3, 3, 0}).
2188
2189 PRINT RND({-1.6, -1.5, -1.4;
2190            -.6, -.5, -.4;
2191            .4, .5, .6;
2192            1.4, 1.5, 1.6})/FORMAT F5.1.
2193
2194 PRINT RNKORDER({1, 0, 3; 3, 1, 2; 3, 0, 5}) /FORMAT F5.1.
2195 END MATRIX.
2196 ])
2197 AT_CHECK([pspp matrix.sps], [0], [dnl
2198 RESHAPE(1:12, 1, 12)
2199    1   2   3   4   5   6   7   8   9  10  11  12
2200
2201 RESHAPE(1:12, 2, 6)
2202    1   2   3   4   5   6
2203    7   8   9  10  11  12
2204
2205 RESHAPE(1:12, 3, 4)
2206    1   2   3   4
2207    5   6   7   8
2208    9  10  11  12
2209
2210 RESHAPE(1:12, 4, 3)
2211    1   2   3
2212    4   5   6
2213    7   8   9
2214   10  11  12
2215
2216 RESHAPE(1:12, 6, 2)
2217    1   2
2218    3   4
2219    5   6
2220    7   8
2221    9  10
2222   11  12
2223
2224 RESHAPE(1:12, 12, 1)
2225    1
2226    2
2227    3
2228    4
2229    5
2230    6
2231    7
2232    8
2233    9
2234   10
2235   11
2236   12
2237
2238 RMAX({1, 0, 1; -2, -3, 1; 3, 3, 0})
2239   1
2240   1
2241   3
2242
2243 RMIN({1, 0, 1; -2, -3, 1; 3, 3, 0})
2244   0
2245  -3
2246   0
2247
2248 RND({-1.6, -1.5, -1.4;
2249            -.6, -.5, -.4;
2250            .4, .5, .6;
2251            1.4, 1.5, 1.6})
2252   -2.0  -2.0  -1.0
2253   -1.0    .0    .0
2254     .0    .0   1.0
2255    1.0   2.0   2.0
2256
2257 RNKORDER({1, 0, 3; 3, 1, 2; 3, 0, 5})
2258    3.5   1.5   7.0
2259    7.0   3.5   5.0
2260    7.0   1.5   9.0
2261 ])
2262 AT_CLEANUP
2263
2264 AT_SETUP([MATRIX - RSSQ RSUM SIN SOLVE SQRT])
2265 AT_DATA([matrix.sps], [dnl
2266 MATRIX.
2267 PRINT RSSQ({1, 2, 3; 4, 5, 6; 7, 8, 9}).
2268 PRINT RSUM({1, 2, 3; 4, 5, 6; 7, 8, 9}).
2269
2270 PRINT SIN({0, .78, 1.57, 2.35, 3.14}) /FORMAT F5.2.
2271
2272 PRINT SOLVE({2, 3; 4, 9}, {6, 2; 15, 5}) /FORMAT=F6.2.
2273 PRINT SOLVE({1, 3, -2; 3, 5, 6; 2, 4, 3}, {5; 7; 8}) /FORMAT=F6.2.
2274 PRINT SOLVE({2, 1, -1; -3, -1, 2; -2, 1, 2}, {8; -11; -3}) /FORMAT=F6.2.
2275 PRINT SOLVE({1, 2; 3, 4}, {1, 2}).
2276
2277 PRINT SQRT({0, 1, 2, 3, 4, 9, 81}) /FORMAT=F5.2.
2278 PRINT SQRT(-1).
2279 END MATRIX.
2280 ])
2281 AT_CHECK([pspp matrix.sps], [1], [dnl
2282 RSSQ({1, 2, 3; 4, 5, 6; 7, 8, 9})
2283    14
2284    77
2285   194
2286
2287 RSUM({1, 2, 3; 4, 5, 6; 7, 8, 9})
2288    6
2289   15
2290   24
2291
2292 SIN({0, .78, 1.57, 2.35, 3.14})
2293    .00   .70  1.00   .71   .00
2294
2295 SOLVE({2, 3; 4, 9}, {6, 2; 15, 5})
2296    1.50    .50
2297    1.00    .33
2298
2299 SOLVE({1, 3, -2; 3, 5, 6; 2, 4, 3}, {5; 7; 8})
2300  -15.00
2301    8.00
2302    2.00
2303
2304 SOLVE({2, 1, -1; -3, -1, 2; -2, 1, 2}, {8; -11; -3})
2305    2.00
2306    3.00
2307   -1.00
2308
2309 matrix.sps:10.7-10.33: error: MATRIX: SOLVE arguments must have the same number
2310 of rows.
2311    10 | PRINT SOLVE({1, 2; 3, 4}, {1, 2}).
2312       |       ^~~~~~~~~~~~~~~~~~~~~~~~~~~
2313
2314 matrix.sps:10.13-10.24: note: MATRIX: Argument 1 has dimensions 2×2.
2315    10 | PRINT SOLVE({1, 2; 3, 4}, {1, 2}).
2316       |             ^~~~~~~~~~~~
2317
2318 matrix.sps:10.27-10.32: note: MATRIX: Argument 2 has dimensions 1×2.
2319    10 | PRINT SOLVE({1, 2; 3, 4}, {1, 2}).
2320       |                           ^~~~~~
2321
2322 SQRT({0, 1, 2, 3, 4, 9, 81})
2323    .00  1.00  1.41  1.73  2.00  3.00  9.00
2324
2325 matrix.sps:13.7-13.14: error: MATRIX: Argument 1 to matrix function SQRT must
2326 be greater than or equal to 0.
2327    13 | PRINT SQRT(-1).
2328       |       ^~~~~~~~
2329
2330 matrix.sps:13.12-13.13: note: MATRIX: Argument 1 is -1.
2331    13 | PRINT SQRT(-1).
2332       |            ^~
2333 ])
2334 AT_CLEANUP
2335
2336 AT_SETUP([MATRIX - SSCP SVAL SWEEP TRACE TRANSPOS TRUNC])
2337 AT_DATA([matrix.sps], [dnl
2338 MATRIX.
2339 COMPUTE m={1, 2, 3; 4, 5, 6}
2340 COMPUTE sscp1=SSCP(m).
2341 COMPUTE sscp2=T(m)*m.
2342 PRINT sscp1.
2343 PRINT (sscp1 <> sscp2).
2344
2345 PRINT SVAL({1, 1; 0, 0})/FORMAT F5.2.
2346 PRINT SVAL({1, 0, 1; 0, 1, 1; 0, 0, 0})/FORMAT F5.2.
2347 PRINT SVAL({1, 0, 0, 0, 2; 0, 0, 3, 0, 0; 0, 0, 0, 0, 0; 0, 2, 0, 0, 0})
2348     /FORMAT F5.2.
2349 PRINT SVAL({2, 4; 1, 3; 0, 0; 0, 0})/FORMAT F5.2.
2350
2351 COMPUTE s0 = {6, 12, 0, 12; 12, 28, 0, 25; 0, 0, 6, 2; 12, 25, 2, 28}.
2352 PRINT SWEEP(s0, 1)/FORMAT F5.2.
2353 PRINT SWEEP(SWEEP(s0, 1), 2)/FORMAT F5.2.
2354 PRINT SWEEP(SWEEP(SWEEP(s0, 1), 2), 3)/FORMAT F5.2.
2355
2356 COMPUTE s1 = {6, 12, 0, 12; 12, 0, 0, 25; 0, 0, 6, 2; 12, 25, 2, 28}.
2357 PRINT SWEEP(s1, 2).
2358
2359 COMPUTE s2 = {0, 1, 2; 3, 4, 5; 6, 7, 8}.
2360 PRINT SWEEP(s2, 1).
2361 PRINT SWEEP(s2, 2).
2362 PRINT SWEEP(s2, 3).
2363
2364 PRINT TRACE(s0).
2365
2366 PRINT T(s0).
2367 PRINT TRANSPOS(s0).
2368 PRINT ALL(T(T(s0)) = s0).
2369
2370 PRINT TRUNC(SVAL({2, 4; 1, 3; 0, 0; 0, 0})).
2371 PRINT TRUNC(-SVAL({2, 4; 1, 3; 0, 0; 0, 0})).
2372 END MATRIX.
2373 ])
2374 AT_CHECK([pspp matrix.sps], [0], [dnl
2375 sscp1
2376   17  22  27
2377   22  29  36
2378   27  36  45
2379
2380 (sscp1 <> sscp2)
2381  0 0 0
2382  0 0 0
2383  0 0 0
2384
2385 SVAL({1, 1; 0, 0})
2386   1.41
2387    .00
2388
2389 SVAL({1, 0, 1; 0, 1, 1; 0, 0, 0})
2390   1.73
2391   1.00
2392    .00
2393
2394 SVAL({1, 0, 0, 0, 2; 0, 0, 3, 0, 0; 0, 0, 0, 0, 0; 0, 2, 0, 0, 0})
2395   3.00
2396   2.24
2397   2.00
2398    .00
2399
2400 SVAL({2, 4; 1, 3; 0, 0; 0, 0})
2401   5.46
2402    .37
2403
2404 SWEEP(s0, 1)
2405    .17  2.00   .00  2.00
2406  -2.00  4.00   .00  1.00
2407    .00   .00  6.00  2.00
2408  -2.00  1.00  2.00  4.00
2409
2410 SWEEP(SWEEP(s0, 1), 2)
2411   1.17  -.50   .00  1.50
2412   -.50   .25   .00   .25
2413    .00   .00  6.00  2.00
2414  -1.50  -.25  2.00  3.75
2415
2416 SWEEP(SWEEP(SWEEP(s0, 1), 2), 3)
2417   1.17  -.50   .00  1.50
2418   -.50   .25   .00   .25
2419    .00   .00   .17   .33
2420  -1.50  -.25  -.33  3.08
2421
2422 SWEEP(s1, 2)
2423    6   0   0  12
2424    0   0   0   0
2425    0   0   6   2
2426   12   0   2  28
2427
2428 SWEEP(s2, 1)
2429   0  0  0
2430   0  4  5
2431   0  7  8
2432
2433 SWEEP(s2, 2)
2434   -.7500000000  -.2500000000   .7500000000
2435    .7500000000   .2500000000  1.2500000000
2436    .7500000000 -1.7500000000  -.7500000000
2437
2438 SWEEP(s2, 3)
2439  -1.5000000000  -.7500000000  -.2500000000
2440   -.7500000000  -.3750000000  -.6250000000
2441    .7500000000   .8750000000   .1250000000
2442
2443 TRACE(s0)
2444   68
2445
2446 T(s0)
2447    6  12   0  12
2448   12  28   0  25
2449    0   0   6   2
2450   12  25   2  28
2451
2452 TRANSPOS(s0)
2453    6  12   0  12
2454   12  28   0  25
2455    0   0   6   2
2456   12  25   2  28
2457
2458 ALL(T(T(s0)) = s0)
2459   1
2460
2461 TRUNC(SVAL({2, 4; 1, 3; 0, 0; 0, 0}))
2462   5
2463   0
2464
2465 TRUNC(-SVAL({2, 4; 1, 3; 0, 0; 0, 0}))
2466  -5
2467   0
2468 ])
2469 AT_CLEANUP
2470
2471 AT_SETUP([MATRIX - UNIFORM])
2472 AT_DATA([matrix.sps], [dnl
2473 SET SEED=10.
2474 MATRIX.
2475 PRINT (UNIFORM(4, 5)*10)/FORMAT F5.2.
2476 END MATRIX.
2477 ])
2478 AT_CHECK([pspp matrix.sps], [0], [dnl
2479 (UNIFORM(4, 5)*10)
2480   7.71  2.99   .21  4.95  6.34
2481   4.43  7.49  8.32  4.99  5.83
2482   2.25   .25  1.98  7.09  7.61
2483   2.66  1.69  2.64   .88  1.50
2484 ])
2485 AT_CLEANUP
2486
2487 AT_SETUP([MATRIX - invalid function arguments])
2488 AT_DATA([matrix.sps], [dnl
2489 MATRIX.
2490 COMPUTE x=MOD({1,2,3},{4,5,6}).
2491 COMPUTE x=MDIAG({1, 2; 3, 4}).
2492 COMPUTE x=ARSIN(2).
2493 COMPUTE x=ARSIN({1, 1; -1, 2}).
2494 COMPUTE x=CDF.UNIFORM(2,1,1).
2495 COMPUTE x=CDF.UNIFORM(1,2,1).
2496 COMPUTE x=CDF.UNIFORM({1,2},1,1).
2497 COMPUTE x=MAGIC(2).
2498 END MATRIX.
2499 ])
2500 AT_CHECK([pspp matrix.sps], [1], [dnl
2501 matrix.sps:2.23-2.29: error: MATRIX: Function MOD argument 2 must be a scalar,
2502 not a 1×3 matrix.
2503     2 | COMPUTE x=MOD({1,2,3},{4,5,6}).
2504       |                       ^~~~~~~
2505
2506 matrix.sps:3.17-3.28: error: MATRIX: Function MDIAG argument 1 must be a
2507 vector, not a 2×2 matrix.
2508     3 | COMPUTE x=MDIAG({1, 2; 3, 4}).
2509       |                 ^~~~~~~~~~~~
2510
2511 matrix.sps:4.17: error: MATRIX: Argument 1 to matrix function ARSIN is 2, which
2512 is outside the valid range [[-1,1]].
2513     4 | COMPUTE x=ARSIN(2).
2514       |                 ^
2515
2516 matrix.sps:5.17-5.29: error: MATRIX: Row 2, column 2 of argument 1 to matrix
2517 function ARSIN is 2, which is outside the valid range [[-1,1]].
2518     5 | COMPUTE x=ARSIN({1, 1; -1, 2}).
2519       |                 ^~~~~~~~~~~~~
2520
2521 error: Argument 1 to matrix function CDF.UNIFORM must be less than or equal to
2522 argument 3.
2523
2524 matrix.sps:6.23: note: MATRIX: Argument 1 is 2.
2525     6 | COMPUTE x=CDF.UNIFORM(2,1,1).
2526       |                       ^
2527
2528 matrix.sps:6.27: note: MATRIX: Argument 3 is 1.
2529     6 | COMPUTE x=CDF.UNIFORM(2,1,1).
2530       |                           ^
2531
2532 error: Argument 2 to matrix function CDF.UNIFORM must be less than or equal to
2533 argument 3.
2534
2535 matrix.sps:7.25: note: MATRIX: Argument 2 is 2.
2536     7 | COMPUTE x=CDF.UNIFORM(1,2,1).
2537       |                         ^
2538
2539 matrix.sps:7.27: note: MATRIX: Argument 3 is 1.
2540     7 | COMPUTE x=CDF.UNIFORM(1,2,1).
2541       |                           ^
2542
2543 error: Argument 1 to matrix function CDF.UNIFORM must be less than or equal to
2544 argument 3.
2545
2546 matrix.sps:8.23-8.27: note: MATRIX: Row 1, column 2 of argument 1 is 2.
2547     8 | COMPUTE x=CDF.UNIFORM({1,2},1,1).
2548       |                       ^~~~~
2549
2550 matrix.sps:8.31: note: MATRIX: Argument 3 is 1.
2551     8 | COMPUTE x=CDF.UNIFORM({1,2},1,1).
2552       |                               ^
2553
2554 matrix.sps:9.11-9.18: error: MATRIX: Argument 1 to matrix function MAGIC must
2555 be greater than or equal to 3.
2556     9 | COMPUTE x=MAGIC(2).
2557       |           ^~~~~~~~
2558
2559 matrix.sps:9.17: note: MATRIX: Argument 1 is 2.
2560     9 | COMPUTE x=MAGIC(2).
2561       |                 ^
2562 ])
2563 AT_CLEANUP
2564
2565 AT_SETUP([MATRIX - invalid number function arguments])
2566 AT_DATA([matrix.sps], [dnl
2567 MATRIX.
2568 COMPUTE x=ABS().
2569 COMPUTE x=ABS(1,2).
2570 COMPUTE x=KRONEKER(1,2,3).
2571 COMPUTE x=IDENT().
2572 COMPUTE x=IDENT(1,2,3).
2573 COMPUTE x=BLOCK().
2574 END MATRIX.
2575 ])
2576 AT_CHECK([pspp matrix.sps], [1], [dnl
2577 matrix.sps:2: error: COMPUTE: Matrix function ABS requires 1 argument.
2578
2579 matrix.sps:3: error: COMPUTE: Matrix function ABS requires 1 argument.
2580
2581 matrix.sps:4: error: COMPUTE: Matrix function KRONEKER requires 2 arguments.
2582
2583 matrix.sps:5: error: COMPUTE: Matrix function IDENT requires 1 or 2 arguments,
2584 but 0 were provided.
2585
2586 matrix.sps:6: error: COMPUTE: Matrix function IDENT requires 1 or 2 arguments,
2587 but 3 were provided.
2588
2589 matrix.sps:7: error: COMPUTE: Matrix function BLOCK requires at least one
2590 argument.
2591 ])
2592 AT_CLEANUP
2593
2594 AT_SETUP([MATRIX - CALL SETDIAG])
2595 AT_DATA([matrix.sps], [dnl
2596 MATRIX.
2597 COMPUTE x={1, 2, 3; 4, 5, 6; 7, 8, 9}.
2598
2599 COMPUTE x1=x.
2600 CALL SETDIAG(x1, 10).
2601 PRINT x1.
2602
2603 COMPUTE x2=x.
2604 CALL SETDIAG(x2, {10, 11}).
2605 PRINT x2.
2606
2607 COMPUTE x3=x.
2608 CALL SETDIAG(x3, {10, 11, 12}).
2609 PRINT x3.
2610
2611 COMPUTE x4=x.
2612 CALL SETDIAG(x4, {10, 11, 12, 13}).
2613 PRINT x4.
2614
2615 COMPUTE x5=x.
2616 CALL SETDIAG(x5, {10, 11; 12, 13}).
2617 PRINT x5.
2618
2619 END MATRIX.
2620 ])
2621 AT_CHECK([pspp matrix.sps], [1], [dnl
2622 x1
2623   10   2   3
2624    4  10   6
2625    7   8  10
2626
2627 x2
2628   10   2   3
2629    4  11   6
2630    7   8   9
2631
2632 x3
2633   10   2   3
2634    4  11   6
2635    7   8  12
2636
2637 x4
2638   10   2   3
2639    4  11   6
2640    7   8  12
2641
2642 matrix.sps:21.18-21.33: error: MATRIX: SETDIAG argument 2 must be a scalar or a
2643 vector, not a 2×2 matrix.
2644    21 | CALL SETDIAG(x5, {10, 11; 12, 13}).
2645       |                  ^~~~~~~~~~~~~~~~
2646
2647 x5
2648   1  2  3
2649   4  5  6
2650   7  8  9
2651 ])
2652 AT_CLEANUP
2653
2654 dnl I have some doubts about the correctness of the results below.
2655 AT_SETUP([MATRIX - CALL EIGEN])
2656 AT_DATA([matrix.sps], [dnl
2657 MATRIX.
2658 CALL EIGEN({1, 0; 0, 1}, evec, eval).
2659 PRINT evec.
2660 PRINT eval.
2661
2662 CALL EIGEN({3, 2, 4; 2, 0, 2; 4, 2, 3}, evec2, eval2).
2663 PRINT evec2.
2664 PRINT eval2.
2665 END MATRIX.
2666 ])
2667 AT_CHECK([pspp matrix.sps], [0], [dnl
2668 evec
2669   1  0
2670   0  1
2671
2672 eval
2673   1
2674   1
2675
2676 evec2
2677   -.6666666667   .0000000000   .7453559925
2678   -.3333333333  -.8944271910  -.2981423970
2679   -.6666666667   .4472135955  -.5962847940
2680
2681 eval2
2682   8.0000000000
2683  -1.0000000000
2684  -1.0000000000
2685 ])
2686 AT_CLEANUP
2687
2688 AT_SETUP([MATRIX - CALL SVD])
2689 AT_DATA([matrix.sps], [dnl
2690 MATRIX.
2691 CALL SVD({3, 2, 2; 2, 3, -2}, u, s, v).
2692 PRINT (u * s * T(v))/FORMAT F5.1.
2693
2694 CALL SVD({2, 4; 1, 3; 0, 0; 0, 0}, u, s, v).
2695 PRINT (u*s*T(v))/FORMAT F5.1.
2696
2697 CALL SVD({-3, 1; 6, -2; 6, -2}, u, s, v).
2698 PRINT (u*s*T(v))/FORMAT F5.1.
2699 END MATRIX.
2700 ])
2701 AT_CHECK([pspp matrix.sps], [0], [dnl
2702 (u * s * T(v))
2703    3.0   2.0   2.0
2704    2.0   3.0  -2.0
2705
2706 (u*s*T(v))
2707    2.0   4.0
2708    1.0   3.0
2709     .0    .0
2710     .0    .0
2711
2712 (u*s*T(v))
2713   -3.0   1.0
2714    6.0  -2.0
2715    6.0  -2.0
2716 ])
2717 AT_CLEANUP
2718
2719 AT_SETUP([MATRIX - PRINT])
2720 AT_DATA([matrix.sps], [dnl
2721 MATRIX.
2722 PRINT/TITLE="title 1".
2723 PRINT/SPACE=2/TITLE="title 2".
2724
2725 COMPUTE m={1, 2, 3; 3, 4, 5; 6, 7, 8}.
2726 PRINT m/RLABELS=123, a b c, long name.
2727 PRINT m/RNAMES={'123', 'a b c', 'long name'}.
2728 PRINT m/CLABELS=col1, col2, long column name.
2729 PRINT m/CNAMES={'col1', 'col2', 'long column name'}.
2730 PRINT m/RLABELS=123, a b c, long name
2731        /CLABELS=col1, col2, long column name.
2732 PRINT m/RNAMES={'123', 'a b c', 'long name'}
2733        /CNAMES={'col1', 'col2', 'long column name'}.
2734 PRINT {123e10, 456e10, 500}.
2735 END MATRIX.
2736 ])
2737
2738 AT_DATA([matrix-tables.sps], [dnl
2739 SET MDISPLAY=TABLES.
2740 INCLUDE 'matrix.sps'.
2741 ])
2742
2743 AT_CHECK([pspp matrix.sps], [0], [dnl
2744 title 1
2745
2746
2747
2748 title 2
2749
2750 m
2751 123       1  2  3
2752 a b c     3  4  5
2753 long nam  6  7  8
2754
2755 m
2756 123       1  2  3
2757 a b c     3  4  5
2758 long nam  6  7  8
2759
2760 m
2761      col1     col2 long col
2762         1        2        3
2763         3        4        5
2764         6        7        8
2765
2766 m
2767      col1     col2 long col
2768         1        2        3
2769         3        4        5
2770         6        7        8
2771
2772 m
2773              col1     col2 long col
2774 123             1        2        3
2775 a b c           3        4        5
2776 long nam        6        7        8
2777
2778 m
2779              col1     col2 long col
2780 123             1        2        3
2781 a b c           3        4        5
2782 long nam        6        7        8
2783
2784 {123e10, 456e10, 500}
2785   10 ** 12   X
2786   1.2300000000  4.5600000000   .0000000005
2787 ])
2788
2789 AT_CHECK([pspp matrix-tables.sps], [0], [dnl
2790 title 1
2791
2792
2793
2794 title 2
2795
2796         m
2797 +---------+-----+
2798 |123      |1 2 3|
2799 |a b c    |3 4 5|
2800 |long name|6 7 8|
2801 +---------+-----+
2802
2803         m
2804 +--------+-----+
2805 |123     |1 2 3|
2806 |a b c   |3 4 5|
2807 |long nam|6 7 8|
2808 +--------+-----+
2809
2810               m
2811 +----+----+----------------+
2812 |col1|col2|long column name|
2813 +----+----+----------------+
2814 |   1|   2|               3|
2815 |   3|   4|               5|
2816 |   6|   7|               8|
2817 +----+----+----------------+
2818
2819           m
2820 +----+----+--------+
2821 |col1|col2|long col|
2822 +----+----+--------+
2823 |   1|   2|       3|
2824 |   3|   4|       5|
2825 |   6|   7|       8|
2826 +----+----+--------+
2827
2828                    m
2829 +---------+----+----+----------------+
2830 |         |col1|col2|long column name|
2831 +---------+----+----+----------------+
2832 |123      |   1|   2|               3|
2833 |a b c    |   3|   4|               5|
2834 |long name|   6|   7|               8|
2835 +---------+----+----+----------------+
2836
2837               m
2838 +--------+----+----+--------+
2839 |        |col1|col2|long col|
2840 +--------+----+----+--------+
2841 |123     |   1|   2|       3|
2842 |a b c   |   3|   4|       5|
2843 |long nam|   6|   7|       8|
2844 +--------+----+----+--------+
2845
2846               {123e10, 456e10, 500}
2847 +----------------------------------------------+
2848 |1.2300000000[[a]] 4.5600000000[[a]] .0000000005[[a]]|
2849 +----------------------------------------------+
2850 a. × 10**12
2851 ])
2852 AT_CLEANUP
2853
2854 AT_SETUP([MATRIX - DO IF])
2855 AT_DATA([matrix.sps], [dnl
2856 MATRIX.
2857 DO IF 1.
2858 PRINT/TITLE '1'.
2859 END IF.
2860
2861 DO IF 0.
2862 PRINT/TITLE '2'.
2863 ELSE IF 1.
2864 PRINT/TITLE '3'.
2865 END IF.
2866
2867 DO IF -1.
2868 PRINT/TITLE '4'.
2869 ELSE IF 0.
2870 PRINT/TITLE '5'.
2871 ELSE.
2872 PRINT/TITLE '6'.
2873 END IF.
2874
2875 DO IF {1, 2}.
2876 END IF.
2877
2878 DO IF 0.
2879 ELSE IF {}.
2880 END IF.
2881 END MATRIX.
2882 ])
2883 AT_CHECK([pspp matrix.sps], [1], [dnl
2884 1
2885
2886 3
2887
2888 6
2889
2890 matrix.sps:20.7-20.12: error: MATRIX: Expression for DO IF must evaluate to
2891 scalar, not a 1×2 matrix.
2892    20 | DO IF {1, 2}.
2893       |       ^~~~~~
2894
2895 matrix.sps:24.9-24.10: error: MATRIX: Expression for ELSE IF must evaluate to
2896 scalar, not a 0×0 matrix.
2897    24 | ELSE IF {}.
2898       |         ^~
2899 ])
2900 AT_CLEANUP
2901
2902 AT_SETUP([MATRIX - unbounded LOOP])
2903 AT_DATA([matrix.sps], [dnl
2904 MATRIX.
2905 * Truly unbounded loop.
2906 COMPUTE x=0.
2907 COMPUTE y={}.
2908 LOOP.
2909 COMPUTE x=x+1.
2910 COMPUTE y={y, x}.
2911 END LOOP.
2912 PRINT x.
2913 PRINT y.
2914
2915 * Unbounded loop terminates with BREAK.
2916 COMPUTE x=0.
2917 COMPUTE y={}.
2918 LOOP.
2919 COMPUTE x=x+1.
2920 COMPUTE y={y, x}.
2921 DO IF x >= 20.
2922     BREAK.
2923 END IF.
2924 END LOOP.
2925 PRINT x.
2926 PRINT y.
2927
2928 END MATRIX.
2929 ])
2930 AT_CHECK([pspp matrix.sps], [0], [dnl
2931 x
2932   40
2933
2934 y
2935    1   2   3   4   5   6   7   8   9  10  11  12  13  14  15  16  17  18  19
2936 20  21  22  23  24  25  26  27  28  29  30  31  32  33  34  35  36  37  38  39
2937 40
2938
2939 x
2940   20
2941
2942 y
2943    1   2   3   4   5   6   7   8   9  10  11  12  13  14  15  16  17  18  19
2944 20
2945 ])
2946 AT_CLEANUP
2947
2948 AT_SETUP([MATRIX - indexed or conditional LOOP])
2949 AT_DATA([matrix.sps], [dnl
2950 MATRIX.
2951 * Indexed loop terminates based on index.
2952 COMPUTE y={}.
2953 LOOP x=1 TO 20.
2954 COMPUTE y={y, x}.
2955 END LOOP.
2956 PRINT x.
2957 PRINT y.
2958
2959 * Indexed loop terminates based on MXLOOPS.
2960 COMPUTE y={}.
2961 LOOP x=1 TO 50.
2962 COMPUTE y={y, x}.
2963 END LOOP.
2964 PRINT x.
2965 PRINT y.
2966
2967 * Indexed loop terminates with BREAK.
2968 COMPUTE y={}.
2969 LOOP x=1 TO 50.
2970 COMPUTE y={y, x}.
2971 DO IF x >= 20.
2972     BREAK.
2973 END IF.
2974 END LOOP.
2975 PRINT x.
2976 PRINT y.
2977
2978 * Indexed loop terminates with top IF.
2979 COMPUTE y={}.
2980 LOOP x=1 TO 50 IF NCOL(y) < 15.
2981 COMPUTE y={y, x}.
2982 END LOOP.
2983 PRINT x.
2984 PRINT y.
2985
2986 * Indexed loop terminates with bottom IF.
2987 COMPUTE y={}.
2988 LOOP x=1 TO 50.
2989 COMPUTE y={y, x}.
2990 END LOOP IF NCOL(y) >= 22.
2991 PRINT x.
2992 PRINT y.
2993
2994 * Index behavior.
2995 COMPUTE indexing={
2996     1, 10, 1;
2997     1, 10, 2;
2998     1, 10, 3;
2999     1, 10, -1;
3000     1, 10, 0;
3001     10, 1, -1;
3002     10, 1, -2;
3003     10, 1, -3;
3004     10, 1, 1;
3005     10, 1, 0
3006 }.
3007 LOOP i=1 TO NROW(indexing).
3008     COMPUTE y={}.
3009     LOOP j=indexing(i, 1) TO indexing(i, 2) BY indexing(i, 3).
3010         COMPUTE y={y, j}.
3011     END LOOP.
3012     PRINT {indexing(i, :), y}.
3013 END LOOP.
3014
3015 LOOP i={} TO 5.
3016 END LOOP.
3017
3018 LOOP i=5 TO {}.
3019 END LOOP.
3020
3021 LOOP i=5 TO 8 BY {}.
3022 END LOOP.
3023
3024 LOOP IF {}.
3025 END LOOP.
3026
3027 LOOP.
3028 END LOOP IF {}.
3029
3030 LOOP i=1e100 to 1e200.
3031 END LOOP.
3032 END MATRIX.
3033 ])
3034 AT_CHECK([pspp matrix.sps], [1], [dnl
3035 x
3036   20
3037
3038 y
3039    1   2   3   4   5   6   7   8   9  10  11  12  13  14  15  16  17  18  19
3040 20
3041
3042 x
3043   40
3044
3045 y
3046    1   2   3   4   5   6   7   8   9  10  11  12  13  14  15  16  17  18  19
3047 20  21  22  23  24  25  26  27  28  29  30  31  32  33  34  35  36  37  38  39
3048 40
3049
3050 x
3051   20
3052
3053 y
3054    1   2   3   4   5   6   7   8   9  10  11  12  13  14  15  16  17  18  19
3055 20
3056
3057 x
3058   16
3059
3060 y
3061    1   2   3   4   5   6   7   8   9  10  11  12  13  14  15
3062
3063 x
3064   22
3065
3066 y
3067    1   2   3   4   5   6   7   8   9  10  11  12  13  14  15  16  17  18  19
3068 20  21  22
3069
3070 {indexing(i, :), y}
3071    1  10   1   1   2   3   4   5   6   7   8   9  10
3072 {indexing(i, :), y}
3073    1  10   2   1   3   5   7   9
3074 {indexing(i, :), y}
3075    1  10   3   1   4   7  10
3076 {indexing(i, :), y}
3077    1  10  -1
3078 {indexing(i, :), y}
3079    1  10   0
3080 {indexing(i, :), y}
3081   10   1  -1  10   9   8   7   6   5   4   3   2   1
3082 {indexing(i, :), y}
3083   10   1  -2  10   8   6   4   2
3084 {indexing(i, :), y}
3085   10   1  -3  10   7   4   1
3086 {indexing(i, :), y}
3087   10   1   1
3088 {indexing(i, :), y}
3089   10   1   0
3090
3091 matrix.sps:66.8-66.9: error: MATRIX: Expression for LOOP must evaluate to
3092 scalar, not a 0×0 matrix.
3093    66 | LOOP i={} TO 5.
3094       |        ^~
3095
3096 matrix.sps:69.13-69.14: error: MATRIX: Expression for TO must evaluate to
3097 scalar, not a 0×0 matrix.
3098    69 | LOOP i=5 TO {}.
3099       |             ^~
3100
3101 matrix.sps:72.18-72.19: error: MATRIX: Expression for BY must evaluate to
3102 scalar, not a 0×0 matrix.
3103    72 | LOOP i=5 TO 8 BY {}.
3104       |                  ^~
3105
3106 matrix.sps:75.9-75.10: error: MATRIX: Expression for LOOP IF must evaluate to
3107 scalar, not a 0×0 matrix.
3108    75 | LOOP IF {}.
3109       |         ^~
3110
3111 matrix.sps:79.13-79.14: error: MATRIX: Expression for END LOOP IF must evaluate
3112 to scalar, not a 0×0 matrix.
3113    79 | END LOOP IF {}.
3114       |             ^~
3115
3116 matrix.sps:81.8-81.12: error: MATRIX: Expression for LOOP is outside the
3117 integer range.
3118    81 | LOOP i=1e100 to 1e200.
3119       |        ^~~~~
3120 ])
3121 AT_CLEANUP
3122
3123 AT_SETUP([MATRIX - BREAK outside LOOP])
3124 AT_DATA([matrix.sps], [dnl
3125 MATRIX.
3126 BREAK.
3127 END MATRIX.
3128 ])
3129 AT_CHECK([pspp matrix.sps], [1], [dnl
3130 matrix.sps:2.1-2.5: error: BREAK: BREAK not inside LOOP.
3131     2 | BREAK.
3132       | ^~~~~
3133 ])
3134 AT_CLEANUP
3135
3136 AT_SETUP([MATRIX - READ])
3137 AT_DATA([matrix.txt], [dnl
3138 9
3139 8
3140 7
3141 6
3142 1 2 3
3143 4 5 6
3144 7 8 9
3145 10 11 12,13
3146 14, 15 ,16 , 17
3147 18
3148 19
3149 20 21 22 23
3150     12        34
3151 5    6
3152     78        89
3153 10   11
3154 $1 $2 3
3155 4 $5 6
3156 $1   $2   $3   4
3157    $5$6      $78
3158 1% 2% 3% 4
3159   56%  7%8
3160 abcdefghijkl
3161 ABCDEFGHIJKL
3162 ])
3163 AT_DATA([matrix2.txt], [dnl
3164 2, 3, 5, 7
3165 11, 13, 17, 19
3166 23, 29, 31, 37
3167 41, 43, 47, 53
3168 ])
3169 AT_DATA([matrix3.txt], [dnl
3170 1 5
3171 3 1 2 3
3172 5 6 -1 2 5 1
3173 2 8 9
3174 3 1 3 2
3175 ])
3176 AT_DATA([matrix.sps], [dnl
3177 MATRIX.
3178 READ x/FILE='matrix.txt'/SIZE=4/FIELD=1 TO 1.
3179 PRINT x.
3180 READ x/FILE='matrix.txt'/SIZE={3,3}/FIELD=1 TO 80.
3181 PRINT x.
3182 READ x/SIZE={2,4}/FIELD=1 TO 80.
3183 PRINT x.
3184 READ x(:,2)/FILE='matrix.txt'/FIELD=1 TO 80.
3185 PRINT x.
3186 READ x(1,:)/SIZE={1,4}/FIELD=1 TO 80.
3187 PRINT x.
3188
3189 READ x/SIZE={2,6}/FIELD=1 TO 20 BY 5.
3190 PRINT x.
3191 READ x/SIZE={2,3}/FIELD=1 TO 20/FORMAT=DOLLAR.
3192 PRINT x.
3193 READ x/SIZE={2,4}/FIELD=1 TO 20/FORMAT=DOLLAR5.1.
3194 PRINT x.
3195 READ x/SIZE={2,4}/FIELD=1 TO 12/FORMAT='4PCT'.
3196 PRINT x.
3197 READ x/SIZE={2,4}/FIELD=1 TO 12/FORMAT='4A'.
3198 PRINT x/FORMAT=A3.
3199
3200 COMPUTE y={}.
3201 LOOP IF NOT EOF('matrix2.txt').
3202 READ x/FILE='matrix2.txt'/SIZE={1,4}/FIELD=1 TO 80.
3203 COMPUTE y={y; x}.
3204 END LOOP.
3205 PRINT y.
3206
3207 COMPUTE m = MAKE(5, 5, 0).
3208 LOOP i = 1 TO 5.
3209 READ count /FILE='matrix3.txt' /FIELD=1 TO 1 /SIZE=1.
3210 READ m(i, 1:count) /FIELD=3 TO 100 /REREAD.
3211 END LOOP.
3212 PRINT m.
3213 END MATRIX.
3214 ])
3215 AT_CHECK([pspp matrix.sps], [0], [dnl
3216 x
3217   9
3218   8
3219   7
3220   6
3221
3222 x
3223   1  2  3
3224   4  5  6
3225   7  8  9
3226
3227 x
3228   10  11  12  13
3229   14  15  16  17
3230
3231 x
3232   10  18  12  13
3233   14  19  16  17
3234
3235 x
3236   20  21  22  23
3237   14  19  16  17
3238
3239 x
3240    1   2   3   4   5   6
3241    7   8   8   9  10  11
3242
3243 x
3244   1  2  3
3245   4  5  6
3246
3247 x
3248   1  2  3  4
3249   5  6  7  8
3250
3251 x
3252   1  2  3  4
3253   5  6  7  8
3254
3255 x
3256  abc def ghi jkl
3257  ABC DEF GHI JKL
3258
3259 y
3260    2   3   5   7
3261   11  13  17  19
3262   23  29  31  37
3263   41  43  47  53
3264
3265 m
3266   5  0  0  0  0
3267   1  2  3  0  0
3268   6 -1  2  5  1
3269   8  9  0  0  0
3270   1  3  2  0  0
3271 ])
3272 AT_CLEANUP
3273
3274 AT_SETUP([MATRIX - READ - negative])
3275 AT_DATA([matrix.sps], [dnl
3276 MATRIX.
3277 READ !.
3278 READ x/FILE=!.
3279 READ x/ENCODING=!.
3280 READ x/FIELD=!.
3281 READ x/FIELD=1 !.
3282 READ x/FIELD=1 TO !.
3283 READ x/FIELD=1 TO 0.
3284 READ x/FIELD=1 TO 10 BY !.
3285 READ x/FIELD=1 TO 10 BY 6.
3286 READ x/SIZE=!.
3287 READ x/MODE=!.
3288 READ x/FORMAT=!.
3289 READ x/FORMAT=F8.2/FORMAT=F8.2.
3290 READ x/FORMAT='5XYZZY'.
3291 READ x/FORMAT=XYZZY.
3292 READ x/!.
3293 READ x.
3294 READ x/FIELD=1 TO 10.
3295 READ x/FIELD=1 TO 10/SIZE={1,2}.
3296 READ x/FIELD=1 TO 10/SIZE={1,2}/FILE='xyzzy.txt'/FORMAT='15F'.
3297 READ x/FIELD=1 TO 10 BY 2/SIZE={1,2}/FILE='xyzzy.txt'/FORMAT=F5.
3298 READ x/FIELD=1 TO 10 BY 2/SIZE={1,2}/FILE='xyzzy.txt'/FORMAT='2F'.
3299 READ x/FIELD=1 TO 10/SIZE={1,2;3,4}/FILE='matrix.txt'.
3300 READ x/FIELD=1 TO 10/SIZE={1,2,3}/FILE='matrix.txt'.
3301 READ x/FIELD=1 TO 10/SIZE={-1}/FILE='matrix.txt'.
3302 COMPUTE x={1,2,3}.
3303 READ x(:,:)/FIELD=1 TO 10/SIZE={2,2}/FILE='matrix.txt'.
3304 READ x/FIELD=1 TO 10/SIZE={1,3}/FILE='matrix.txt'/MODE=SYMMETRIC.
3305 READ x/FIELD=1 TO 10/SIZE=2/FILE='matrix.txt'.
3306 END MATRIX.
3307 ])
3308 AT_DATA([matrix.txt], [dnl
3309 xyzzy
3310 .
3311 ])
3312 AT_CHECK([pspp matrix.sps], [1], [dnl
3313 matrix.sps:2.6: error: READ: Syntax error expecting identifier.
3314     2 | READ !.
3315       |      ^
3316
3317 matrix.sps:3.13: error: READ: Syntax error expecting a file name or handle
3318 name.
3319     3 | READ x/FILE=!.
3320       |             ^
3321
3322 matrix.sps:4.17: error: READ: Syntax error expecting string.
3323     4 | READ x/ENCODING=!.
3324       |                 ^
3325
3326 matrix.sps:5.14: error: READ: Syntax error expecting positive integer for
3327 FIELD.
3328     5 | READ x/FIELD=!.
3329       |              ^
3330
3331 matrix.sps:6.16: error: READ: Syntax error expecting `TO'.
3332     6 | READ x/FIELD=1 !.
3333       |                ^
3334
3335 matrix.sps:7.19: error: READ: Syntax error expecting positive integer for TO.
3336     7 | READ x/FIELD=1 TO !.
3337       |                   ^
3338
3339 matrix.sps:8.19: error: READ: Syntax error expecting positive integer for TO.
3340     8 | READ x/FIELD=1 TO 0.
3341       |                   ^
3342
3343 matrix.sps:9.25: error: READ: Syntax error expecting integer between 1 and 10
3344 for BY.
3345     9 | READ x/FIELD=1 TO 10 BY !.
3346       |                         ^
3347
3348 matrix.sps:10.14-10.25: error: READ: Field width 6 does not evenly divide
3349 record width 10.
3350    10 | READ x/FIELD=1 TO 10 BY 6.
3351       |              ^~~~~~~~~~~~
3352
3353 matrix.sps:10.14-10.20: note: READ: This syntax designates the record width.
3354    10 | READ x/FIELD=1 TO 10 BY 6.
3355       |              ^~~~~~~
3356
3357 matrix.sps:10.25: note: READ: This syntax specifies the field width.
3358    10 | READ x/FIELD=1 TO 10 BY 6.
3359       |                         ^
3360
3361 matrix.sps:11.13: error: READ: Syntax error.
3362    11 | READ x/SIZE=!.
3363       |             ^
3364
3365 matrix.sps:12.13: error: READ: Syntax error expecting RECTANGULAR or SYMMETRIC.
3366    12 | READ x/MODE=!.
3367       |             ^
3368
3369 matrix.sps:13.15: error: READ: Syntax error expecting identifier.
3370    13 | READ x/FORMAT=!.
3371       |               ^
3372
3373 matrix.sps:14.20-14.25: error: READ: Subcommand FORMAT may only be specified
3374 once.
3375    14 | READ x/FORMAT=F8.2/FORMAT=F8.2.
3376       |                    ^~~~~~
3377
3378 matrix.sps:15.15-15.22: error: READ: Unknown format XYZZY.
3379    15 | READ x/FORMAT='5XYZZY'.
3380       |               ^~~~~~~~
3381
3382 matrix.sps:16.15-16.19: error: READ: Unknown format type `XYZZY'.
3383    16 | READ x/FORMAT=XYZZY.
3384       |               ^~~~~
3385
3386 matrix.sps:17.8: error: READ: Syntax error expecting FILE, FIELD, MODE, REREAD,
3387 or FORMAT.
3388    17 | READ x/!.
3389       |        ^
3390
3391 matrix.sps:18: error: READ: Required subcommand FIELD was not specified.
3392
3393 matrix.sps:19: error: READ: SIZE is required for reading data into a full
3394 matrix (as opposed to a submatrix).
3395
3396 matrix.sps:19.6: note: READ: This expression designates a full matrix.
3397    19 | READ x/FIELD=1 TO 10.
3398       |      ^
3399
3400 matrix.sps:20: error: READ: Required subcommand FILE was not specified.
3401
3402 matrix.sps:21: error: READ: 15 repetitions cannot fit in record width 10.
3403
3404 matrix.sps:21.57-21.61: note: READ: This syntax designates the number of
3405 repetitions.
3406    21 | READ x/FIELD=1 TO 10/SIZE={1,2}/FILE='xyzzy.txt'/FORMAT='15F'.
3407       |                                                         ^~~~~
3408
3409 matrix.sps:21.14-21.20: note: READ: This syntax designates the record width.
3410    21 | READ x/FIELD=1 TO 10/SIZE={1,2}/FILE='xyzzy.txt'/FORMAT='15F'.
3411       |              ^~~~~~~
3412
3413 matrix.sps:22: error: READ: This command specifies two different field widths.
3414
3415 matrix.sps:22.62-22.63: note: READ: This syntax specifies field width 5.
3416    22 | READ x/FIELD=1 TO 10 BY 2/SIZE={1,2}/FILE='xyzzy.txt'/FORMAT=F5.
3417       |                                                              ^~
3418
3419 matrix.sps:22.25: note: READ: This syntax specifies field width 2.
3420    22 | READ x/FIELD=1 TO 10 BY 2/SIZE={1,2}/FILE='xyzzy.txt'/FORMAT=F5.
3421       |                         ^
3422
3423 matrix.sps:23: error: READ: This command specifies two different field widths.
3424
3425 matrix.sps:23.62-23.65: note: READ: This syntax specifies 2 repetitions.
3426    23 | READ x/FIELD=1 TO 10 BY 2/SIZE={1,2}/FILE='xyzzy.txt'/FORMAT='2F'.
3427       |                                                              ^~~~
3428
3429 matrix.sps:23.14-23.20: note: READ: This syntax designates record width 10,
3430 which divided by 2 repetitions implies field width 5.
3431    23 | READ x/FIELD=1 TO 10 BY 2/SIZE={1,2}/FILE='xyzzy.txt'/FORMAT='2F'.
3432       |              ^~~~~~~
3433
3434 matrix.sps:23.25: note: READ: This syntax specifies field width 2.
3435    23 | READ x/FIELD=1 TO 10 BY 2/SIZE={1,2}/FILE='xyzzy.txt'/FORMAT='2F'.
3436       |                         ^
3437
3438 matrix.sps:24.27-24.35: error: MATRIX: SIZE must evaluate to a scalar or a 2-
3439 element vector, not a 2×2 matrix.
3440    24 | READ x/FIELD=1 TO 10/SIZE={1,2;3,4}/FILE='matrix.txt'.
3441       |                           ^~~~~~~~~
3442
3443 matrix.sps:25.27-25.33: error: MATRIX: SIZE must evaluate to a scalar or a 2-
3444 element vector, not a 1×3 matrix.
3445    25 | READ x/FIELD=1 TO 10/SIZE={1,2,3}/FILE='matrix.txt'.
3446       |                           ^~~~~~~
3447
3448 matrix.sps:26.28-26.29: error: MATRIX: Matrix dimensions -1×1 specified on SIZE
3449 are outside valid range.
3450    26 | READ x/FIELD=1 TO 10/SIZE={-1}/FILE='matrix.txt'.
3451       |                            ^~
3452
3453 matrix.sps:28: error: MATRIX: Dimensions specified on SIZE differ from
3454 dimensions of destination submatrix.
3455
3456 matrix.sps:28.32-28.36: note: MATRIX: SIZE specifies dimensions 2×2.
3457    28 | READ x(:,:)/FIELD=1 TO 10/SIZE={2,2}/FILE='matrix.txt'.
3458       |                                ^~~~~
3459
3460 matrix.sps:28.6-28.11: note: MATRIX: Destination submatrix has dimensions 1×3.
3461    28 | READ x(:,:)/FIELD=1 TO 10/SIZE={2,2}/FILE='matrix.txt'.
3462       |      ^~~~~~
3463
3464 matrix.sps:29: error: MATRIX: Cannot read non-square 1×3 matrix using READ with
3465 MODE=SYMMETRIC.
3466
3467 matrix.txt:1.1-1.5: warning: Error reading "xyzzy" as format F for matrix row
3468 1, column 1: Field contents are not numeric.
3469
3470 matrix.txt:2.1: warning: Error reading "." as format F for matrix row 2, column
3471 1: Matrix data may not contain missing value.
3472 ])
3473 AT_CLEANUP
3474
3475 AT_SETUP([MATRIX - WRITE])
3476 AT_DATA([matrix.sps], [dnl
3477 MATRIX.
3478 WRITE {1.5, 2; 3, 4.12345}/OUTFILE='matrix.txt'/FIELD=1 TO 80.
3479 WRITE {1.5, 2; 3, 4.12345}/OUTFILE='matrix.txt'/FIELD=1 TO 5.
3480 WRITE {1, 2; 3, 4}/OUTFILE='matrix.txt'/FIELD=1 TO 80 BY 5.
3481 WRITE {1, 2; 3, 4}/OUTFILE='matrix.txt'/FIELD=1 TO 80/FORMAT=F8.2.
3482 WRITE {1, 2; 3, 4}/OUTFILE='matrix.txt'/FIELD=1 TO 80/FORMAT=E.
3483 WRITE {1, 2; 3, 4}/OUTFILE='matrix.txt'/FIELD=1 TO 10 BY 10/FORMAT=E.
3484 WRITE "abcdefhi"/OUTFILE='matrix.txt'/FIELD=1 TO 80/FORMAT=A8.
3485 WRITE "abcdefhi"/OUTFILE='matrix.txt'/FIELD=1 TO 80/FORMAT=A4.
3486 WRITE "abcdefhi"/OUTFILE='matrix.txt'/FIELD=1 TO 80/FORMAT=AHEX12.
3487 END MATRIX.
3488 ])
3489 AT_CHECK([pspp matrix.sps])
3490 AT_CHECK([cat matrix.txt], [0], [dnl
3491  1.5 2
3492  3 4.12345
3493  1.5 2
3494  3
3495  4.12345
3496      1    2
3497      3    4
3498      1.00    2.00
3499      3.00    4.00
3500  1 2
3501  3 4
3502     1.E+000
3503     2.E+000
3504     3.E+000
3505     4.E+000
3506  abcdefhi
3507  abcd
3508  616263646566
3509 ])
3510 AT_CLEANUP
3511
3512 AT_SETUP([MATRIX - WRITE - negative])
3513 AT_DATA([matrix.sps], [dnl
3514 MATRIX.
3515 WRITE !.
3516 WRITE 1/OUTFILE=!.
3517 WRITE 1/ENCODING=!.
3518 WRITE 1/FIELD=!.
3519 WRITE 1/FIELD=1 !.
3520 WRITE 1/FIELD=1 TO 0.
3521 WRITE 1/FIELD=1 TO 10 BY 20.
3522 WRITE 1/FIELD=1 TO 10 BY 6.
3523 WRITE 1/MODE=TRAPEZOIDAL.
3524 WRITE 1/FORMAT=F5/FORMAT=F5.
3525 WRITE 1/FORMAT='5ASDF'.
3526 WRITE 1/FORMAT=ASDF5.
3527 WRITE 1/!.
3528 WRITE 1.
3529 WRITE 1/FIELD=1 TO 10.
3530 WRITE 1/FIELD=1 TO 10/OUTFILE='matrix.txt'/FORMAT='15F'.
3531 WRITE 1/FIELD=1 TO 10 BY 5/OUTFILE='matrix.txt'/FORMAT='5F'.
3532 WRITE 1/FIELD=1 TO 10 BY 5/OUTFILE='matrix.txt'/FORMAT=E.
3533 WRITE 1/FIELD=1 TO 10/OUTFILE='matrix.txt'/FORMAT=A9.
3534 WRITE {1,2}/FIELD=1 TO 10/OUTFILE='matrix.txt'/MODE=TRIANGULAR.
3535 END MATRIX.
3536 ])
3537 AT_CHECK([pspp matrix.sps], [1], [dnl
3538 matrix.sps:2.7: error: WRITE: Syntax error.
3539     2 | WRITE !.
3540       |       ^
3541
3542 matrix.sps:3.17: error: WRITE: Syntax error expecting a file name or handle
3543 name.
3544     3 | WRITE 1/OUTFILE=!.
3545       |                 ^
3546
3547 matrix.sps:4.18: error: WRITE: Syntax error expecting string.
3548     4 | WRITE 1/ENCODING=!.
3549       |                  ^
3550
3551 matrix.sps:5.15: error: WRITE: Syntax error expecting positive integer for
3552 FIELD.
3553     5 | WRITE 1/FIELD=!.
3554       |               ^
3555
3556 matrix.sps:6.17: error: WRITE: Syntax error expecting `TO'.
3557     6 | WRITE 1/FIELD=1 !.
3558       |                 ^
3559
3560 matrix.sps:7.20: error: WRITE: Syntax error expecting positive integer for TO.
3561     7 | WRITE 1/FIELD=1 TO 0.
3562       |                    ^
3563
3564 matrix.sps:8.26-8.27: error: WRITE: Syntax error expecting integer between 1
3565 and 10 for BY.
3566     8 | WRITE 1/FIELD=1 TO 10 BY 20.
3567       |                          ^~
3568
3569 matrix.sps:9.15-9.26: error: WRITE: Field width 6 does not evenly divide record
3570 width 10.
3571     9 | WRITE 1/FIELD=1 TO 10 BY 6.
3572       |               ^~~~~~~~~~~~
3573
3574 matrix.sps:9.15-9.21: note: WRITE: This syntax designates the record width.
3575     9 | WRITE 1/FIELD=1 TO 10 BY 6.
3576       |               ^~~~~~~
3577
3578 matrix.sps:9.26: note: WRITE: This syntax specifies the field width.
3579     9 | WRITE 1/FIELD=1 TO 10 BY 6.
3580       |                          ^
3581
3582 matrix.sps:10.14-10.24: error: WRITE: Syntax error expecting RECTANGULAR or
3583 TRIANGULAR.
3584    10 | WRITE 1/MODE=TRAPEZOIDAL.
3585       |              ^~~~~~~~~~~
3586
3587 matrix.sps:11.19-11.24: error: WRITE: Subcommand FORMAT may only be specified
3588 once.
3589    11 | WRITE 1/FORMAT=F5/FORMAT=F5.
3590       |                   ^~~~~~
3591
3592 matrix.sps:12.16-12.22: error: WRITE: Unknown format ASDF.
3593    12 | WRITE 1/FORMAT='5ASDF'.
3594       |                ^~~~~~~
3595
3596 matrix.sps:13.16-13.20: error: WRITE: Unknown format type `ASDF'.
3597    13 | WRITE 1/FORMAT=ASDF5.
3598       |                ^~~~~
3599
3600 matrix.sps:14.9: error: WRITE: Syntax error expecting OUTFILE, FIELD, MODE,
3601 HOLD, or FORMAT.
3602    14 | WRITE 1/!.
3603       |         ^
3604
3605 matrix.sps:15: error: WRITE: Required subcommand FIELD was not specified.
3606
3607 matrix.sps:16: error: WRITE: Required subcommand OUTFILE was not specified.
3608
3609 matrix.sps:17.51-17.55: note: WRITE: This syntax designates the number of
3610 repetitions.
3611    17 | WRITE 1/FIELD=1 TO 10/OUTFILE='matrix.txt'/FORMAT='15F'.
3612       |                                                   ^~~~~
3613
3614 matrix.sps:17.15-17.21: note: WRITE: This syntax designates the record width.
3615    17 | WRITE 1/FIELD=1 TO 10/OUTFILE='matrix.txt'/FORMAT='15F'.
3616       |               ^~~~~~~
3617
3618 matrix.sps:18: error: WRITE: This command specifies two different field widths.
3619
3620 matrix.sps:18.56-18.59: note: WRITE: This syntax specifies 5 repetitions.
3621    18 | WRITE 1/FIELD=1 TO 10 BY 5/OUTFILE='matrix.txt'/FORMAT='5F'.
3622       |                                                        ^~~~
3623
3624 matrix.sps:18.15-18.21: note: WRITE: This syntax designates record width 10,
3625 which divided by 5 repetitions implies field width 2.
3626    18 | WRITE 1/FIELD=1 TO 10 BY 5/OUTFILE='matrix.txt'/FORMAT='5F'.
3627       |               ^~~~~~~
3628
3629 matrix.sps:18.26: note: WRITE: This syntax specifies field width 5.
3630    18 | WRITE 1/FIELD=1 TO 10 BY 5/OUTFILE='matrix.txt'/FORMAT='5F'.
3631       |                          ^
3632
3633 matrix.sps:19: error: WRITE: Output format E5.0 specifies width 5, but E
3634 requires a width between 6 and 40.
3635
3636 matrix.sps:20.51-20.52: error: WRITE: Format A9 is too wide for 8-byte matrix
3637 elements.
3638    20 | WRITE 1/FIELD=1 TO 10/OUTFILE='matrix.txt'/FORMAT=A9.
3639       |                                                   ^~
3640
3641 matrix.sps:21.7-21.11: error: MATRIX: WRITE with MODE=TRIANGULAR requires a
3642 square matrix but the matrix to be written has dimensions 1×2.
3643    21 | WRITE {1,2}/FIELD=1 TO 10/OUTFILE='matrix.txt'/MODE=TRIANGULAR.
3644       |       ^~~~~
3645 ])
3646 AT_CLEANUP
3647
3648 AT_SETUP([MATRIX - GET])
3649 AT_DATA([matrix.sps], [dnl
3650 DATA LIST LIST NOTABLE /a b c.
3651 MISSING VALUES a(1) b(5).
3652 BEGIN DATA.
3653 0 0 0
3654 1 2 3
3655 4 5 6
3656 7 8 .
3657 END DATA.
3658
3659 MATRIX.
3660 GET x0 /NAMES=names0.
3661 PRINT x0.
3662 PRINT names0/FORMAT=A8.
3663 END MATRIX.
3664
3665 MATRIX.
3666 GET x1 /VARIABLES=a b c /NAMES=names1 /MISSING=OMIT.
3667 PRINT x1.
3668 PRINT names1/FORMAT=A8.
3669 END MATRIX.
3670
3671 MATRIX.
3672 GET x2 /VARIABLES=a b /NAMES=names2 /MISSING=OMIT.
3673 PRINT x2.
3674 PRINT names2/FORMAT=A8.
3675 END MATRIX.
3676
3677 MATRIX.
3678 GET x3 /FILE=* /VARIABLES=a b c /NAMES=names3 /MISSING=5.
3679 PRINT x3.
3680 PRINT names3/FORMAT=A8.
3681 END MATRIX.
3682
3683 MATRIX.
3684 GET x4 /FILE=* /VARIABLES=a b /NAMES=names4 /MISSING=5.
3685 PRINT x4.
3686 PRINT names4/FORMAT=A8.
3687 END MATRIX.
3688
3689 SAVE OUTFILE='matrix.sav'.
3690 NEW FILE.
3691
3692 MATRIX.
3693 GET x5 /FILE='matrix.sav' /VARIABLES=a b c /NAMES=names5 /MISSING=ACCEPT.
3694 PRINT x5.
3695 PRINT names5/FORMAT=A8.
3696 END MATRIX.
3697
3698 MATRIX.
3699 GET x6 /FILE='matrix.sav' /VARIABLES=a b c /NAMES=names6 /MISSING=ACCEPT /SYSMIS=9.
3700 PRINT x6.
3701 PRINT names6/FORMAT=A8.
3702 END MATRIX.
3703
3704 MATRIX.
3705 GET x7 /FILE='matrix.sav' /VARIABLES=a b c /NAMES=names7 /MISSING=ACCEPT /SYSMIS=OMIT.
3706 PRINT x7.
3707 PRINT names7/FORMAT=A8.
3708 END MATRIX.
3709 ])
3710 AT_CHECK([pspp matrix.sps], [1], [dnl
3711 matrix.sps:11: error: MATRIX: Variable a in case 2 has user-missing value 1.
3712
3713 matrix.sps:12.7-12.8: error: MATRIX: Uninitialized variable x0 used in
3714 expression.
3715    12 | PRINT x0.
3716       |       ^~
3717
3718 names0
3719  a
3720  b
3721  c
3722
3723 matrix.sps:17: error: MATRIX: Variable c in case 4 is system-missing.
3724
3725 matrix.sps:18.7-18.8: error: MATRIX: Uninitialized variable x1 used in
3726 expression.
3727    18 | PRINT x1.
3728       |       ^~
3729
3730 names1
3731  a
3732  b
3733  c
3734
3735 x2
3736   0  0
3737   7  8
3738
3739 names2
3740  a
3741  b
3742
3743 matrix.sps:29: error: MATRIX: Variable c in case 4 is system-missing.
3744
3745 matrix.sps:30.7-30.8: error: MATRIX: Uninitialized variable x3 used in
3746 expression.
3747    30 | PRINT x3.
3748       |       ^~
3749
3750 names3
3751  a
3752  b
3753  c
3754
3755 x4
3756   0  0
3757   5  2
3758   4  5
3759   7  8
3760
3761 names4
3762  a
3763  b
3764
3765 matrix.sps:44: error: MATRIX: Variable c in case 4 is system-missing.
3766
3767 matrix.sps:45.7-45.8: error: MATRIX: Uninitialized variable x5 used in
3768 expression.
3769    45 | PRINT x5.
3770       |       ^~
3771
3772 names5
3773  a
3774  b
3775  c
3776
3777 x6
3778   0  0  0
3779   1  2  3
3780   4  5  6
3781   7  8  9
3782
3783 names6
3784  a
3785  b
3786  c
3787
3788 x7
3789   0  0  0
3790   1  2  3
3791   4  5  6
3792
3793 names7
3794  a
3795  b
3796  c
3797 ])
3798 AT_CLEANUP
3799
3800 AT_SETUP([MATRIX - GET - negative])
3801 AT_DATA([matrix.sps], [dnl
3802 DATA LIST LIST NOTABLE /a b c * d(a1).
3803 MISSING VALUES a(1) b(5).
3804 BEGIN DATA.
3805 0 0 0 a
3806 1 2 3 b
3807 4 5 6 b
3808 7 8 . d
3809 END DATA.
3810 SAVE OUTFILE='matrix.sav'.
3811
3812 MATRIX.
3813 GET !.
3814 GET x/VARIABLES=!.
3815 GET x/FILE=!.
3816 GET x/ENCODING=!.
3817 GET x/NAMES=!.
3818 GET x/MISSING=!.
3819 GET x/SYSMIS=!.
3820 GET x/!.
3821 GET x/VARIABLES=!.
3822 GET x/VARIABLES=x TO !.
3823 GET x/VARIABLES=x.
3824 GET x/VARIABLES=c TO a.
3825 GET x/VARIABLES=d.
3826 GET x.
3827 END MATRIX.
3828
3829 NEW FILE.
3830 MATRIX.
3831 GET x/VARIABLES=a.
3832 END MATRIX.
3833 ])
3834 AT_CHECK([pspp matrix.sps], [1], [dnl
3835 matrix.sps:12.5: error: GET: Syntax error expecting identifier.
3836    12 | GET !.
3837       |     ^
3838
3839 matrix.sps:13.17: error: GET: Syntax error expecting variable name.
3840    13 | GET x/VARIABLES=!.
3841       |                 ^
3842
3843 matrix.sps:14.12: error: GET: Syntax error expecting a file name or handle
3844 name.
3845    14 | GET x/FILE=!.
3846       |            ^
3847
3848 matrix.sps:15.16: error: GET: Syntax error expecting string.
3849    15 | GET x/ENCODING=!.
3850       |                ^
3851
3852 matrix.sps:16.13: error: GET: Syntax error expecting identifier.
3853    16 | GET x/NAMES=!.
3854       |             ^
3855
3856 matrix.sps:17.15: error: GET: Syntax error.
3857    17 | GET x/MISSING=!.
3858       |               ^
3859
3860 matrix.sps:18.14: error: GET: Syntax error.
3861    18 | GET x/SYSMIS=!.
3862       |              ^
3863
3864 matrix.sps:19.7: error: GET: Syntax error expecting FILE, VARIABLES, NAMES,
3865 MISSING, or SYSMIS.
3866    19 | GET x/!.
3867       |       ^
3868
3869 matrix.sps:20.17: error: GET: Syntax error expecting variable name.
3870    20 | GET x/VARIABLES=!.
3871       |                 ^
3872
3873 matrix.sps:21.22: error: GET: Syntax error expecting variable name.
3874    21 | GET x/VARIABLES=x TO !.
3875       |                      ^
3876
3877 matrix.sps:22.17: error: MATRIX: x is not a variable name.
3878    22 | GET x/VARIABLES=x.
3879       |                 ^
3880
3881 matrix.sps:23.17-23.22: error: MATRIX: c TO a is not valid syntax since c
3882 precedes a in the dictionary.
3883    23 | GET x/VARIABLES=c TO a.
3884       |                 ^~~~~~
3885
3886 matrix.sps:24.17: error: MATRIX: d is not a numeric variable.
3887    24 | GET x/VARIABLES=d.
3888       |                 ^
3889
3890 matrix.sps:25: error: MATRIX: Variable d is not numeric.
3891
3892 matrix.sps:30: error: MATRIX: The GET command cannot read an empty active file.
3893 ])
3894 AT_CLEANUP
3895
3896 AT_SETUP([MATRIX - SAVE])
3897 AT_DATA([matrix.sps], [dnl
3898 MATRIX.
3899 SAVE {1,2,3; 4,5,6}/OUTFILE='matrix.sav'.
3900 SAVE {7,8,9}/VARIABLES=a b c d.
3901
3902 SAVE {1,2,3}/OUTFILE='matrix2.sav'/VARIABLES=v01 TO v03.
3903 SAVE {4,5,6}/NAMES={'x', 'y', 'z', 'w'}.
3904
3905 SAVE {1,'abcd',3}/OUTFILE='matrix3.sav'/NAMES={'a', 'b', 'c'}/STRINGS=b.
3906 SAVE {4,'xyzw',6}/STRINGS=a, b.
3907 END MATRIX.
3908 ])
3909 AT_CHECK([pspp matrix.sps])
3910 AT_CHECK([pspp-convert matrix.sav matrix.csv && cat matrix.csv], [0], [dnl
3911 COL1,COL2,COL3
3912 1,2,3
3913 4,5,6
3914 7,8,9
3915 ])
3916 AT_CHECK([pspp-convert matrix2.sav matrix2.csv && cat matrix2.csv], [0], [dnl
3917 v01,v02,v03
3918 1,2,3
3919 4,5,6
3920 ])
3921 AT_CHECK([pspp-convert matrix3.sav matrix3.csv && cat matrix3.csv], [0], [dnl
3922 a,b,c
3923 1,abcd,3
3924 4,xyzw,6
3925 ])
3926 AT_CLEANUP
3927
3928 AT_SETUP([MATRIX - SAVE - inline])
3929 AT_DATA([matrix.sps], [dnl
3930 MATRIX.
3931 SAVE {1,2,3; 4,5,6}/OUTFILE=*.
3932 SAVE {7,8,9}/VARIABLES=a b c d.
3933 END MATRIX.
3934 LIST.
3935
3936 MATRIX.
3937 SAVE {1,2,3}/OUTFILE=*/VARIABLES=v01 TO v03.
3938 SAVE {4,5,6}/NAMES={'x', 'y', 'z', 'w'}.
3939 END MATRIX.
3940 LIST.
3941
3942 MATRIX.
3943 SAVE {1,'abcd',3}/OUTFILE=*/NAMES={'a', 'b', 'c'}/STRINGS=b.
3944 SAVE {4,'xyzw',6}/STRINGS=a, b.
3945 END MATRIX.
3946 LIST.
3947 ])
3948 AT_CHECK([pspp matrix.sps -O format=csv], [0], [dnl
3949 Table: Data List
3950 COL1,COL2,COL3
3951 1.00,2.00,3.00
3952 4.00,5.00,6.00
3953 7.00,8.00,9.00
3954
3955 Table: Data List
3956 v01,v02,v03
3957 1.00,2.00,3.00
3958 4.00,5.00,6.00
3959
3960 Table: Data List
3961 a,b,c
3962 1.00,abcd,3.00
3963 4.00,xyzw,6.00
3964 ])
3965 AT_CLEANUP
3966
3967 AT_SETUP([MATRIX - SAVE - negative])
3968 AT_DATA([matrix.sps], [dnl
3969 MATRIX.
3970 SAVE !.
3971 SAVE 1/OUTFILE=!.
3972 SAVE 1/VARIABLES=!.
3973 SAVE 1/NAMES=!.
3974 SAVE 1/!.
3975 SAVE 1.
3976 SAVE 1/OUTFILE='matrix.sav'/NAMES={'a'}/VARIABLES=a.
3977 SAVE 1/OUTFILE='matrix2.sav'.
3978 SAVE {1,2}/OUTFILE='matrix2.sav'.
3979 SAVE {1,2}/OUTFILE='matrix3.sav'/NAMES={'a', 'a'}.
3980 SAVE {1,2}/OUTFILE='matrix4.sav'/STRINGS=a.
3981 SAVE {1,2}/OUTFILE='matrix5.sav'/STRINGS=a, b.
3982 END MATRIX.
3983 ])
3984 AT_CHECK([pspp matrix.sps], [1], [dnl
3985 matrix.sps:2.6: error: SAVE: Syntax error.
3986     2 | SAVE !.
3987       |      ^
3988
3989 matrix.sps:3.16: error: SAVE: Syntax error expecting a file name or handle
3990 name.
3991     3 | SAVE 1/OUTFILE=!.
3992       |                ^
3993
3994 matrix.sps:4.18: error: SAVE: Syntax error expecting variable name.
3995     4 | SAVE 1/VARIABLES=!.
3996       |                  ^
3997
3998 matrix.sps:5.14: error: SAVE: Syntax error.
3999     5 | SAVE 1/NAMES=!.
4000       |              ^
4001
4002 matrix.sps:6.8: error: SAVE: Syntax error expecting OUTFILE, VARIABLES, NAMES,
4003 or STRINGS.
4004     6 | SAVE 1/!.
4005       |        ^
4006
4007 matrix.sps:7: error: SAVE: Required subcommand OUTFILE was not specified.
4008
4009 matrix.sps:8: warning: SAVE: VARIABLES and NAMES both specified; ignoring
4010 NAMES.
4011
4012 matrix.sps:10: error: MATRIX: Cannot save 1×2 matrix to `matrix2.sav' because
4013 the first SAVE to `matrix2.sav' in this matrix program wrote a 1-column matrix.
4014
4015 matrix.sps:9: error: MATRIX: This is the location of the first SAVE to
4016 `matrix2.sav'.
4017
4018 error: Duplicate variable name a in SAVE statement.
4019
4020 error: The SAVE command STRINGS subcommand specifies an unknown variable a.
4021
4022 error: The SAVE command STRINGS subcommand specifies 2 unknown variables,
4023 including a.
4024 ])
4025 AT_CLEANUP
4026
4027 AT_SETUP([MATRIX - MGET])
4028 AT_DATA([matrix.sps], [dnl
4029 MATRIX DATA
4030     VARIABLES=ROWTYPE_ var01 TO var08.
4031 BEGIN DATA.
4032 MEAN  24.3   5.4  69.7  20.1  13.4   2.7  27.9   3.7
4033 SD     5.7   1.5  23.5   5.8   2.8   4.5   5.4   1.5
4034 N       92    92    92    92    92    92    92    92
4035 CORR  1.00
4036 CORR   .18  1.00
4037 CORR  -.22  -.17  1.00
4038 CORR   .36   .31  -.14  1.00
4039 CORR   .27   .16  -.12   .22  1.00
4040 CORR   .33   .15  -.17   .24   .21  1.00
4041 CORR   .50   .29  -.20   .32   .12   .38  1.00
4042 CORR   .17   .29  -.05   .20   .27   .20   .04  1.00
4043 END DATA.
4044
4045 MATRIX.
4046 MGET.
4047 PRINT MN/FORMAT=F5.1.
4048 PRINT SD/FORMAT=F5.1.
4049 PRINT NC/FORMAT=F5.0.
4050 PRINT CR/FORMAT=F5.2.
4051 END MATRIX.
4052 ])
4053 AT_CHECK([pspp matrix.sps -O format=csv], [0], [dnl
4054 Table: Matrix Variables Created by MGET
4055 ,Dimensions,
4056 ,Rows,Columns
4057 MN,1,8
4058 SD,1,8
4059 NC,1,8
4060 CR,8,8
4061
4062 MN
4063 24.3   5.4  69.7  20.1  13.4   2.7  27.9   3.7
4064
4065 SD
4066 5.7   1.5  23.5   5.8   2.8   4.5   5.4   1.5
4067
4068 NC
4069 92    92    92    92    92    92    92    92
4070
4071 CR
4072 1.00   .18  -.22   .36   .27   .33   .50   .17
4073 .18  1.00  -.17   .31   .16   .15   .29   .29
4074 -.22  -.17  1.00  -.14  -.12  -.17  -.20  -.05
4075 .36   .31  -.14  1.00   .22   .24   .32   .20
4076 .27   .16  -.12   .22  1.00   .21   .12   .27
4077 .33   .15  -.17   .24   .21  1.00   .38   .20
4078 .50   .29  -.20   .32   .12   .38  1.00   .04
4079 .17   .29  -.05   .20   .27   .20   .04  1.00
4080 ])
4081 AT_CLEANUP
4082
4083 AT_SETUP([MATRIX - MGET with split variables])
4084 AT_DATA([matrix.sps], [dnl
4085 matrix data
4086     variables = s1 s2 rowtype_  var01 var02 var03
4087     /split=s1 s2.
4088
4089 begin data
4090 8 0   mean     21.4  5.0  72.9
4091 8 0   sd       6.5   1.6  22.8
4092 8 0   n        106   106  106
4093 8 0   corr     1
4094 8 0   corr    .41  1
4095 8 0   corr    -.16  -.22  1
4096 8 1   mean     11.4  1.0  52.9
4097 8 1   sd       9.5   8.6  12.8
4098 8 1   n        10   11  12
4099 8 1   corr     1
4100 8 1   corr    .51  1
4101 8 1   corr    .36  -.41  1
4102 end data.
4103
4104 MATRIX.
4105 MGET.
4106 PRINT MNS1/FORMAT=F5.1.
4107 PRINT SDS1/FORMAT=F5.1.
4108 PRINT NCS1/FORMAT=F5.0.
4109 PRINT CRS1/FORMAT=F5.2.
4110 PRINT MNS2/FORMAT=F5.1.
4111 PRINT SDS2/FORMAT=F5.1.
4112 PRINT NCS2/FORMAT=F5.0.
4113 PRINT CRS2/FORMAT=F5.2.
4114 END MATRIX.
4115 ])
4116 AT_CHECK([pspp -O format=csv matrix.sps], [0], [dnl
4117 Table: Matrix Variables Created by MGET
4118 ,Split Values,,Dimensions,
4119 ,s1,s2,Rows,Columns
4120 MNS1,8,0,1,3
4121 SDS1,8,0,1,3
4122 NCS1,8,0,1,3
4123 CRS1,8,0,3,3
4124 MNS2,8,1,1,3
4125 SDS2,8,1,1,3
4126 NCS2,8,1,1,3
4127 CRS2,8,1,3,3
4128
4129 MNS1
4130 21.4   5.0  72.9
4131
4132 SDS1
4133 6.5   1.6  22.8
4134
4135 NCS1
4136 106   106   106
4137
4138 CRS1
4139 1.00   .41  -.16
4140 .41  1.00  -.22
4141 -.16  -.22  1.00
4142
4143 MNS2
4144 11.4   1.0  52.9
4145
4146 SDS2
4147 9.5   8.6  12.8
4148
4149 NCS2
4150 10    11    12
4151
4152 CRS2
4153 1.00   .51   .36
4154 .51  1.00  -.41
4155 .36  -.41  1.00
4156 ])
4157 AT_CLEANUP
4158
4159 AT_SETUP([MATRIX - MGET with factor variables])
4160 AT_DATA([matrix.sps], [dnl
4161 MATRIX DATA
4162     VARIABLES=ROWTYPE_ f1 var01 TO var04
4163     /FACTOR=f1.
4164 BEGIN DATA.
4165 MEAN 0 34 35 36 37
4166 SD   0 22 11 55 66
4167 N    0 99 98 99 92
4168 MEAN 1 44 45 34 39
4169 SD   1 23 15 51 46
4170 N    1 98 34 87 23
4171 CORR .  1
4172 CORR . .9  1
4173 CORR . .8 .6  1
4174 CORR . .7 .5 .4  1
4175 END DATA.
4176 FORMATS var01 TO var04(F5.1).
4177 SAVE OUTFILE='matrix.sav'.
4178 ])
4179 AT_DATA([matrix2.sps], [dnl
4180 MATRIX.
4181 MGET FILE='matrix.sav'.
4182 PRINT MNF1/FORMAT=F2.0.
4183 PRINT SDF1/FORMAT=F2.0.
4184 PRINT NCF1/FORMAT=F2.0.
4185 PRINT MNF2/FORMAT=F2.0.
4186 PRINT SDF2/FORMAT=F2.0.
4187 PRINT NCF2/FORMAT=F2.0.
4188 PRINT CR/FORMAT=F3.1.
4189 END MATRIX.
4190 ])
4191 AT_CHECK([pspp matrix.sps])
4192 AT_CHECK([pspp -O format=csv matrix2.sps], [0], [dnl
4193 Table: Matrix Variables Created by MGET
4194 ,Factors,Dimensions,
4195 ,f1,Rows,Columns
4196 MNF1,0,1,4
4197 SDF1,0,1,4
4198 NCF1,0,1,4
4199 MNF2,1,1,4
4200 SDF2,1,1,4
4201 NCF2,1,1,4
4202 CR,.,4,4
4203
4204 MNF1
4205 34 35 36 37
4206
4207 SDF1
4208 22 11 55 66
4209
4210 NCF1
4211 99 98 99 92
4212
4213 MNF2
4214 44 45 34 39
4215
4216 SDF2
4217 23 15 51 46
4218
4219 NCF2
4220 98 34 87 23
4221
4222 CR
4223 1.0  .9  .8  .7
4224 .9 1.0  .6  .5
4225 .8  .6 1.0  .4
4226 .7  .5  .4 1.0
4227 ])
4228 AT_CLEANUP
4229
4230 AT_SETUP([MATRIX - MGET with factor and split variables])
4231 AT_DATA([matrix.sps], [dnl
4232 matrix data
4233     variables = s f rowtype_  var01 var02 var03
4234     /split=s
4235     /factor=f.
4236
4237 begin data
4238 8 0   mean     21.4  5.0  72.9
4239 8 0   sd       6.5   1.6  22.8
4240 8 0   n        106   106  106
4241 8 .   corr     1
4242 8 .   corr    .41  1
4243 8 .   corr    -.16  -.22  1
4244 9 1   mean     11.4  1.0  52.9
4245 9 1   sd       9.5   8.6  12.8
4246 9 1   n        10   11  12
4247 9 .   corr     1
4248 9 .   corr    .51  1
4249 9 .   corr    .36  -.41  1
4250 end data.
4251
4252 MATRIX.
4253 MGET.
4254 PRINT MNF1S1/FORMAT=F5.1.
4255 PRINT SDF1S1/FORMAT=F5.1.
4256 PRINT NCF1S1/FORMAT=F5.0.
4257 PRINT CRS1/FORMAT=F5.2.
4258 PRINT MNF1S2/FORMAT=F5.1.
4259 PRINT SDF1S2/FORMAT=F5.1.
4260 PRINT NCF1S2/FORMAT=F5.0.
4261 PRINT CRS2/FORMAT=F5.2.
4262 END MATRIX.
4263 ])
4264 AT_CHECK([pspp matrix.sps -O format=csv], [0], [dnl
4265 Table: Matrix Variables Created by MGET
4266 ,Split Values,Factors,Dimensions,
4267 ,s,f,Rows,Columns
4268 MNF1S1,8,0,1,3
4269 SDF1S1,8,0,1,3
4270 NCF1S1,8,0,1,3
4271 CRS1,8,.,3,3
4272 MNF1S2,9,1,1,3
4273 SDF1S2,9,1,1,3
4274 NCF1S2,9,1,1,3
4275 CRS2,9,.,3,3
4276
4277 MNF1S1
4278 21.4   5.0  72.9
4279
4280 SDF1S1
4281 6.5   1.6  22.8
4282
4283 NCF1S1
4284 106   106   106
4285
4286 CRS1
4287 1.00   .41  -.16
4288 .41  1.00  -.22
4289 -.16  -.22  1.00
4290
4291 MNF1S2
4292 11.4   1.0  52.9
4293
4294 SDF1S2
4295 9.5   8.6  12.8
4296
4297 NCF1S2
4298 10    11    12
4299
4300 CRS2
4301 1.00   .51   .36
4302 .51  1.00  -.41
4303 .36  -.41  1.00
4304 ])
4305 AT_CLEANUP
4306
4307 AT_SETUP([MATRIX - MGET with TYPE])
4308 AT_DATA([matrix.sps], [dnl
4309 MATRIX DATA
4310     VARIABLES=ROWTYPE_ f1 var01 TO var04
4311     /FACTOR=f1.
4312 BEGIN DATA.
4313 MEAN 0 34 35 36 37
4314 SD   0 22 11 55 66
4315 N    0 99 98 99 92
4316 MEAN 1 44 45 34 39
4317 SD   1 23 15 51 46
4318 N    1 98 34 87 23
4319 CORR .  1
4320 CORR . .9  1
4321 CORR . .8 .6  1
4322 CORR . .7 .5 .4  1
4323 END DATA.
4324 FORMATS var01 TO var04(F5.1).
4325 SAVE OUTFILE='matrix.sav'.
4326 ])
4327 AT_DATA([matrix2.sps], [dnl
4328 MATRIX.
4329 MGET/FILE='matrix.sav'/TYPE=CORR.
4330 PRINT CR/FORMAT=F3.1.
4331 END MATRIX.
4332 ])
4333 AT_CHECK([pspp matrix.sps])
4334 AT_CHECK([pspp -O format=csv matrix2.sps], [0], [dnl
4335 Table: Matrix Variables Created by MGET
4336 ,Factors,Dimensions,
4337 ,f1,Rows,Columns
4338 CR,.,4,4
4339
4340 CR
4341 1.0  .9  .8  .7
4342 .9 1.0  .6  .5
4343 .8  .6 1.0  .4
4344 .7  .5  .4 1.0
4345 ])
4346 AT_CLEANUP
4347
4348 AT_SETUP([MATRIX - MGET - negative - parsing])
4349 AT_DATA([matrix.sps], [dnl
4350 MATRIX.
4351 MGET !.
4352 MGET FILE=!.
4353 MGET ENCODING=!.
4354 MGET TYPE=!.
4355 MGET TYPE=CORR !.
4356 END MATRIX.
4357 ])
4358 AT_CHECK([pspp matrix.sps], [1], [dnl
4359 matrix.sps:2.6: error: MGET: Syntax error expecting FILE or TYPE.
4360     2 | MGET !.
4361       |      ^
4362
4363 matrix.sps:3.11: error: MGET: Syntax error expecting a file name or handle
4364 name.
4365     3 | MGET FILE=!.
4366       |           ^
4367
4368 matrix.sps:4.15: error: MGET: Syntax error expecting string.
4369     4 | MGET ENCODING=!.
4370       |               ^
4371
4372 matrix.sps:5.11: error: MGET: Syntax error expecting COV, CORR, MEAN, STDDEV,
4373 N, or COUNT.
4374     5 | MGET TYPE=!.
4375       |           ^
4376
4377 matrix.sps:6.16: error: MGET: Syntax error expecting COV, CORR, MEAN, STDDEV,
4378 N, or COUNT.
4379     6 | MGET TYPE=CORR !.
4380       |                ^
4381 ])
4382 AT_CLEANUP
4383
4384 AT_SETUP([MATRIX - MGET - missing VARNAME_ and ROWTYPE_])
4385 AT_DATA([matrix.sps], [dnl
4386 DATA LIST LIST NOTABLE /x.
4387 BEGIN DATA.
4388 1
4389 END DATA.
4390
4391 MATRIX.
4392 MGET.
4393 END MATRIX.
4394 ])
4395 AT_CHECK([pspp matrix.sps], [1], [dnl
4396 matrix.sps:7: error: MATRIX: Matrix data file lacks ROWTYPE_ variable.
4397
4398 matrix.sps:7: error: MATRIX: Matrix data file lacks VARNAME_ variable.
4399 ])
4400 AT_CLEANUP
4401
4402 AT_SETUP([MATRIX - MGET - wrong format for VARNAME_ and ROWTYPE_])
4403 AT_DATA([matrix.sps], [dnl
4404 DATA LIST LIST NOTABLE /VARNAME_ * ROWTYPE_ (A7).
4405 BEGIN DATA.
4406 1 asdf
4407 END DATA.
4408
4409 MATRIX.
4410 MGET.
4411 END MATRIX.
4412 ])
4413 AT_CHECK([pspp matrix.sps], [1], [dnl
4414 matrix.sps:7: error: MATRIX: ROWTYPE_ variable in matrix data file must be 8-
4415 byte string, but it has width 7.
4416
4417 matrix.sps:7: error: MATRIX: VARNAME_ variable in matrix data file must be 8-
4418 byte string, but it has width 0.
4419 ])
4420 AT_CLEANUP
4421
4422 AT_SETUP([MATRIX - MGET - wrong order for VARNAME_ and ROWTYPE_])
4423 AT_DATA([matrix.sps], [dnl
4424 DATA LIST LIST NOTABLE /VARNAME_ ROWTYPE_ (A8).
4425 BEGIN DATA.
4426 asdf jkl;
4427 END DATA.
4428
4429 MATRIX.
4430 MGET.
4431 END MATRIX.
4432 ])
4433 AT_CHECK([pspp matrix.sps], [1], [dnl
4434 matrix.sps:7: error: MATRIX: ROWTYPE_ must precede VARNAME_ in matrix data
4435 file.
4436 ])
4437 AT_CLEANUP
4438
4439 AT_SETUP([MATRIX - MGET - no continuous variables])
4440 AT_DATA([matrix.sps], [dnl
4441 DATA LIST LIST NOTABLE /ROWTYPE_ VARNAME_ (A8).
4442 BEGIN DATA.
4443 asdf jkl;
4444 END DATA.
4445
4446 MATRIX.
4447 MGET.
4448 END MATRIX.
4449 ])
4450 AT_CHECK([pspp matrix.sps], [1], [dnl
4451 matrix.sps:7: error: MATRIX: Matrix data file contains no continuous variables.
4452 ])
4453 AT_CLEANUP
4454
4455 AT_SETUP([MATRIX - MGET - unexpected string variables])
4456 AT_DATA([matrix.sps], [dnl
4457 DATA LIST LIST NOTABLE /ROWTYPE_ VARNAME_ cvar1 (A8).
4458 BEGIN DATA.
4459 asdf jkl; zxcv
4460 END DATA.
4461
4462 MATRIX.
4463 MGET.
4464 END MATRIX.
4465 ])
4466 AT_CHECK([pspp matrix.sps], [1], [dnl
4467 matrix.sps:7: error: MATRIX: Matrix data file contains unexpected string
4468 variable cvar1.
4469 ])
4470 AT_CLEANUP
4471
4472 AT_SETUP([MATRIX - MGET - unknown ROWTYPE_])
4473 AT_DATA([matrix.sps], [dnl
4474 DATA LIST LIST NOTABLE /ROWTYPE_ VARNAME_ (A8) cvar1.
4475 BEGIN DATA.
4476 asdf jkl; 1
4477 END DATA.
4478
4479 MATRIX.
4480 MGET.
4481 END MATRIX.
4482 ])
4483 AT_CHECK([pspp matrix.sps -O format=csv], [1], [dnl
4484 "matrix.sps:7: error: MATRIX: Matrix data file contains unknown ROWTYPE_ ""asdf""."
4485 ])
4486 AT_CLEANUP
4487
4488 AT_SETUP([MATRIX - MGET - duplicate matrix variable name])
4489 AT_DATA([matrix.sps], [dnl
4490 DATA LIST LIST NOTABLE /ROWTYPE_ VARNAME_ (A8) cvar1.
4491 BEGIN DATA.
4492 corr jkl; 1
4493 END DATA.
4494
4495 MATRIX.
4496 MGET.
4497 MGET.
4498 END MATRIX.
4499 ])
4500 AT_CHECK([pspp matrix.sps -O format=csv], [0], [dnl
4501 Table: Matrix Variables Created by MGET
4502 ,Dimensions,
4503 ,Rows,Columns
4504 CR,1,1
4505
4506 matrix.sps:8: warning: MATRIX: Matrix data file contains variable with existing name CR.
4507 ])
4508 AT_CLEANUP
4509
4510 AT_SETUP([MATRIX - MGET - missing values in input])
4511 AT_DATA([matrix.sps], [dnl
4512 DATA LIST LIST NOTABLE /s1 * ROWTYPE_ VARNAME_ (A8) cvar1 cvar2.
4513 BEGIN DATA.
4514 1 n "" 1 .
4515 2 n "" . .
4516 END DATA.
4517
4518 MATRIX.
4519 MGET.
4520 PRINT ncs1/FORMAT=F5.
4521 PRINT ncs2/FORMAT=F5.
4522 END MATRIX.
4523 ])
4524 AT_CHECK([pspp matrix.sps -O format=csv], [1], [dnl
4525 "matrix.sps:8: error: MATRIX: Matrix data file variable NCS1 contains a missing value, which was treated as zero."
4526
4527 "matrix.sps:8: error: MATRIX: Matrix data file variable NCS2 contains 2 missing values, which were treated as zero."
4528
4529 Table: Matrix Variables Created by MGET
4530 ,Split Values,Dimensions,
4531 ,s1,Rows,Columns
4532 NCS1,1.00,1,2
4533 NCS2,2.00,1,2
4534
4535 ncs1
4536 1     0
4537
4538 ncs2
4539 0     0
4540 ])
4541 AT_CLEANUP
4542
4543 AT_SETUP([MATRIX - MSAVE])
4544 AT_DATA([matrix.sps], [dnl
4545 MATRIX.
4546 MSAVE {1, 2; 3, 4}/TYPE=CORR/VARIABLES=X,Y/OUTFILE='matrix.sav'.
4547 MSAVE {5, 6; 7, 8; 9, 10}/TYPE=COV/VARIABLES=X,Y.
4548 MSAVE {11, 12}/TYPE=MEAN.
4549 MSAVE {13, 14}/TYPE=STDDEV.
4550 MSAVE {15, 16}/TYPE=N.
4551 MSAVE {17, 18}/TYPE=COUNT.
4552 END MATRIX.
4553 GET 'matrix.sav'.
4554 LIST.
4555 ])
4556 AT_CHECK([pspp matrix.sps -O format=csv], [0], [dnl
4557 Table: Data List
4558 ROWTYPE_,VARNAME_,X,Y
4559 CORR,X,1.00,2.00
4560 CORR,Y,3.00,4.00
4561 COV,X,5.00,6.00
4562 COV,Y,7.00,8.00
4563 COV,,9.00,10.00
4564 MEAN,,11.00,12.00
4565 STDDEV,,13.00,14.00
4566 N,,15.00,16.00
4567 COUNT,,17.00,18.00
4568 ])
4569 AT_CLEANUP
4570
4571 AT_SETUP([MATRIX - MSAVE with factor variables])
4572 AT_DATA([matrix.sps], [dnl
4573 MATRIX.
4574 MSAVE {1, 2; 3, 4}/TYPE=CORR/FACTOR={1,1}/FNAMES=X,Y/OUTFILE='matrix.sav'.
4575 MSAVE {5, 6; 7, 8; 9, 10}/TYPE=COV.
4576 MSAVE {11, 12}/TYPE=MEAN.
4577 MSAVE {13, 14}/FACTOR={2,1}/TYPE=STDDEV.
4578 MSAVE {15, 16}/TYPE=N.
4579 MSAVE {17, 18}/FACTOR={1,2}/TYPE=COUNT.
4580 END MATRIX.
4581 GET 'matrix.sav'.
4582 LIST.
4583
4584 MATRIX.
4585 MSAVE {1, 2; 3, 4}/TYPE=CORR/FACTOR={5,6,7,8}/OUTFILE='matrix2.sav'.
4586 END MATRIX.
4587 GET 'matrix2.sav'.
4588 LIST.
4589 ])
4590 AT_CHECK([pspp matrix.sps -O format=csv], [0], [dnl
4591 Table: Data List
4592 ROWTYPE_,X,Y,VARNAME_,COL1,COL2
4593 CORR,1.00,1.00,COL1,1.00,2.00
4594 CORR,1.00,1.00,COL2,3.00,4.00
4595 COV,1.00,1.00,COL1,5.00,6.00
4596 COV,1.00,1.00,COL2,7.00,8.00
4597 COV,1.00,1.00,,9.00,10.00
4598 MEAN,1.00,1.00,,11.00,12.00
4599 STDDEV,2.00,1.00,,13.00,14.00
4600 N,2.00,1.00,,15.00,16.00
4601 COUNT,1.00,2.00,,17.00,18.00
4602
4603 Table: Data List
4604 ROWTYPE_,FAC1,FAC2,FAC3,FAC4,VARNAME_,COL1,COL2
4605 CORR,5.00,6.00,7.00,8.00,COL1,1.00,2.00
4606 CORR,5.00,6.00,7.00,8.00,COL2,3.00,4.00
4607 ])
4608 AT_CLEANUP
4609
4610 AT_SETUP([MATRIX - MSAVE with split variables])
4611 AT_DATA([matrix.sps], [dnl
4612 MATRIX.
4613 MSAVE {1, 2; 3, 4}/TYPE=CORR/SPLIT={1,1}/SNAMES=X,Y/OUTFILE='matrix.sav'.
4614 MSAVE {5, 6; 7, 8; 9, 10}/TYPE=COV.
4615 MSAVE {11, 12}/TYPE=MEAN.
4616 MSAVE {13, 14}/SPLIT={2,1}/TYPE=STDDEV.
4617 MSAVE {15, 16}/TYPE=N.
4618 MSAVE {17, 18}/SPLIT={1,2}/TYPE=COUNT.
4619 END MATRIX.
4620 GET 'matrix.sav'.
4621 LIST.
4622
4623 MATRIX.
4624 MSAVE {1, 2; 3, 4}/TYPE=CORR/SPLIT={5,6,7,8}/OUTFILE='matrix2.sav'.
4625 END MATRIX.
4626 GET 'matrix2.sav'.
4627 LIST.
4628 ])
4629 AT_CHECK([pspp matrix.sps -O format=csv], [0], [dnl
4630 Table: Data List
4631 X,Y,ROWTYPE_,VARNAME_,COL1,COL2
4632 1.00,1.00,CORR,COL1,1.00,2.00
4633 1.00,1.00,CORR,COL2,3.00,4.00
4634 1.00,1.00,COV,COL1,5.00,6.00
4635 1.00,1.00,COV,COL2,7.00,8.00
4636 1.00,1.00,COV,,9.00,10.00
4637 1.00,1.00,MEAN,,11.00,12.00
4638 2.00,1.00,STDDEV,,13.00,14.00
4639 2.00,1.00,N,,15.00,16.00
4640 1.00,2.00,COUNT,,17.00,18.00
4641
4642 Table: Data List
4643 SPL1,SPL2,SPL3,SPL4,ROWTYPE_,VARNAME_,COL1,COL2
4644 5.00,6.00,7.00,8.00,CORR,COL1,1.00,2.00
4645 5.00,6.00,7.00,8.00,CORR,COL2,3.00,4.00
4646 ])
4647 AT_CLEANUP
4648
4649 AT_SETUP([MATRIX - MSAVE with factor and split variables])
4650 AT_DATA([matrix.sps], [dnl
4651 MATRIX.
4652 MSAVE {1, 2; 3, 4}/TYPE=CORR/SPLIT=1/FACTOR=1/OUTFILE='matrix.sav'.
4653 MSAVE {5, 6; 7, 8; 9, 10}/TYPE=COV.
4654 MSAVE {11, 12}/FACTOR=2/TYPE=MEAN.
4655 MSAVE {13, 14}/FACTOR=1/SPLIT=2/TYPE=STDDEV.
4656 MSAVE {15, 16}/TYPE=N.
4657 MSAVE {17, 18}/FACTOR=2/TYPE=COUNT.
4658 END MATRIX.
4659 GET 'matrix.sav'.
4660 LIST.
4661 ])
4662 AT_CHECK([pspp matrix.sps -O format=csv], [0], [dnl
4663 Table: Data List
4664 SPL1,ROWTYPE_,FAC1,VARNAME_,COL1,COL2
4665 1.00,CORR,1.00,COL1,1.00,2.00
4666 1.00,CORR,1.00,COL2,3.00,4.00
4667 1.00,COV,1.00,COL1,5.00,6.00
4668 1.00,COV,1.00,COL2,7.00,8.00
4669 1.00,COV,1.00,,9.00,10.00
4670 1.00,MEAN,2.00,,11.00,12.00
4671 2.00,STDDEV,1.00,,13.00,14.00
4672 2.00,N,1.00,,15.00,16.00
4673 2.00,COUNT,2.00,,17.00,18.00
4674 ])
4675 AT_CLEANUP
4676
4677 AT_SETUP([MATRIX - MSAVE - negative])
4678 AT_DATA([matrix.sps], [dnl
4679 MATRIX.
4680 MSAVE !.
4681 MSAVE 1/TYPE=!.
4682 MSAVE 1/OUTFILE=!.
4683 MSAVE 1/VARIABLES=!.
4684 MSAVE 1/FNAMES=!.
4685 MSAVE 1/SNAMES=!.
4686 MSAVE 1/SPLIT=!.
4687 MSAVE 1/FACTOR=!.
4688 MSAVE 1/!.
4689 MSAVE 1.
4690 MSAVE 1/TYPE=COV/FNAMES=x.
4691 MSAVE 1/TYPE=COV/SNAMES=x.
4692 MSAVE 1/TYPE=COV.
4693
4694 MSAVE 1/TYPE=COV/OUTFILE='matrix.sav'
4695     /FACTOR=1 /FNAMES=y
4696     /SPLIT=2 /SNAMES=z
4697     /VARIABLES=w.
4698 MSAVE 1/TYPE=COV/OUTFILE='matrix2.sav'.
4699 MSAVE 1/TYPE=COV/VARIABLES=x.
4700 MSAVE 1/TYPE=COV/FNAMES=x.
4701 MSAVE 1/TYPE=COV/SNAMES=x.
4702 END MATRIX.
4703
4704 MATRIX.
4705 MSAVE 1/TYPE=COV/VARIABLES=x/OUTFILE='matrix3.sav'/FACTOR=1/SPLIT=2.
4706 MSAVE {1,2}/TYPE=COV/VARIABLES=x/OUTFILE='matrix3.sav'/FACTOR=1/SPLIT=2.
4707 MSAVE {1,2;3}/TYPE=COV.
4708 MSAVE 0/TYPE=COV/FACTOR={1,2}.
4709 MSAVE 0/TYPE=COV/FACTOR=1/SPLIT={1;2}.
4710 END MATRIX.
4711
4712 MATRIX.
4713 MSAVE 1/TYPE=COV/OUTFILE='matrix4.sav'/SNAMES=x,x/SPLIT=1.
4714 END MATRIX.
4715
4716 MATRIX.
4717 MSAVE 1/TYPE=COV/OUTFILE='matrix5.sav'/SNAMES=x/FNAMES=x/SPLIT=1/FACTOR=1.
4718 END MATRIX.
4719
4720 MATRIX.
4721 MSAVE 1/TYPE=COV/OUTFILE='matrix6.sav'/VARIABLES=x/FNAMES=x/FACTOR=1.
4722 END MATRIX.
4723
4724 MATRIX.
4725 MSAVE 1/TYPE=COV/OUTFILE='matrix6.sav'/VARIABLES=x/SNAMES=x/SPLIT=1.
4726 END MATRIX.
4727
4728 MATRIX.
4729 MSAVE 1/TYPE=COV/OUTFILE='matrix7.sav'/SNAMES=VARNAME_.
4730 MSAVE 1/TYPE=COV/OUTFILE='matrix7.sav'/SNAMES=ROWTYPE_.
4731 MSAVE 1/TYPE=COV/OUTFILE='matrix7.sav'/FNAMES=VARNAME_.
4732 MSAVE 1/TYPE=COV/OUTFILE='matrix7.sav'/FNAMES=ROWTYPE_.
4733 MSAVE 1/TYPE=COV/OUTFILE='matrix7.sav'/VARIABLES=VARNAME_.
4734 MSAVE 1/TYPE=COV/OUTFILE='matrix7.sav'/VARIABLES=ROWTYPE_.
4735 END MATRIX.
4736 ])
4737 AT_CHECK([pspp matrix.sps], [1], [dnl
4738 matrix.sps:2.7: error: MSAVE: Syntax error.
4739     2 | MSAVE !.
4740       |       ^
4741
4742 matrix.sps:3.14: error: MSAVE: Syntax error expecting COV, CORR, MEAN, STDDEV,
4743 N, or COUNT.
4744     3 | MSAVE 1/TYPE=!.
4745       |              ^
4746
4747 matrix.sps:4.17: error: MSAVE: Syntax error expecting a file name or handle
4748 name.
4749     4 | MSAVE 1/OUTFILE=!.
4750       |                 ^
4751
4752 matrix.sps:5.19: error: MSAVE: Syntax error expecting variable name.
4753     5 | MSAVE 1/VARIABLES=!.
4754       |                   ^
4755
4756 matrix.sps:6.16: error: MSAVE: Syntax error expecting variable name.
4757     6 | MSAVE 1/FNAMES=!.
4758       |                ^
4759
4760 matrix.sps:7.16: error: MSAVE: Syntax error expecting variable name.
4761     7 | MSAVE 1/SNAMES=!.
4762       |                ^
4763
4764 matrix.sps:8.15: error: MSAVE: Syntax error.
4765     8 | MSAVE 1/SPLIT=!.
4766       |               ^
4767
4768 matrix.sps:9.16: error: MSAVE: Syntax error.
4769     9 | MSAVE 1/FACTOR=!.
4770       |                ^
4771
4772 matrix.sps:10.9: error: MSAVE: Syntax error expecting TYPE, OUTFILE, VARIABLES,
4773 FNAMES, SNAMES, SPLIT, or FACTOR.
4774    10 | MSAVE 1/!.
4775       |         ^
4776
4777 matrix.sps:11: error: MSAVE: Required subcommand TYPE was not specified.
4778
4779 matrix.sps:12.25: error: MSAVE: FNAMES requires FACTOR.
4780    12 | MSAVE 1/TYPE=COV/FNAMES=x.
4781       |                         ^
4782
4783 matrix.sps:13.25: error: MSAVE: SNAMES requires SPLIT.
4784    13 | MSAVE 1/TYPE=COV/SNAMES=x.
4785       |                         ^
4786
4787 matrix.sps:14: error: MSAVE: Required subcommand OUTFILE was not specified.
4788
4789 matrix.sps:20: error: MSAVE: OUTFILE must name the same file on each MSAVE
4790 within a single MATRIX command.
4791
4792 matrix.sps:16.26-16.37: note: MSAVE: This is the OUTFILE on the first MSAVE
4793 command.
4794    16 | MSAVE 1/TYPE=COV/OUTFILE='matrix.sav'
4795       |                          ^~~~~~~~~~~~
4796
4797 matrix.sps:20.26-20.38: note: MSAVE: This is the OUTFILE on a later MSAVE
4798 command.
4799    20 | MSAVE 1/TYPE=COV/OUTFILE='matrix2.sav'.
4800       |                          ^~~~~~~~~~~~~
4801
4802 matrix.sps:21: error: MSAVE: VARIABLES must specify the same variables on each
4803 MSAVE within a given MATRIX.
4804
4805 matrix.sps:19.16: error: MSAVE: This is the specification of VARIABLES on the
4806 first MSAVE.
4807    19 |     /VARIABLES=w.
4808       |                ^
4809
4810 matrix.sps:21.28: error: MSAVE: This is a different specification of VARIABLES
4811 on a later MSAVE.
4812    21 | MSAVE 1/TYPE=COV/VARIABLES=x.
4813       |                            ^
4814
4815 matrix.sps:22: error: MSAVE: FNAMES must specify the same variables on each
4816 MSAVE within a given MATRIX.
4817
4818 matrix.sps:17.23: error: MSAVE: This is the specification of FNAMES on the
4819 first MSAVE.
4820    17 |     /FACTOR=1 /FNAMES=y
4821       |                       ^
4822
4823 matrix.sps:22.25: error: MSAVE: This is a different specification of FNAMES on
4824 a later MSAVE.
4825    22 | MSAVE 1/TYPE=COV/FNAMES=x.
4826       |                         ^
4827
4828 matrix.sps:23: error: MSAVE: SNAMES must specify the same variables on each
4829 MSAVE within a given MATRIX.
4830
4831 matrix.sps:18.22: error: MSAVE: This is the specification of SNAMES on the
4832 first MSAVE.
4833    18 |     /SPLIT=2 /SNAMES=z
4834       |                      ^
4835
4836 matrix.sps:23.25: error: MSAVE: This is a different specification of SNAMES on
4837 a later MSAVE.
4838    23 | MSAVE 1/TYPE=COV/SNAMES=x.
4839       |                         ^
4840
4841 matrix.sps:28.7-28.11: error: MATRIX: Matrix on MSAVE has 2 columns but there
4842 are 1 variables.
4843    28 | MSAVE {1,2}/TYPE=COV/VARIABLES=x/OUTFILE='matrix3.sav'/FACTOR=1/
4844 SPLIT=2.
4845       |       ^~~~~
4846
4847 matrix.sps:29.7-29.13: error: MATRIX: This expression tries to vertically join
4848 matrices with differing numbers of columns.
4849    29 | MSAVE {1,2;3}/TYPE=COV.
4850       |       ^~~~~~~
4851
4852 matrix.sps:29.8-29.10: note: MATRIX: This operand is a 1×2 matrix.
4853    29 | MSAVE {1,2;3}/TYPE=COV.
4854       |        ^~~
4855
4856 matrix.sps:29.12: note: MATRIX: This operand is a 1×1 matrix.
4857    29 | MSAVE {1,2;3}/TYPE=COV.
4858       |            ^
4859
4860 matrix.sps:30.25-30.29: error: MATRIX: There are 1 factor variables, but 2
4861 factor values were supplied.
4862    30 | MSAVE 0/TYPE=COV/FACTOR={1,2}.
4863       |                         ^~~~~
4864
4865 matrix.sps:31.33-31.37: error: MATRIX: There are 1 split variables, but 2 split
4866 values were supplied.
4867    31 | MSAVE 0/TYPE=COV/FACTOR=1/SPLIT={1;2}.
4868       |                                 ^~~~~
4869
4870 matrix.sps:35.49: error: MSAVE: Variable x appears twice in variable list.
4871    35 | MSAVE 1/TYPE=COV/OUTFILE='matrix4.sav'/SNAMES=x,x/SPLIT=1.
4872       |                                                 ^
4873
4874 matrix.sps:39.56: error: MATRIX: Duplicate or invalid FACTOR variable name x.
4875    39 | MSAVE 1/TYPE=COV/OUTFILE='matrix5.sav'/SNAMES=x/FNAMES=x/SPLIT=1/
4876 FACTOR=1.
4877       |                                                        ^
4878
4879 matrix.sps:43.50: error: MATRIX: Duplicate or invalid variable name x.
4880    43 | MSAVE 1/TYPE=COV/OUTFILE='matrix6.sav'/VARIABLES=x/FNAMES=x/FACTOR=1.
4881       |                                                  ^
4882
4883 matrix.sps:47.50: error: MATRIX: Duplicate or invalid variable name x.
4884    47 | MSAVE 1/TYPE=COV/OUTFILE='matrix6.sav'/VARIABLES=x/SNAMES=x/SPLIT=1.
4885       |                                                  ^
4886
4887 matrix.sps:51.47-51.54: error: MSAVE: Variable name VARNAME_ is reserved.
4888    51 | MSAVE 1/TYPE=COV/OUTFILE='matrix7.sav'/SNAMES=VARNAME_.
4889       |                                               ^~~~~~~~
4890
4891 matrix.sps:52.47-52.54: error: MSAVE: Variable name ROWTYPE_ is reserved.
4892    52 | MSAVE 1/TYPE=COV/OUTFILE='matrix7.sav'/SNAMES=ROWTYPE_.
4893       |                                               ^~~~~~~~
4894
4895 matrix.sps:53.47-53.54: error: MSAVE: Variable name VARNAME_ is reserved.
4896    53 | MSAVE 1/TYPE=COV/OUTFILE='matrix7.sav'/FNAMES=VARNAME_.
4897       |                                               ^~~~~~~~
4898
4899 matrix.sps:54.47-54.54: error: MSAVE: Variable name ROWTYPE_ is reserved.
4900    54 | MSAVE 1/TYPE=COV/OUTFILE='matrix7.sav'/FNAMES=ROWTYPE_.
4901       |                                               ^~~~~~~~
4902
4903 matrix.sps:55.50-55.57: error: MSAVE: Variable name VARNAME_ is reserved.
4904    55 | MSAVE 1/TYPE=COV/OUTFILE='matrix7.sav'/VARIABLES=VARNAME_.
4905       |                                                  ^~~~~~~~
4906
4907 matrix.sps:56.50-56.57: error: MSAVE: Variable name ROWTYPE_ is reserved.
4908    56 | MSAVE 1/TYPE=COV/OUTFILE='matrix7.sav'/VARIABLES=ROWTYPE_.
4909       |                                                  ^~~~~~~~
4910 ])
4911 AT_CLEANUP
4912
4913 AT_SETUP([MATRIX - DISPLAY])
4914 AT_DATA([matrix-template.sps], [dnl
4915 MATRIX.
4916 COMPUTE a={1,2,3}.
4917 COMPUTE b={1;2;3}.
4918 COMPUTE c={T(b),a}.
4919 COMPUTE d={T(a),b}.
4920 command.
4921 END MATRIX.
4922 ])
4923 for command in 'DISPLAY' 'DISPLAY DICTIONARY' 'DISPLAY STATUS'; do
4924     sed "s/command/$command/" < matrix-template.sps > matrix.sps
4925     AT_CHECK([pspp matrix.sps -O format=csv], [0], [dnl
4926 Table: Matrix Variables
4927 ,Dimension,,Size (kB)
4928 ,Rows,Columns,
4929 a,1,3,0
4930 b,3,1,0
4931 c,1,6,0
4932 d,3,2,0
4933 ])
4934 done
4935 AT_CLEANUP
4936
4937 AT_SETUP([MATRIX - DISPLAY - negative])
4938 AT_DATA([matrix.sps], [dnl
4939 MATRIX.
4940 DISPLAY !.
4941 END MATRIX.
4942 ])
4943 AT_CHECK([pspp matrix.sps], [1], [dnl
4944 matrix.sps:2.9: error: DISPLAY: Syntax error expecting DICTIONARY or STATUS.
4945     2 | DISPLAY !.
4946       |         ^
4947 ])
4948 AT_CLEANUP
4949
4950 AT_SETUP([MATRIX - RELEASE])
4951 AT_DATA([matrix.sps], [dnl
4952 MATRIX.
4953 COMPUTE x=1.
4954 PRINT x.
4955 RELEASE X.
4956 PRINT x.
4957 END MATRIX.
4958 ])
4959 AT_CHECK([pspp matrix.sps], [1], [dnl
4960 x
4961   1
4962
4963 matrix.sps:5.7: error: MATRIX: Uninitialized variable x used in expression.
4964     5 | PRINT x.
4965       |       ^
4966 ])
4967 AT_CLEANUP
4968
4969 AT_SETUP([MATRIX - RELEASE - negative])
4970 AT_DATA([matrix.sps], [dnl
4971 MATRIX.
4972 RELEASE !.
4973 RELEASE x.
4974 COMPUTE x=1.
4975 RELEASE x, !.
4976 COMPUTE x=1.
4977 RELEASE x y.
4978 COMPUTE x=1.
4979 RELEASE x.
4980 RELEASE x.
4981 END MATRIX.
4982 ])
4983 AT_CHECK([pspp matrix.sps], [1], [dnl
4984 matrix.sps:2.9: error: RELEASE: Syntax error expecting end of command.
4985     2 | RELEASE !.
4986       |         ^
4987
4988 matrix.sps:3.9: error: RELEASE: Syntax error expecting variable name.
4989     3 | RELEASE x.
4990       |         ^
4991
4992 matrix.sps:5.12: error: RELEASE: Syntax error expecting end of command.
4993     5 | RELEASE x, !.
4994       |            ^
4995
4996 matrix.sps:7.11: error: RELEASE: Syntax error expecting end of command.
4997     7 | RELEASE x y.
4998       |           ^
4999 ])
5000 AT_CLEANUP