MATRIX: Improve error messages.
[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.1-18.7: error: READ: Required subcommand FIELD was not specified.
3392    18 | READ x.
3393       | ^~~~~~~
3394
3395 matrix.sps:19: error: READ: SIZE is required for reading data into a full
3396 matrix (as opposed to a submatrix).
3397
3398 matrix.sps:19.6: note: READ: This expression designates a full matrix.
3399    19 | READ x/FIELD=1 TO 10.
3400       |      ^
3401
3402 matrix.sps:20.1-20.32: error: READ: Required subcommand FILE was not specified.
3403    20 | READ x/FIELD=1 TO 10/SIZE={1,2}.
3404       | ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
3405
3406 matrix.sps:21: error: READ: 15 repetitions cannot fit in record width 10.
3407
3408 matrix.sps:21.57-21.61: note: READ: This syntax designates the number of
3409 repetitions.
3410    21 | READ x/FIELD=1 TO 10/SIZE={1,2}/FILE='xyzzy.txt'/FORMAT='15F'.
3411       |                                                         ^~~~~
3412
3413 matrix.sps:21.14-21.20: note: READ: This syntax designates the record width.
3414    21 | READ x/FIELD=1 TO 10/SIZE={1,2}/FILE='xyzzy.txt'/FORMAT='15F'.
3415       |              ^~~~~~~
3416
3417 matrix.sps:22: error: READ: This command specifies two different field widths.
3418
3419 matrix.sps:22.62-22.63: note: READ: This syntax specifies field width 5.
3420    22 | READ x/FIELD=1 TO 10 BY 2/SIZE={1,2}/FILE='xyzzy.txt'/FORMAT=F5.
3421       |                                                              ^~
3422
3423 matrix.sps:22.25: note: READ: This syntax specifies field width 2.
3424    22 | READ x/FIELD=1 TO 10 BY 2/SIZE={1,2}/FILE='xyzzy.txt'/FORMAT=F5.
3425       |                         ^
3426
3427 matrix.sps:23: error: READ: This command specifies two different field widths.
3428
3429 matrix.sps:23.62-23.65: note: READ: This syntax specifies 2 repetitions.
3430    23 | READ x/FIELD=1 TO 10 BY 2/SIZE={1,2}/FILE='xyzzy.txt'/FORMAT='2F'.
3431       |                                                              ^~~~
3432
3433 matrix.sps:23.14-23.20: note: READ: This syntax designates record width 10,
3434 which divided by 2 repetitions implies field width 5.
3435    23 | READ x/FIELD=1 TO 10 BY 2/SIZE={1,2}/FILE='xyzzy.txt'/FORMAT='2F'.
3436       |              ^~~~~~~
3437
3438 matrix.sps:23.25: note: READ: This syntax specifies field width 2.
3439    23 | READ x/FIELD=1 TO 10 BY 2/SIZE={1,2}/FILE='xyzzy.txt'/FORMAT='2F'.
3440       |                         ^
3441
3442 matrix.sps:24.27-24.35: error: MATRIX: SIZE must evaluate to a scalar or a 2-
3443 element vector, not a 2×2 matrix.
3444    24 | READ x/FIELD=1 TO 10/SIZE={1,2;3,4}/FILE='matrix.txt'.
3445       |                           ^~~~~~~~~
3446
3447 matrix.sps:25.27-25.33: error: MATRIX: SIZE must evaluate to a scalar or a 2-
3448 element vector, not a 1×3 matrix.
3449    25 | READ x/FIELD=1 TO 10/SIZE={1,2,3}/FILE='matrix.txt'.
3450       |                           ^~~~~~~
3451
3452 matrix.sps:26.28-26.29: error: MATRIX: Matrix dimensions -1×1 specified on SIZE
3453 are outside valid range.
3454    26 | READ x/FIELD=1 TO 10/SIZE={-1}/FILE='matrix.txt'.
3455       |                            ^~
3456
3457 matrix.sps:28: error: MATRIX: Dimensions specified on SIZE differ from
3458 dimensions of destination submatrix.
3459
3460 matrix.sps:28.32-28.36: note: MATRIX: SIZE specifies dimensions 2×2.
3461    28 | READ x(:,:)/FIELD=1 TO 10/SIZE={2,2}/FILE='matrix.txt'.
3462       |                                ^~~~~
3463
3464 matrix.sps:28.6-28.11: note: MATRIX: Destination submatrix has dimensions 1×3.
3465    28 | READ x(:,:)/FIELD=1 TO 10/SIZE={2,2}/FILE='matrix.txt'.
3466       |      ^~~~~~
3467
3468 matrix.sps:29: error: MATRIX: Cannot read non-square 1×3 matrix using READ with
3469 MODE=SYMMETRIC.
3470
3471 matrix.txt:1.1-1.5: warning: Error reading "xyzzy" as format F for matrix row
3472 1, column 1: Field contents are not numeric.
3473
3474 matrix.txt:2.1: warning: Error reading "." as format F for matrix row 2, column
3475 1: Matrix data may not contain missing value.
3476 ])
3477 AT_CLEANUP
3478
3479 AT_SETUP([MATRIX - WRITE])
3480 AT_DATA([matrix.sps], [dnl
3481 MATRIX.
3482 WRITE {1.5, 2; 3, 4.12345}/OUTFILE='matrix.txt'/FIELD=1 TO 80.
3483 WRITE {1.5, 2; 3, 4.12345}/OUTFILE='matrix.txt'/FIELD=1 TO 5.
3484 WRITE {1, 2; 3, 4}/OUTFILE='matrix.txt'/FIELD=1 TO 80 BY 5.
3485 WRITE {1, 2; 3, 4}/OUTFILE='matrix.txt'/FIELD=1 TO 80/FORMAT=F8.2.
3486 WRITE {1, 2; 3, 4}/OUTFILE='matrix.txt'/FIELD=1 TO 80/FORMAT=E.
3487 WRITE {1, 2; 3, 4}/OUTFILE='matrix.txt'/FIELD=1 TO 10 BY 10/FORMAT=E.
3488 WRITE "abcdefhi"/OUTFILE='matrix.txt'/FIELD=1 TO 80/FORMAT=A8.
3489 WRITE "abcdefhi"/OUTFILE='matrix.txt'/FIELD=1 TO 80/FORMAT=A4.
3490 WRITE "abcdefhi"/OUTFILE='matrix.txt'/FIELD=1 TO 80/FORMAT=AHEX12.
3491 END MATRIX.
3492 ])
3493 AT_CHECK([pspp matrix.sps])
3494 AT_CHECK([cat matrix.txt], [0], [dnl
3495  1.5 2
3496  3 4.12345
3497  1.5 2
3498  3
3499  4.12345
3500      1    2
3501      3    4
3502      1.00    2.00
3503      3.00    4.00
3504  1 2
3505  3 4
3506     1.E+000
3507     2.E+000
3508     3.E+000
3509     4.E+000
3510  abcdefhi
3511  abcd
3512  616263646566
3513 ])
3514 AT_CLEANUP
3515
3516 AT_SETUP([MATRIX - WRITE - negative])
3517 AT_DATA([matrix.sps], [dnl
3518 MATRIX.
3519 WRITE !.
3520 WRITE 1/OUTFILE=!.
3521 WRITE 1/ENCODING=!.
3522 WRITE 1/FIELD=!.
3523 WRITE 1/FIELD=1 !.
3524 WRITE 1/FIELD=1 TO 0.
3525 WRITE 1/FIELD=1 TO 10 BY 20.
3526 WRITE 1/FIELD=1 TO 10 BY 6.
3527 WRITE 1/MODE=TRAPEZOIDAL.
3528 WRITE 1/FORMAT=F5/FORMAT=F5.
3529 WRITE 1/FORMAT='5ASDF'.
3530 WRITE 1/FORMAT=ASDF5.
3531 WRITE 1/!.
3532 WRITE 1.
3533 WRITE 1/FIELD=1 TO 10.
3534 WRITE 1/FIELD=1 TO 10/OUTFILE='matrix.txt'/FORMAT='15F'.
3535 WRITE 1/FIELD=1 TO 10 BY 5/OUTFILE='matrix.txt'/FORMAT='5F'.
3536 WRITE 1/FIELD=1 TO 10 BY 5/OUTFILE='matrix.txt'/FORMAT=E.
3537 WRITE 1/FIELD=1 TO 10/OUTFILE='matrix.txt'/FORMAT=A9.
3538 WRITE {1,2}/FIELD=1 TO 10/OUTFILE='matrix.txt'/MODE=TRIANGULAR.
3539 END MATRIX.
3540 ])
3541 AT_CHECK([pspp matrix.sps], [1], [dnl
3542 matrix.sps:2.7: error: WRITE: Syntax error.
3543     2 | WRITE !.
3544       |       ^
3545
3546 matrix.sps:3.17: error: WRITE: Syntax error expecting a file name or handle
3547 name.
3548     3 | WRITE 1/OUTFILE=!.
3549       |                 ^
3550
3551 matrix.sps:4.18: error: WRITE: Syntax error expecting string.
3552     4 | WRITE 1/ENCODING=!.
3553       |                  ^
3554
3555 matrix.sps:5.15: error: WRITE: Syntax error expecting positive integer for
3556 FIELD.
3557     5 | WRITE 1/FIELD=!.
3558       |               ^
3559
3560 matrix.sps:6.17: error: WRITE: Syntax error expecting `TO'.
3561     6 | WRITE 1/FIELD=1 !.
3562       |                 ^
3563
3564 matrix.sps:7.20: error: WRITE: Syntax error expecting positive integer for TO.
3565     7 | WRITE 1/FIELD=1 TO 0.
3566       |                    ^
3567
3568 matrix.sps:8.26-8.27: error: WRITE: Syntax error expecting integer between 1
3569 and 10 for BY.
3570     8 | WRITE 1/FIELD=1 TO 10 BY 20.
3571       |                          ^~
3572
3573 matrix.sps:9.15-9.26: error: WRITE: Field width 6 does not evenly divide record
3574 width 10.
3575     9 | WRITE 1/FIELD=1 TO 10 BY 6.
3576       |               ^~~~~~~~~~~~
3577
3578 matrix.sps:9.15-9.21: note: WRITE: This syntax designates the record width.
3579     9 | WRITE 1/FIELD=1 TO 10 BY 6.
3580       |               ^~~~~~~
3581
3582 matrix.sps:9.26: note: WRITE: This syntax specifies the field width.
3583     9 | WRITE 1/FIELD=1 TO 10 BY 6.
3584       |                          ^
3585
3586 matrix.sps:10.14-10.24: error: WRITE: Syntax error expecting RECTANGULAR or
3587 TRIANGULAR.
3588    10 | WRITE 1/MODE=TRAPEZOIDAL.
3589       |              ^~~~~~~~~~~
3590
3591 matrix.sps:11.19-11.24: error: WRITE: Subcommand FORMAT may only be specified
3592 once.
3593    11 | WRITE 1/FORMAT=F5/FORMAT=F5.
3594       |                   ^~~~~~
3595
3596 matrix.sps:12.16-12.22: error: WRITE: Unknown format ASDF.
3597    12 | WRITE 1/FORMAT='5ASDF'.
3598       |                ^~~~~~~
3599
3600 matrix.sps:13.16-13.20: error: WRITE: Unknown format type `ASDF'.
3601    13 | WRITE 1/FORMAT=ASDF5.
3602       |                ^~~~~
3603
3604 matrix.sps:14.9: error: WRITE: Syntax error expecting OUTFILE, FIELD, MODE,
3605 HOLD, or FORMAT.
3606    14 | WRITE 1/!.
3607       |         ^
3608
3609 matrix.sps:15.1-15.8: error: WRITE: Required subcommand FIELD was not
3610 specified.
3611    15 | WRITE 1.
3612       | ^~~~~~~~
3613
3614 matrix.sps:16.1-16.22: error: WRITE: Required subcommand OUTFILE was not
3615 specified.
3616    16 | WRITE 1/FIELD=1 TO 10.
3617       | ^~~~~~~~~~~~~~~~~~~~~~
3618
3619 matrix.sps:17.51-17.55: note: WRITE: This syntax designates the number of
3620 repetitions.
3621    17 | WRITE 1/FIELD=1 TO 10/OUTFILE='matrix.txt'/FORMAT='15F'.
3622       |                                                   ^~~~~
3623
3624 matrix.sps:17.15-17.21: note: WRITE: This syntax designates the record width.
3625    17 | WRITE 1/FIELD=1 TO 10/OUTFILE='matrix.txt'/FORMAT='15F'.
3626       |               ^~~~~~~
3627
3628 matrix.sps:18: error: WRITE: This command specifies two different field widths.
3629
3630 matrix.sps:18.56-18.59: note: WRITE: This syntax specifies 5 repetitions.
3631    18 | WRITE 1/FIELD=1 TO 10 BY 5/OUTFILE='matrix.txt'/FORMAT='5F'.
3632       |                                                        ^~~~
3633
3634 matrix.sps:18.15-18.21: note: WRITE: This syntax designates record width 10,
3635 which divided by 5 repetitions implies field width 2.
3636    18 | WRITE 1/FIELD=1 TO 10 BY 5/OUTFILE='matrix.txt'/FORMAT='5F'.
3637       |               ^~~~~~~
3638
3639 matrix.sps:18.26: note: WRITE: This syntax specifies field width 5.
3640    18 | WRITE 1/FIELD=1 TO 10 BY 5/OUTFILE='matrix.txt'/FORMAT='5F'.
3641       |                          ^
3642
3643 matrix.sps:19: error: WRITE: Output format E5.0 specifies width 5, but E
3644 requires a width between 6 and 40.
3645
3646 matrix.sps:19.56: note: WRITE: This syntax specifies format E.
3647    19 | WRITE 1/FIELD=1 TO 10 BY 5/OUTFILE='matrix.txt'/FORMAT=E.
3648       |                                                        ^
3649
3650 matrix.sps:19.26: note: WRITE: This syntax specifies field width 5.
3651    19 | WRITE 1/FIELD=1 TO 10 BY 5/OUTFILE='matrix.txt'/FORMAT=E.
3652       |                          ^
3653
3654 matrix.sps:20.51-20.52: error: WRITE: Format A9 is too wide for 8-byte matrix
3655 elements.
3656    20 | WRITE 1/FIELD=1 TO 10/OUTFILE='matrix.txt'/FORMAT=A9.
3657       |                                                   ^~
3658
3659 matrix.sps:21.7-21.11: error: MATRIX: WRITE with MODE=TRIANGULAR requires a
3660 square matrix but the matrix to be written has dimensions 1×2.
3661    21 | WRITE {1,2}/FIELD=1 TO 10/OUTFILE='matrix.txt'/MODE=TRIANGULAR.
3662       |       ^~~~~
3663 ])
3664 AT_CLEANUP
3665
3666 AT_SETUP([MATRIX - GET])
3667 AT_DATA([matrix.sps], [dnl
3668 DATA LIST LIST NOTABLE /a b c.
3669 MISSING VALUES a(1) b(5).
3670 BEGIN DATA.
3671 0 0 0
3672 1 2 3
3673 4 5 6
3674 7 8 .
3675 END DATA.
3676
3677 MATRIX.
3678 GET x0 /NAMES=names0.
3679 PRINT x0.
3680 PRINT names0/FORMAT=A8.
3681 END MATRIX.
3682
3683 MATRIX.
3684 GET x1 /VARIABLES=a b c /NAMES=names1 /MISSING=OMIT.
3685 PRINT x1.
3686 PRINT names1/FORMAT=A8.
3687 END MATRIX.
3688
3689 MATRIX.
3690 GET x2 /VARIABLES=a b /NAMES=names2 /MISSING=OMIT.
3691 PRINT x2.
3692 PRINT names2/FORMAT=A8.
3693 END MATRIX.
3694
3695 MATRIX.
3696 GET x3 /FILE=* /VARIABLES=a b c /NAMES=names3 /MISSING=5.
3697 PRINT x3.
3698 PRINT names3/FORMAT=A8.
3699 END MATRIX.
3700
3701 MATRIX.
3702 GET x4 /FILE=* /VARIABLES=a b /NAMES=names4 /MISSING=5.
3703 PRINT x4.
3704 PRINT names4/FORMAT=A8.
3705 END MATRIX.
3706
3707 SAVE OUTFILE='matrix.sav'.
3708 NEW FILE.
3709
3710 MATRIX.
3711 GET x5 /FILE='matrix.sav' /VARIABLES=a b c /NAMES=names5 /MISSING=ACCEPT.
3712 PRINT x5.
3713 PRINT names5/FORMAT=A8.
3714 END MATRIX.
3715
3716 MATRIX.
3717 GET x6 /FILE='matrix.sav' /VARIABLES=a b c /NAMES=names6 /MISSING=ACCEPT /SYSMIS=9.
3718 PRINT x6.
3719 PRINT names6/FORMAT=A8.
3720 END MATRIX.
3721
3722 MATRIX.
3723 GET x7 /FILE='matrix.sav' /VARIABLES=a b c /NAMES=names7 /MISSING=ACCEPT /SYSMIS=OMIT.
3724 PRINT x7.
3725 PRINT names7/FORMAT=A8.
3726 END MATRIX.
3727 ])
3728 AT_CHECK([pspp matrix.sps], [1], [dnl
3729 matrix.sps:11: error: MATRIX: Variable a in case 2 has user-missing value 1.
3730
3731 matrix.sps:12.7-12.8: error: MATRIX: Uninitialized variable x0 used in
3732 expression.
3733    12 | PRINT x0.
3734       |       ^~
3735
3736 names0
3737  a
3738  b
3739  c
3740
3741 matrix.sps:17: error: MATRIX: Variable c in case 4 is system-missing.
3742
3743 matrix.sps:18.7-18.8: error: MATRIX: Uninitialized variable x1 used in
3744 expression.
3745    18 | PRINT x1.
3746       |       ^~
3747
3748 names1
3749  a
3750  b
3751  c
3752
3753 x2
3754   0  0
3755   7  8
3756
3757 names2
3758  a
3759  b
3760
3761 matrix.sps:29: error: MATRIX: Variable c in case 4 is system-missing.
3762
3763 matrix.sps:30.7-30.8: error: MATRIX: Uninitialized variable x3 used in
3764 expression.
3765    30 | PRINT x3.
3766       |       ^~
3767
3768 names3
3769  a
3770  b
3771  c
3772
3773 x4
3774   0  0
3775   5  2
3776   4  5
3777   7  8
3778
3779 names4
3780  a
3781  b
3782
3783 matrix.sps:44: error: MATRIX: Variable c in case 4 is system-missing.
3784
3785 matrix.sps:45.7-45.8: error: MATRIX: Uninitialized variable x5 used in
3786 expression.
3787    45 | PRINT x5.
3788       |       ^~
3789
3790 names5
3791  a
3792  b
3793  c
3794
3795 x6
3796   0  0  0
3797   1  2  3
3798   4  5  6
3799   7  8  9
3800
3801 names6
3802  a
3803  b
3804  c
3805
3806 x7
3807   0  0  0
3808   1  2  3
3809   4  5  6
3810
3811 names7
3812  a
3813  b
3814  c
3815 ])
3816 AT_CLEANUP
3817
3818 AT_SETUP([MATRIX - GET - negative])
3819 AT_DATA([matrix.sps], [dnl
3820 DATA LIST LIST NOTABLE /a b c * d(a1).
3821 MISSING VALUES a(1) b(5).
3822 BEGIN DATA.
3823 0 0 0 a
3824 1 2 3 b
3825 4 5 6 b
3826 7 8 . d
3827 END DATA.
3828 SAVE OUTFILE='matrix.sav'.
3829
3830 MATRIX.
3831 GET !.
3832 GET x/VARIABLES=!.
3833 GET x/FILE=!.
3834 GET x/ENCODING=!.
3835 GET x/NAMES=!.
3836 GET x/MISSING=!.
3837 GET x/SYSMIS=!.
3838 GET x/!.
3839 GET x/VARIABLES=!.
3840 GET x/VARIABLES=x TO !.
3841 GET x/VARIABLES=x.
3842 GET x/VARIABLES=c TO a.
3843 GET x/VARIABLES=d.
3844 GET x.
3845 END MATRIX.
3846
3847 NEW FILE.
3848 MATRIX.
3849 GET x/VARIABLES=a.
3850 END MATRIX.
3851 ])
3852 AT_CHECK([pspp matrix.sps], [1], [dnl
3853 matrix.sps:12.5: error: GET: Syntax error expecting identifier.
3854    12 | GET !.
3855       |     ^
3856
3857 matrix.sps:13.17: error: GET: Syntax error expecting variable name.
3858    13 | GET x/VARIABLES=!.
3859       |                 ^
3860
3861 matrix.sps:14.12: error: GET: Syntax error expecting a file name or handle
3862 name.
3863    14 | GET x/FILE=!.
3864       |            ^
3865
3866 matrix.sps:15.16: error: GET: Syntax error expecting string.
3867    15 | GET x/ENCODING=!.
3868       |                ^
3869
3870 matrix.sps:16.13: error: GET: Syntax error expecting identifier.
3871    16 | GET x/NAMES=!.
3872       |             ^
3873
3874 matrix.sps:17.15: error: GET: Syntax error.
3875    17 | GET x/MISSING=!.
3876       |               ^
3877
3878 matrix.sps:18.14: error: GET: Syntax error.
3879    18 | GET x/SYSMIS=!.
3880       |              ^
3881
3882 matrix.sps:19.7: error: GET: Syntax error expecting FILE, VARIABLES, NAMES,
3883 MISSING, or SYSMIS.
3884    19 | GET x/!.
3885       |       ^
3886
3887 matrix.sps:20.17: error: GET: Syntax error expecting variable name.
3888    20 | GET x/VARIABLES=!.
3889       |                 ^
3890
3891 matrix.sps:21.22: error: GET: Syntax error expecting variable name.
3892    21 | GET x/VARIABLES=x TO !.
3893       |                      ^
3894
3895 matrix.sps:22.17: error: MATRIX: x is not a variable name.
3896    22 | GET x/VARIABLES=x.
3897       |                 ^
3898
3899 matrix.sps:23.17-23.22: error: MATRIX: c TO a is not valid syntax since c
3900 precedes a in the dictionary.
3901    23 | GET x/VARIABLES=c TO a.
3902       |                 ^~~~~~
3903
3904 matrix.sps:24.17: error: MATRIX: d is not a numeric variable.
3905    24 | GET x/VARIABLES=d.
3906       |                 ^
3907
3908 matrix.sps:25: error: MATRIX: Variable d is not numeric.
3909
3910 matrix.sps:30: error: MATRIX: The GET command cannot read an empty active file.
3911 ])
3912 AT_CLEANUP
3913
3914 AT_SETUP([MATRIX - SAVE])
3915 AT_DATA([matrix.sps], [dnl
3916 MATRIX.
3917 SAVE {1,2,3; 4,5,6}/OUTFILE='matrix.sav'.
3918 SAVE {7,8,9}/VARIABLES=a b c d.
3919
3920 SAVE {1,2,3}/OUTFILE='matrix2.sav'/VARIABLES=v01 TO v03.
3921 SAVE {4,5,6}/NAMES={'x', 'y', 'z', 'w'}.
3922
3923 SAVE {1,'abcd',3}/OUTFILE='matrix3.sav'/NAMES={'a', 'b', 'c'}/STRINGS=b.
3924 SAVE {4,'xyzw',6}/STRINGS=a, b.
3925 END MATRIX.
3926 ])
3927 AT_CHECK([pspp matrix.sps])
3928 AT_CHECK([pspp-convert matrix.sav matrix.csv && cat matrix.csv], [0], [dnl
3929 COL1,COL2,COL3
3930 1,2,3
3931 4,5,6
3932 7,8,9
3933 ])
3934 AT_CHECK([pspp-convert matrix2.sav matrix2.csv && cat matrix2.csv], [0], [dnl
3935 v01,v02,v03
3936 1,2,3
3937 4,5,6
3938 ])
3939 AT_CHECK([pspp-convert matrix3.sav matrix3.csv && cat matrix3.csv], [0], [dnl
3940 a,b,c
3941 1,abcd,3
3942 4,xyzw,6
3943 ])
3944 AT_CLEANUP
3945
3946 AT_SETUP([MATRIX - SAVE - inline])
3947 AT_DATA([matrix.sps], [dnl
3948 MATRIX.
3949 SAVE {1,2,3; 4,5,6}/OUTFILE=*.
3950 SAVE {7,8,9}/VARIABLES=a b c d.
3951 END MATRIX.
3952 LIST.
3953
3954 MATRIX.
3955 SAVE {1,2,3}/OUTFILE=*/VARIABLES=v01 TO v03.
3956 SAVE {4,5,6}/NAMES={'x', 'y', 'z', 'w'}.
3957 END MATRIX.
3958 LIST.
3959
3960 MATRIX.
3961 SAVE {1,'abcd',3}/OUTFILE=*/NAMES={'a', 'b', 'c'}/STRINGS=b.
3962 SAVE {4,'xyzw',6}/STRINGS=a, b.
3963 END MATRIX.
3964 LIST.
3965 ])
3966 AT_CHECK([pspp matrix.sps -O format=csv], [0], [dnl
3967 Table: Data List
3968 COL1,COL2,COL3
3969 1.00,2.00,3.00
3970 4.00,5.00,6.00
3971 7.00,8.00,9.00
3972
3973 Table: Data List
3974 v01,v02,v03
3975 1.00,2.00,3.00
3976 4.00,5.00,6.00
3977
3978 Table: Data List
3979 a,b,c
3980 1.00,abcd,3.00
3981 4.00,xyzw,6.00
3982 ])
3983 AT_CLEANUP
3984
3985 AT_SETUP([MATRIX - SAVE - negative])
3986 AT_DATA([matrix.sps], [dnl
3987 MATRIX.
3988 SAVE !.
3989 SAVE 1/OUTFILE=!.
3990 SAVE 1/VARIABLES=!.
3991 SAVE 1/NAMES=!.
3992 SAVE 1/!.
3993 SAVE 1.
3994 SAVE 1/OUTFILE='matrix.sav'/NAMES={'a'}/VARIABLES=a.
3995 SAVE 1/OUTFILE='matrix2.sav'.
3996 SAVE {1,2}/OUTFILE='matrix2.sav'.
3997 SAVE {1,2}/OUTFILE='matrix3.sav'/NAMES={'a', 'a'}.
3998 SAVE {1,2}/OUTFILE='matrix4.sav'/STRINGS=a.
3999 SAVE {1,2}/OUTFILE='matrix5.sav'/STRINGS=a, b.
4000 END MATRIX.
4001 ])
4002 AT_CHECK([pspp matrix.sps], [1], [dnl
4003 matrix.sps:2.6: error: SAVE: Syntax error.
4004     2 | SAVE !.
4005       |      ^
4006
4007 matrix.sps:3.16: error: SAVE: Syntax error expecting a file name or handle
4008 name.
4009     3 | SAVE 1/OUTFILE=!.
4010       |                ^
4011
4012 matrix.sps:4.18: error: SAVE: Syntax error expecting variable name.
4013     4 | SAVE 1/VARIABLES=!.
4014       |                  ^
4015
4016 matrix.sps:5.14: error: SAVE: Syntax error.
4017     5 | SAVE 1/NAMES=!.
4018       |              ^
4019
4020 matrix.sps:6.8: error: SAVE: Syntax error expecting OUTFILE, VARIABLES, NAMES,
4021 or STRINGS.
4022     6 | SAVE 1/!.
4023       |        ^
4024
4025 matrix.sps:7.1-7.7: error: SAVE: Required subcommand OUTFILE was not specified.
4026     7 | SAVE 1.
4027       | ^~~~~~~
4028
4029 matrix.sps:8.35-8.39: warning: SAVE: Ignoring NAMES because VARIABLES was also
4030 specified.
4031     8 | SAVE 1/OUTFILE='matrix.sav'/NAMES={'a'}/VARIABLES=a.
4032       |                                   ^~~~~
4033
4034 matrix.sps:10: error: MATRIX: Cannot save 1×2 matrix to `matrix2.sav' because
4035 the first SAVE to `matrix2.sav' in this matrix program wrote a 1-column matrix.
4036
4037 matrix.sps:9: error: MATRIX: This is the location of the first SAVE to
4038 `matrix2.sav'.
4039
4040 error: Duplicate variable name a in SAVE statement.
4041
4042 error: The SAVE command STRINGS subcommand specifies an unknown variable a.
4043
4044 error: The SAVE command STRINGS subcommand specifies 2 unknown variables,
4045 including a.
4046 ])
4047 AT_CLEANUP
4048
4049 AT_SETUP([MATRIX - MGET])
4050 AT_DATA([matrix.sps], [dnl
4051 MATRIX DATA
4052     VARIABLES=ROWTYPE_ var01 TO var08.
4053 BEGIN DATA.
4054 MEAN  24.3   5.4  69.7  20.1  13.4   2.7  27.9   3.7
4055 SD     5.7   1.5  23.5   5.8   2.8   4.5   5.4   1.5
4056 N       92    92    92    92    92    92    92    92
4057 CORR  1.00
4058 CORR   .18  1.00
4059 CORR  -.22  -.17  1.00
4060 CORR   .36   .31  -.14  1.00
4061 CORR   .27   .16  -.12   .22  1.00
4062 CORR   .33   .15  -.17   .24   .21  1.00
4063 CORR   .50   .29  -.20   .32   .12   .38  1.00
4064 CORR   .17   .29  -.05   .20   .27   .20   .04  1.00
4065 END DATA.
4066
4067 MATRIX.
4068 MGET.
4069 PRINT MN/FORMAT=F5.1.
4070 PRINT SD/FORMAT=F5.1.
4071 PRINT NC/FORMAT=F5.0.
4072 PRINT CR/FORMAT=F5.2.
4073 END MATRIX.
4074 ])
4075 AT_CHECK([pspp matrix.sps -O format=csv], [0], [dnl
4076 Table: Matrix Variables Created by MGET
4077 ,Dimensions,
4078 ,Rows,Columns
4079 MN,1,8
4080 SD,1,8
4081 NC,1,8
4082 CR,8,8
4083
4084 MN
4085 24.3   5.4  69.7  20.1  13.4   2.7  27.9   3.7
4086
4087 SD
4088 5.7   1.5  23.5   5.8   2.8   4.5   5.4   1.5
4089
4090 NC
4091 92    92    92    92    92    92    92    92
4092
4093 CR
4094 1.00   .18  -.22   .36   .27   .33   .50   .17
4095 .18  1.00  -.17   .31   .16   .15   .29   .29
4096 -.22  -.17  1.00  -.14  -.12  -.17  -.20  -.05
4097 .36   .31  -.14  1.00   .22   .24   .32   .20
4098 .27   .16  -.12   .22  1.00   .21   .12   .27
4099 .33   .15  -.17   .24   .21  1.00   .38   .20
4100 .50   .29  -.20   .32   .12   .38  1.00   .04
4101 .17   .29  -.05   .20   .27   .20   .04  1.00
4102 ])
4103 AT_CLEANUP
4104
4105 AT_SETUP([MATRIX - MGET with split variables])
4106 AT_DATA([matrix.sps], [dnl
4107 matrix data
4108     variables = s1 s2 rowtype_  var01 var02 var03
4109     /split=s1 s2.
4110
4111 begin data
4112 8 0   mean     21.4  5.0  72.9
4113 8 0   sd       6.5   1.6  22.8
4114 8 0   n        106   106  106
4115 8 0   corr     1
4116 8 0   corr    .41  1
4117 8 0   corr    -.16  -.22  1
4118 8 1   mean     11.4  1.0  52.9
4119 8 1   sd       9.5   8.6  12.8
4120 8 1   n        10   11  12
4121 8 1   corr     1
4122 8 1   corr    .51  1
4123 8 1   corr    .36  -.41  1
4124 end data.
4125
4126 MATRIX.
4127 MGET.
4128 PRINT MNS1/FORMAT=F5.1.
4129 PRINT SDS1/FORMAT=F5.1.
4130 PRINT NCS1/FORMAT=F5.0.
4131 PRINT CRS1/FORMAT=F5.2.
4132 PRINT MNS2/FORMAT=F5.1.
4133 PRINT SDS2/FORMAT=F5.1.
4134 PRINT NCS2/FORMAT=F5.0.
4135 PRINT CRS2/FORMAT=F5.2.
4136 END MATRIX.
4137 ])
4138 AT_CHECK([pspp -O format=csv matrix.sps], [0], [dnl
4139 Table: Matrix Variables Created by MGET
4140 ,Split Values,,Dimensions,
4141 ,s1,s2,Rows,Columns
4142 MNS1,8,0,1,3
4143 SDS1,8,0,1,3
4144 NCS1,8,0,1,3
4145 CRS1,8,0,3,3
4146 MNS2,8,1,1,3
4147 SDS2,8,1,1,3
4148 NCS2,8,1,1,3
4149 CRS2,8,1,3,3
4150
4151 MNS1
4152 21.4   5.0  72.9
4153
4154 SDS1
4155 6.5   1.6  22.8
4156
4157 NCS1
4158 106   106   106
4159
4160 CRS1
4161 1.00   .41  -.16
4162 .41  1.00  -.22
4163 -.16  -.22  1.00
4164
4165 MNS2
4166 11.4   1.0  52.9
4167
4168 SDS2
4169 9.5   8.6  12.8
4170
4171 NCS2
4172 10    11    12
4173
4174 CRS2
4175 1.00   .51   .36
4176 .51  1.00  -.41
4177 .36  -.41  1.00
4178 ])
4179 AT_CLEANUP
4180
4181 AT_SETUP([MATRIX - MGET with factor variables])
4182 AT_DATA([matrix.sps], [dnl
4183 MATRIX DATA
4184     VARIABLES=ROWTYPE_ f1 var01 TO var04
4185     /FACTOR=f1.
4186 BEGIN DATA.
4187 MEAN 0 34 35 36 37
4188 SD   0 22 11 55 66
4189 N    0 99 98 99 92
4190 MEAN 1 44 45 34 39
4191 SD   1 23 15 51 46
4192 N    1 98 34 87 23
4193 CORR .  1
4194 CORR . .9  1
4195 CORR . .8 .6  1
4196 CORR . .7 .5 .4  1
4197 END DATA.
4198 FORMATS var01 TO var04(F5.1).
4199 SAVE OUTFILE='matrix.sav'.
4200 ])
4201 AT_DATA([matrix2.sps], [dnl
4202 MATRIX.
4203 MGET FILE='matrix.sav'.
4204 PRINT MNF1/FORMAT=F2.0.
4205 PRINT SDF1/FORMAT=F2.0.
4206 PRINT NCF1/FORMAT=F2.0.
4207 PRINT MNF2/FORMAT=F2.0.
4208 PRINT SDF2/FORMAT=F2.0.
4209 PRINT NCF2/FORMAT=F2.0.
4210 PRINT CR/FORMAT=F3.1.
4211 END MATRIX.
4212 ])
4213 AT_CHECK([pspp matrix.sps])
4214 AT_CHECK([pspp -O format=csv matrix2.sps], [0], [dnl
4215 Table: Matrix Variables Created by MGET
4216 ,Factors,Dimensions,
4217 ,f1,Rows,Columns
4218 MNF1,0,1,4
4219 SDF1,0,1,4
4220 NCF1,0,1,4
4221 MNF2,1,1,4
4222 SDF2,1,1,4
4223 NCF2,1,1,4
4224 CR,.,4,4
4225
4226 MNF1
4227 34 35 36 37
4228
4229 SDF1
4230 22 11 55 66
4231
4232 NCF1
4233 99 98 99 92
4234
4235 MNF2
4236 44 45 34 39
4237
4238 SDF2
4239 23 15 51 46
4240
4241 NCF2
4242 98 34 87 23
4243
4244 CR
4245 1.0  .9  .8  .7
4246 .9 1.0  .6  .5
4247 .8  .6 1.0  .4
4248 .7  .5  .4 1.0
4249 ])
4250 AT_CLEANUP
4251
4252 AT_SETUP([MATRIX - MGET with factor and split variables])
4253 AT_DATA([matrix.sps], [dnl
4254 matrix data
4255     variables = s f rowtype_  var01 var02 var03
4256     /split=s
4257     /factor=f.
4258
4259 begin data
4260 8 0   mean     21.4  5.0  72.9
4261 8 0   sd       6.5   1.6  22.8
4262 8 0   n        106   106  106
4263 8 .   corr     1
4264 8 .   corr    .41  1
4265 8 .   corr    -.16  -.22  1
4266 9 1   mean     11.4  1.0  52.9
4267 9 1   sd       9.5   8.6  12.8
4268 9 1   n        10   11  12
4269 9 .   corr     1
4270 9 .   corr    .51  1
4271 9 .   corr    .36  -.41  1
4272 end data.
4273
4274 MATRIX.
4275 MGET.
4276 PRINT MNF1S1/FORMAT=F5.1.
4277 PRINT SDF1S1/FORMAT=F5.1.
4278 PRINT NCF1S1/FORMAT=F5.0.
4279 PRINT CRS1/FORMAT=F5.2.
4280 PRINT MNF1S2/FORMAT=F5.1.
4281 PRINT SDF1S2/FORMAT=F5.1.
4282 PRINT NCF1S2/FORMAT=F5.0.
4283 PRINT CRS2/FORMAT=F5.2.
4284 END MATRIX.
4285 ])
4286 AT_CHECK([pspp matrix.sps -O format=csv], [0], [dnl
4287 Table: Matrix Variables Created by MGET
4288 ,Split Values,Factors,Dimensions,
4289 ,s,f,Rows,Columns
4290 MNF1S1,8,0,1,3
4291 SDF1S1,8,0,1,3
4292 NCF1S1,8,0,1,3
4293 CRS1,8,.,3,3
4294 MNF1S2,9,1,1,3
4295 SDF1S2,9,1,1,3
4296 NCF1S2,9,1,1,3
4297 CRS2,9,.,3,3
4298
4299 MNF1S1
4300 21.4   5.0  72.9
4301
4302 SDF1S1
4303 6.5   1.6  22.8
4304
4305 NCF1S1
4306 106   106   106
4307
4308 CRS1
4309 1.00   .41  -.16
4310 .41  1.00  -.22
4311 -.16  -.22  1.00
4312
4313 MNF1S2
4314 11.4   1.0  52.9
4315
4316 SDF1S2
4317 9.5   8.6  12.8
4318
4319 NCF1S2
4320 10    11    12
4321
4322 CRS2
4323 1.00   .51   .36
4324 .51  1.00  -.41
4325 .36  -.41  1.00
4326 ])
4327 AT_CLEANUP
4328
4329 AT_SETUP([MATRIX - MGET with TYPE])
4330 AT_DATA([matrix.sps], [dnl
4331 MATRIX DATA
4332     VARIABLES=ROWTYPE_ f1 var01 TO var04
4333     /FACTOR=f1.
4334 BEGIN DATA.
4335 MEAN 0 34 35 36 37
4336 SD   0 22 11 55 66
4337 N    0 99 98 99 92
4338 MEAN 1 44 45 34 39
4339 SD   1 23 15 51 46
4340 N    1 98 34 87 23
4341 CORR .  1
4342 CORR . .9  1
4343 CORR . .8 .6  1
4344 CORR . .7 .5 .4  1
4345 END DATA.
4346 FORMATS var01 TO var04(F5.1).
4347 SAVE OUTFILE='matrix.sav'.
4348 ])
4349 AT_DATA([matrix2.sps], [dnl
4350 MATRIX.
4351 MGET/FILE='matrix.sav'/TYPE=CORR.
4352 PRINT CR/FORMAT=F3.1.
4353 END MATRIX.
4354 ])
4355 AT_CHECK([pspp matrix.sps])
4356 AT_CHECK([pspp -O format=csv matrix2.sps], [0], [dnl
4357 Table: Matrix Variables Created by MGET
4358 ,Factors,Dimensions,
4359 ,f1,Rows,Columns
4360 CR,.,4,4
4361
4362 CR
4363 1.0  .9  .8  .7
4364 .9 1.0  .6  .5
4365 .8  .6 1.0  .4
4366 .7  .5  .4 1.0
4367 ])
4368 AT_CLEANUP
4369
4370 AT_SETUP([MATRIX - MGET - negative - parsing])
4371 AT_DATA([matrix.sps], [dnl
4372 MATRIX.
4373 MGET !.
4374 MGET FILE=!.
4375 MGET ENCODING=!.
4376 MGET TYPE=!.
4377 MGET TYPE=CORR !.
4378 END MATRIX.
4379 ])
4380 AT_CHECK([pspp matrix.sps], [1], [dnl
4381 matrix.sps:2.6: error: MGET: Syntax error expecting FILE or TYPE.
4382     2 | MGET !.
4383       |      ^
4384
4385 matrix.sps:3.11: error: MGET: Syntax error expecting a file name or handle
4386 name.
4387     3 | MGET FILE=!.
4388       |           ^
4389
4390 matrix.sps:4.15: error: MGET: Syntax error expecting string.
4391     4 | MGET ENCODING=!.
4392       |               ^
4393
4394 matrix.sps:5.11: error: MGET: Syntax error expecting COV, CORR, MEAN, STDDEV,
4395 N, or COUNT.
4396     5 | MGET TYPE=!.
4397       |           ^
4398
4399 matrix.sps:6.16: error: MGET: Syntax error expecting COV, CORR, MEAN, STDDEV,
4400 N, or COUNT.
4401     6 | MGET TYPE=CORR !.
4402       |                ^
4403 ])
4404 AT_CLEANUP
4405
4406 AT_SETUP([MATRIX - MGET - missing VARNAME_ and ROWTYPE_])
4407 AT_DATA([matrix.sps], [dnl
4408 DATA LIST LIST NOTABLE /x.
4409 BEGIN DATA.
4410 1
4411 END DATA.
4412
4413 MATRIX.
4414 MGET.
4415 END MATRIX.
4416 ])
4417 AT_CHECK([pspp matrix.sps], [1], [dnl
4418 matrix.sps:7: error: MATRIX: Matrix data file lacks ROWTYPE_ variable.
4419
4420 matrix.sps:7: error: MATRIX: Matrix data file lacks VARNAME_ variable.
4421 ])
4422 AT_CLEANUP
4423
4424 AT_SETUP([MATRIX - MGET - wrong format for VARNAME_ and ROWTYPE_])
4425 AT_DATA([matrix.sps], [dnl
4426 DATA LIST LIST NOTABLE /VARNAME_ * ROWTYPE_ (A7).
4427 BEGIN DATA.
4428 1 asdf
4429 END DATA.
4430
4431 MATRIX.
4432 MGET.
4433 END MATRIX.
4434 ])
4435 AT_CHECK([pspp matrix.sps], [1], [dnl
4436 matrix.sps:7: error: MATRIX: ROWTYPE_ variable in matrix data file must be 8-
4437 byte string, but it has width 7.
4438
4439 matrix.sps:7: error: MATRIX: VARNAME_ variable in matrix data file must be 8-
4440 byte string, but it has width 0.
4441 ])
4442 AT_CLEANUP
4443
4444 AT_SETUP([MATRIX - MGET - wrong order for VARNAME_ and ROWTYPE_])
4445 AT_DATA([matrix.sps], [dnl
4446 DATA LIST LIST NOTABLE /VARNAME_ ROWTYPE_ (A8).
4447 BEGIN DATA.
4448 asdf jkl;
4449 END DATA.
4450
4451 MATRIX.
4452 MGET.
4453 END MATRIX.
4454 ])
4455 AT_CHECK([pspp matrix.sps], [1], [dnl
4456 matrix.sps:7: error: MATRIX: ROWTYPE_ must precede VARNAME_ in matrix data
4457 file.
4458 ])
4459 AT_CLEANUP
4460
4461 AT_SETUP([MATRIX - MGET - no continuous variables])
4462 AT_DATA([matrix.sps], [dnl
4463 DATA LIST LIST NOTABLE /ROWTYPE_ VARNAME_ (A8).
4464 BEGIN DATA.
4465 asdf jkl;
4466 END DATA.
4467
4468 MATRIX.
4469 MGET.
4470 END MATRIX.
4471 ])
4472 AT_CHECK([pspp matrix.sps], [1], [dnl
4473 matrix.sps:7: error: MATRIX: Matrix data file contains no continuous variables.
4474 ])
4475 AT_CLEANUP
4476
4477 AT_SETUP([MATRIX - MGET - unexpected string variables])
4478 AT_DATA([matrix.sps], [dnl
4479 DATA LIST LIST NOTABLE /ROWTYPE_ VARNAME_ cvar1 (A8).
4480 BEGIN DATA.
4481 asdf jkl; zxcv
4482 END DATA.
4483
4484 MATRIX.
4485 MGET.
4486 END MATRIX.
4487 ])
4488 AT_CHECK([pspp matrix.sps], [1], [dnl
4489 matrix.sps:7: error: MATRIX: Matrix data file contains unexpected string
4490 variable cvar1.
4491 ])
4492 AT_CLEANUP
4493
4494 AT_SETUP([MATRIX - MGET - unknown ROWTYPE_])
4495 AT_DATA([matrix.sps], [dnl
4496 DATA LIST LIST NOTABLE /ROWTYPE_ VARNAME_ (A8) cvar1.
4497 BEGIN DATA.
4498 asdf jkl; 1
4499 END DATA.
4500
4501 MATRIX.
4502 MGET.
4503 END MATRIX.
4504 ])
4505 AT_CHECK([pspp matrix.sps -O format=csv], [1], [dnl
4506 "matrix.sps:7: error: MATRIX: Matrix data file contains unknown ROWTYPE_ ""asdf""."
4507 ])
4508 AT_CLEANUP
4509
4510 AT_SETUP([MATRIX - MGET - duplicate matrix variable name])
4511 AT_DATA([matrix.sps], [dnl
4512 DATA LIST LIST NOTABLE /ROWTYPE_ VARNAME_ (A8) cvar1.
4513 BEGIN DATA.
4514 corr jkl; 1
4515 END DATA.
4516
4517 MATRIX.
4518 MGET.
4519 MGET.
4520 END MATRIX.
4521 ])
4522 AT_CHECK([pspp matrix.sps -O format=csv], [0], [dnl
4523 Table: Matrix Variables Created by MGET
4524 ,Dimensions,
4525 ,Rows,Columns
4526 CR,1,1
4527
4528 matrix.sps:8: warning: MATRIX: Matrix data file contains variable with existing name CR.
4529 ])
4530 AT_CLEANUP
4531
4532 AT_SETUP([MATRIX - MGET - missing values in input])
4533 AT_DATA([matrix.sps], [dnl
4534 DATA LIST LIST NOTABLE /s1 * ROWTYPE_ VARNAME_ (A8) cvar1 cvar2.
4535 BEGIN DATA.
4536 1 n "" 1 .
4537 2 n "" . .
4538 END DATA.
4539
4540 MATRIX.
4541 MGET.
4542 PRINT ncs1/FORMAT=F5.
4543 PRINT ncs2/FORMAT=F5.
4544 END MATRIX.
4545 ])
4546 AT_CHECK([pspp matrix.sps -O format=csv], [1], [dnl
4547 "matrix.sps:8: error: MATRIX: Matrix data file variable NCS1 contains a missing value, which was treated as zero."
4548
4549 "matrix.sps:8: error: MATRIX: Matrix data file variable NCS2 contains 2 missing values, which were treated as zero."
4550
4551 Table: Matrix Variables Created by MGET
4552 ,Split Values,Dimensions,
4553 ,s1,Rows,Columns
4554 NCS1,1.00,1,2
4555 NCS2,2.00,1,2
4556
4557 ncs1
4558 1     0
4559
4560 ncs2
4561 0     0
4562 ])
4563 AT_CLEANUP
4564
4565 AT_SETUP([MATRIX - MSAVE])
4566 AT_DATA([matrix.sps], [dnl
4567 MATRIX.
4568 MSAVE {1, 2; 3, 4}/TYPE=CORR/VARIABLES=X,Y/OUTFILE='matrix.sav'.
4569 MSAVE {5, 6; 7, 8; 9, 10}/TYPE=COV/VARIABLES=X,Y.
4570 MSAVE {11, 12}/TYPE=MEAN.
4571 MSAVE {13, 14}/TYPE=STDDEV.
4572 MSAVE {15, 16}/TYPE=N.
4573 MSAVE {17, 18}/TYPE=COUNT.
4574 END MATRIX.
4575 GET 'matrix.sav'.
4576 LIST.
4577 ])
4578 AT_CHECK([pspp matrix.sps -O format=csv], [0], [dnl
4579 Table: Data List
4580 ROWTYPE_,VARNAME_,X,Y
4581 CORR,X,1.00,2.00
4582 CORR,Y,3.00,4.00
4583 COV,X,5.00,6.00
4584 COV,Y,7.00,8.00
4585 COV,,9.00,10.00
4586 MEAN,,11.00,12.00
4587 STDDEV,,13.00,14.00
4588 N,,15.00,16.00
4589 COUNT,,17.00,18.00
4590 ])
4591 AT_CLEANUP
4592
4593 AT_SETUP([MATRIX - MSAVE with factor variables])
4594 AT_DATA([matrix.sps], [dnl
4595 MATRIX.
4596 MSAVE {1, 2; 3, 4}/TYPE=CORR/FACTOR={1,1}/FNAMES=X,Y/OUTFILE='matrix.sav'.
4597 MSAVE {5, 6; 7, 8; 9, 10}/TYPE=COV.
4598 MSAVE {11, 12}/TYPE=MEAN.
4599 MSAVE {13, 14}/FACTOR={2,1}/TYPE=STDDEV.
4600 MSAVE {15, 16}/TYPE=N.
4601 MSAVE {17, 18}/FACTOR={1,2}/TYPE=COUNT.
4602 END MATRIX.
4603 GET 'matrix.sav'.
4604 LIST.
4605
4606 MATRIX.
4607 MSAVE {1, 2; 3, 4}/TYPE=CORR/FACTOR={5,6,7,8}/OUTFILE='matrix2.sav'.
4608 END MATRIX.
4609 GET 'matrix2.sav'.
4610 LIST.
4611 ])
4612 AT_CHECK([pspp matrix.sps -O format=csv], [0], [dnl
4613 Table: Data List
4614 ROWTYPE_,X,Y,VARNAME_,COL1,COL2
4615 CORR,1.00,1.00,COL1,1.00,2.00
4616 CORR,1.00,1.00,COL2,3.00,4.00
4617 COV,1.00,1.00,COL1,5.00,6.00
4618 COV,1.00,1.00,COL2,7.00,8.00
4619 COV,1.00,1.00,,9.00,10.00
4620 MEAN,1.00,1.00,,11.00,12.00
4621 STDDEV,2.00,1.00,,13.00,14.00
4622 N,2.00,1.00,,15.00,16.00
4623 COUNT,1.00,2.00,,17.00,18.00
4624
4625 Table: Data List
4626 ROWTYPE_,FAC1,FAC2,FAC3,FAC4,VARNAME_,COL1,COL2
4627 CORR,5.00,6.00,7.00,8.00,COL1,1.00,2.00
4628 CORR,5.00,6.00,7.00,8.00,COL2,3.00,4.00
4629 ])
4630 AT_CLEANUP
4631
4632 AT_SETUP([MATRIX - MSAVE with split variables])
4633 AT_DATA([matrix.sps], [dnl
4634 MATRIX.
4635 MSAVE {1, 2; 3, 4}/TYPE=CORR/SPLIT={1,1}/SNAMES=X,Y/OUTFILE='matrix.sav'.
4636 MSAVE {5, 6; 7, 8; 9, 10}/TYPE=COV.
4637 MSAVE {11, 12}/TYPE=MEAN.
4638 MSAVE {13, 14}/SPLIT={2,1}/TYPE=STDDEV.
4639 MSAVE {15, 16}/TYPE=N.
4640 MSAVE {17, 18}/SPLIT={1,2}/TYPE=COUNT.
4641 END MATRIX.
4642 GET 'matrix.sav'.
4643 LIST.
4644
4645 MATRIX.
4646 MSAVE {1, 2; 3, 4}/TYPE=CORR/SPLIT={5,6,7,8}/OUTFILE='matrix2.sav'.
4647 END MATRIX.
4648 GET 'matrix2.sav'.
4649 LIST.
4650 ])
4651 AT_CHECK([pspp matrix.sps -O format=csv], [0], [dnl
4652 Table: Data List
4653 X,Y,ROWTYPE_,VARNAME_,COL1,COL2
4654 1.00,1.00,CORR,COL1,1.00,2.00
4655 1.00,1.00,CORR,COL2,3.00,4.00
4656 1.00,1.00,COV,COL1,5.00,6.00
4657 1.00,1.00,COV,COL2,7.00,8.00
4658 1.00,1.00,COV,,9.00,10.00
4659 1.00,1.00,MEAN,,11.00,12.00
4660 2.00,1.00,STDDEV,,13.00,14.00
4661 2.00,1.00,N,,15.00,16.00
4662 1.00,2.00,COUNT,,17.00,18.00
4663
4664 Table: Data List
4665 SPL1,SPL2,SPL3,SPL4,ROWTYPE_,VARNAME_,COL1,COL2
4666 5.00,6.00,7.00,8.00,CORR,COL1,1.00,2.00
4667 5.00,6.00,7.00,8.00,CORR,COL2,3.00,4.00
4668 ])
4669 AT_CLEANUP
4670
4671 AT_SETUP([MATRIX - MSAVE with factor and split variables])
4672 AT_DATA([matrix.sps], [dnl
4673 MATRIX.
4674 MSAVE {1, 2; 3, 4}/TYPE=CORR/SPLIT=1/FACTOR=1/OUTFILE='matrix.sav'.
4675 MSAVE {5, 6; 7, 8; 9, 10}/TYPE=COV.
4676 MSAVE {11, 12}/FACTOR=2/TYPE=MEAN.
4677 MSAVE {13, 14}/FACTOR=1/SPLIT=2/TYPE=STDDEV.
4678 MSAVE {15, 16}/TYPE=N.
4679 MSAVE {17, 18}/FACTOR=2/TYPE=COUNT.
4680 END MATRIX.
4681 GET 'matrix.sav'.
4682 LIST.
4683 ])
4684 AT_CHECK([pspp matrix.sps -O format=csv], [0], [dnl
4685 Table: Data List
4686 SPL1,ROWTYPE_,FAC1,VARNAME_,COL1,COL2
4687 1.00,CORR,1.00,COL1,1.00,2.00
4688 1.00,CORR,1.00,COL2,3.00,4.00
4689 1.00,COV,1.00,COL1,5.00,6.00
4690 1.00,COV,1.00,COL2,7.00,8.00
4691 1.00,COV,1.00,,9.00,10.00
4692 1.00,MEAN,2.00,,11.00,12.00
4693 2.00,STDDEV,1.00,,13.00,14.00
4694 2.00,N,1.00,,15.00,16.00
4695 2.00,COUNT,2.00,,17.00,18.00
4696 ])
4697 AT_CLEANUP
4698
4699 AT_SETUP([MATRIX - MSAVE - negative])
4700 AT_DATA([matrix.sps], [dnl
4701 MATRIX.
4702 MSAVE !.
4703 MSAVE 1/TYPE=!.
4704 MSAVE 1/OUTFILE=!.
4705 MSAVE 1/VARIABLES=!.
4706 MSAVE 1/FNAMES=!.
4707 MSAVE 1/SNAMES=!.
4708 MSAVE 1/SPLIT=!.
4709 MSAVE 1/FACTOR=!.
4710 MSAVE 1/!.
4711 MSAVE 1.
4712 MSAVE 1/TYPE=COV/FNAMES=x.
4713 MSAVE 1/TYPE=COV/SNAMES=x.
4714 MSAVE 1/TYPE=COV.
4715
4716 MSAVE 1/TYPE=COV/OUTFILE='matrix.sav'
4717     /FACTOR=1 /FNAMES=y
4718     /SPLIT=2 /SNAMES=z
4719     /VARIABLES=w.
4720 MSAVE 1/TYPE=COV/OUTFILE='matrix2.sav'.
4721 MSAVE 1/TYPE=COV/VARIABLES=x.
4722 MSAVE 1/TYPE=COV/FNAMES=x.
4723 MSAVE 1/TYPE=COV/SNAMES=x.
4724 END MATRIX.
4725
4726 MATRIX.
4727 MSAVE 1/TYPE=COV/VARIABLES=x/OUTFILE='matrix3.sav'/FACTOR=1/SPLIT=2.
4728 MSAVE {1,2}/TYPE=COV/VARIABLES=x/OUTFILE='matrix3.sav'/FACTOR=1/SPLIT=2.
4729 MSAVE {1,2;3}/TYPE=COV.
4730 MSAVE 0/TYPE=COV/FACTOR={1,2}.
4731 MSAVE 0/TYPE=COV/FACTOR=1/SPLIT={1;2}.
4732 END MATRIX.
4733
4734 MATRIX.
4735 MSAVE 1/TYPE=COV/OUTFILE='matrix4.sav'/SNAMES=x,x/SPLIT=1.
4736 END MATRIX.
4737
4738 MATRIX.
4739 MSAVE 1/TYPE=COV/OUTFILE='matrix5.sav'/SNAMES=x/FNAMES=x/SPLIT=1/FACTOR=1.
4740 END MATRIX.
4741
4742 MATRIX.
4743 MSAVE 1/TYPE=COV/OUTFILE='matrix6.sav'/VARIABLES=x/FNAMES=x/FACTOR=1.
4744 END MATRIX.
4745
4746 MATRIX.
4747 MSAVE 1/TYPE=COV/OUTFILE='matrix6.sav'/VARIABLES=x/SNAMES=x/SPLIT=1.
4748 END MATRIX.
4749
4750 MATRIX.
4751 MSAVE 1/TYPE=COV/OUTFILE='matrix7.sav'/SNAMES=VARNAME_.
4752 MSAVE 1/TYPE=COV/OUTFILE='matrix7.sav'/SNAMES=ROWTYPE_.
4753 MSAVE 1/TYPE=COV/OUTFILE='matrix7.sav'/FNAMES=VARNAME_.
4754 MSAVE 1/TYPE=COV/OUTFILE='matrix7.sav'/FNAMES=ROWTYPE_.
4755 MSAVE 1/TYPE=COV/OUTFILE='matrix7.sav'/VARIABLES=VARNAME_.
4756 MSAVE 1/TYPE=COV/OUTFILE='matrix7.sav'/VARIABLES=ROWTYPE_.
4757 END MATRIX.
4758 ])
4759 AT_CHECK([pspp matrix.sps], [1], [dnl
4760 matrix.sps:2.7: error: MSAVE: Syntax error.
4761     2 | MSAVE !.
4762       |       ^
4763
4764 matrix.sps:3.14: error: MSAVE: Syntax error expecting COV, CORR, MEAN, STDDEV,
4765 N, or COUNT.
4766     3 | MSAVE 1/TYPE=!.
4767       |              ^
4768
4769 matrix.sps:4.17: error: MSAVE: Syntax error expecting a file name or handle
4770 name.
4771     4 | MSAVE 1/OUTFILE=!.
4772       |                 ^
4773
4774 matrix.sps:5.19: error: MSAVE: Syntax error expecting variable name.
4775     5 | MSAVE 1/VARIABLES=!.
4776       |                   ^
4777
4778 matrix.sps:6.16: error: MSAVE: Syntax error expecting variable name.
4779     6 | MSAVE 1/FNAMES=!.
4780       |                ^
4781
4782 matrix.sps:7.16: error: MSAVE: Syntax error expecting variable name.
4783     7 | MSAVE 1/SNAMES=!.
4784       |                ^
4785
4786 matrix.sps:8.15: error: MSAVE: Syntax error.
4787     8 | MSAVE 1/SPLIT=!.
4788       |               ^
4789
4790 matrix.sps:9.16: error: MSAVE: Syntax error.
4791     9 | MSAVE 1/FACTOR=!.
4792       |                ^
4793
4794 matrix.sps:10.9: error: MSAVE: Syntax error expecting TYPE, OUTFILE, VARIABLES,
4795 FNAMES, SNAMES, SPLIT, or FACTOR.
4796    10 | MSAVE 1/!.
4797       |         ^
4798
4799 matrix.sps:11.1-11.8: error: MSAVE: Required subcommand TYPE was not specified.
4800    11 | MSAVE 1.
4801       | ^~~~~~~~
4802
4803 matrix.sps:12.25: error: MSAVE: FNAMES requires FACTOR.
4804    12 | MSAVE 1/TYPE=COV/FNAMES=x.
4805       |                         ^
4806
4807 matrix.sps:13.25: error: MSAVE: SNAMES requires SPLIT.
4808    13 | MSAVE 1/TYPE=COV/SNAMES=x.
4809       |                         ^
4810
4811 matrix.sps:14.1-14.17: error: MSAVE: Required subcommand OUTFILE was not
4812 specified.
4813    14 | MSAVE 1/TYPE=COV.
4814       | ^~~~~~~~~~~~~~~~~
4815
4816 matrix.sps:20: error: MSAVE: OUTFILE must name the same file on each MSAVE
4817 within a single MATRIX command.
4818
4819 matrix.sps:16.26-16.37: note: MSAVE: This is the OUTFILE on the first MSAVE
4820 command.
4821    16 | MSAVE 1/TYPE=COV/OUTFILE='matrix.sav'
4822       |                          ^~~~~~~~~~~~
4823
4824 matrix.sps:20.26-20.38: note: MSAVE: This is the OUTFILE on a later MSAVE
4825 command.
4826    20 | MSAVE 1/TYPE=COV/OUTFILE='matrix2.sav'.
4827       |                          ^~~~~~~~~~~~~
4828
4829 matrix.sps:21: error: MSAVE: VARIABLES must specify the same variables on each
4830 MSAVE within a given MATRIX.
4831
4832 matrix.sps:19.16: error: MSAVE: This is the specification of VARIABLES on the
4833 first MSAVE.
4834    19 |     /VARIABLES=w.
4835       |                ^
4836
4837 matrix.sps:21.28: error: MSAVE: This is a different specification of VARIABLES
4838 on a later MSAVE.
4839    21 | MSAVE 1/TYPE=COV/VARIABLES=x.
4840       |                            ^
4841
4842 matrix.sps:22: error: MSAVE: FNAMES must specify the same variables on each
4843 MSAVE within a given MATRIX.
4844
4845 matrix.sps:17.23: error: MSAVE: This is the specification of FNAMES on the
4846 first MSAVE.
4847    17 |     /FACTOR=1 /FNAMES=y
4848       |                       ^
4849
4850 matrix.sps:22.25: error: MSAVE: This is a different specification of FNAMES on
4851 a later MSAVE.
4852    22 | MSAVE 1/TYPE=COV/FNAMES=x.
4853       |                         ^
4854
4855 matrix.sps:23: error: MSAVE: SNAMES must specify the same variables on each
4856 MSAVE within a given MATRIX.
4857
4858 matrix.sps:18.22: error: MSAVE: This is the specification of SNAMES on the
4859 first MSAVE.
4860    18 |     /SPLIT=2 /SNAMES=z
4861       |                      ^
4862
4863 matrix.sps:23.25: error: MSAVE: This is a different specification of SNAMES on
4864 a later MSAVE.
4865    23 | MSAVE 1/TYPE=COV/SNAMES=x.
4866       |                         ^
4867
4868 matrix.sps:28.7-28.11: error: MATRIX: Matrix on MSAVE has 2 columns but there
4869 are 1 variables.
4870    28 | MSAVE {1,2}/TYPE=COV/VARIABLES=x/OUTFILE='matrix3.sav'/FACTOR=1/
4871 SPLIT=2.
4872       |       ^~~~~
4873
4874 matrix.sps:29.7-29.13: error: MATRIX: This expression tries to vertically join
4875 matrices with differing numbers of columns.
4876    29 | MSAVE {1,2;3}/TYPE=COV.
4877       |       ^~~~~~~
4878
4879 matrix.sps:29.8-29.10: note: MATRIX: This operand is a 1×2 matrix.
4880    29 | MSAVE {1,2;3}/TYPE=COV.
4881       |        ^~~
4882
4883 matrix.sps:29.12: note: MATRIX: This operand is a 1×1 matrix.
4884    29 | MSAVE {1,2;3}/TYPE=COV.
4885       |            ^
4886
4887 matrix.sps:30.25-30.29: error: MATRIX: There are 1 factor variables, but 2
4888 factor values were supplied.
4889    30 | MSAVE 0/TYPE=COV/FACTOR={1,2}.
4890       |                         ^~~~~
4891
4892 matrix.sps:31.33-31.37: error: MATRIX: There are 1 split variables, but 2 split
4893 values were supplied.
4894    31 | MSAVE 0/TYPE=COV/FACTOR=1/SPLIT={1;2}.
4895       |                                 ^~~~~
4896
4897 matrix.sps:35.49: error: MSAVE: Variable x appears twice in variable list.
4898    35 | MSAVE 1/TYPE=COV/OUTFILE='matrix4.sav'/SNAMES=x,x/SPLIT=1.
4899       |                                                 ^
4900
4901 matrix.sps:39.56: error: MATRIX: Duplicate or invalid FACTOR variable name x.
4902    39 | MSAVE 1/TYPE=COV/OUTFILE='matrix5.sav'/SNAMES=x/FNAMES=x/SPLIT=1/
4903 FACTOR=1.
4904       |                                                        ^
4905
4906 matrix.sps:43.50: error: MATRIX: Duplicate or invalid variable name x.
4907    43 | MSAVE 1/TYPE=COV/OUTFILE='matrix6.sav'/VARIABLES=x/FNAMES=x/FACTOR=1.
4908       |                                                  ^
4909
4910 matrix.sps:47.50: error: MATRIX: Duplicate or invalid variable name x.
4911    47 | MSAVE 1/TYPE=COV/OUTFILE='matrix6.sav'/VARIABLES=x/SNAMES=x/SPLIT=1.
4912       |                                                  ^
4913
4914 matrix.sps:51.47-51.54: error: MSAVE: Variable name VARNAME_ is reserved.
4915    51 | MSAVE 1/TYPE=COV/OUTFILE='matrix7.sav'/SNAMES=VARNAME_.
4916       |                                               ^~~~~~~~
4917
4918 matrix.sps:52.47-52.54: error: MSAVE: Variable name ROWTYPE_ is reserved.
4919    52 | MSAVE 1/TYPE=COV/OUTFILE='matrix7.sav'/SNAMES=ROWTYPE_.
4920       |                                               ^~~~~~~~
4921
4922 matrix.sps:53.47-53.54: error: MSAVE: Variable name VARNAME_ is reserved.
4923    53 | MSAVE 1/TYPE=COV/OUTFILE='matrix7.sav'/FNAMES=VARNAME_.
4924       |                                               ^~~~~~~~
4925
4926 matrix.sps:54.47-54.54: error: MSAVE: Variable name ROWTYPE_ is reserved.
4927    54 | MSAVE 1/TYPE=COV/OUTFILE='matrix7.sav'/FNAMES=ROWTYPE_.
4928       |                                               ^~~~~~~~
4929
4930 matrix.sps:55.50-55.57: error: MSAVE: Variable name VARNAME_ is reserved.
4931    55 | MSAVE 1/TYPE=COV/OUTFILE='matrix7.sav'/VARIABLES=VARNAME_.
4932       |                                                  ^~~~~~~~
4933
4934 matrix.sps:56.50-56.57: error: MSAVE: Variable name ROWTYPE_ is reserved.
4935    56 | MSAVE 1/TYPE=COV/OUTFILE='matrix7.sav'/VARIABLES=ROWTYPE_.
4936       |                                                  ^~~~~~~~
4937 ])
4938 AT_CLEANUP
4939
4940 AT_SETUP([MATRIX - DISPLAY])
4941 AT_DATA([matrix-template.sps], [dnl
4942 MATRIX.
4943 COMPUTE a={1,2,3}.
4944 COMPUTE b={1;2;3}.
4945 COMPUTE c={T(b),a}.
4946 COMPUTE d={T(a),b}.
4947 command.
4948 END MATRIX.
4949 ])
4950 for command in 'DISPLAY' 'DISPLAY DICTIONARY' 'DISPLAY STATUS'; do
4951     sed "s/command/$command/" < matrix-template.sps > matrix.sps
4952     AT_CHECK([pspp matrix.sps -O format=csv], [0], [dnl
4953 Table: Matrix Variables
4954 ,Dimension,,Size (kB)
4955 ,Rows,Columns,
4956 a,1,3,0
4957 b,3,1,0
4958 c,1,6,0
4959 d,3,2,0
4960 ])
4961 done
4962 AT_CLEANUP
4963
4964 AT_SETUP([MATRIX - DISPLAY - negative])
4965 AT_DATA([matrix.sps], [dnl
4966 MATRIX.
4967 DISPLAY !.
4968 END MATRIX.
4969 ])
4970 AT_CHECK([pspp matrix.sps], [1], [dnl
4971 matrix.sps:2.9: error: DISPLAY: Syntax error expecting DICTIONARY or STATUS.
4972     2 | DISPLAY !.
4973       |         ^
4974 ])
4975 AT_CLEANUP
4976
4977 AT_SETUP([MATRIX - RELEASE])
4978 AT_DATA([matrix.sps], [dnl
4979 MATRIX.
4980 COMPUTE x=1.
4981 PRINT x.
4982 RELEASE X.
4983 PRINT x.
4984 END MATRIX.
4985 ])
4986 AT_CHECK([pspp matrix.sps], [1], [dnl
4987 x
4988   1
4989
4990 matrix.sps:5.7: error: MATRIX: Uninitialized variable x used in expression.
4991     5 | PRINT x.
4992       |       ^
4993 ])
4994 AT_CLEANUP
4995
4996 AT_SETUP([MATRIX - RELEASE - negative])
4997 AT_DATA([matrix.sps], [dnl
4998 MATRIX.
4999 RELEASE !.
5000 RELEASE x.
5001 COMPUTE x=1.
5002 RELEASE x, !.
5003 COMPUTE x=1.
5004 RELEASE x y.
5005 COMPUTE x=1.
5006 RELEASE x.
5007 RELEASE x.
5008 END MATRIX.
5009 ])
5010 AT_CHECK([pspp matrix.sps], [1], [dnl
5011 matrix.sps:2.9: error: RELEASE: Syntax error expecting end of command.
5012     2 | RELEASE !.
5013       |         ^
5014
5015 matrix.sps:3.9: error: RELEASE: Syntax error expecting variable name.
5016     3 | RELEASE x.
5017       |         ^
5018
5019 matrix.sps:5.12: error: RELEASE: Syntax error expecting end of command.
5020     5 | RELEASE x, !.
5021       |            ^
5022
5023 matrix.sps:7.11: error: RELEASE: Syntax error expecting end of command.
5024     7 | RELEASE x y.
5025       |           ^
5026 ])
5027 AT_CLEANUP