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