MATRIX: Fix multiplication of empty matrices.
[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 - DO IF])
2860 AT_DATA([matrix.sps], [dnl
2861 MATRIX.
2862 DO IF 1.
2863 PRINT/TITLE '1'.
2864 END IF.
2865
2866 DO IF 0.
2867 PRINT/TITLE '2'.
2868 ELSE IF 1.
2869 PRINT/TITLE '3'.
2870 END IF.
2871
2872 DO IF -1.
2873 PRINT/TITLE '4'.
2874 ELSE IF 0.
2875 PRINT/TITLE '5'.
2876 ELSE.
2877 PRINT/TITLE '6'.
2878 END IF.
2879
2880 DO IF {1, 2}.
2881 END IF.
2882
2883 DO IF 0.
2884 ELSE IF {}.
2885 END IF.
2886 END MATRIX.
2887 ])
2888 AT_CHECK([pspp matrix.sps], [1], [dnl
2889 1
2890
2891 3
2892
2893 6
2894
2895 matrix.sps:20.7-20.12: error: MATRIX: Expression for DO IF must evaluate to
2896 scalar, not a 1×2 matrix.
2897    20 | DO IF {1, 2}.
2898       |       ^~~~~~
2899
2900 matrix.sps:24.9-24.10: error: MATRIX: Expression for ELSE IF must evaluate to
2901 scalar, not a 0×0 matrix.
2902    24 | ELSE IF {}.
2903       |         ^~
2904 ])
2905 AT_CLEANUP
2906
2907 AT_SETUP([MATRIX - unbounded LOOP])
2908 AT_DATA([matrix.sps], [dnl
2909 MATRIX.
2910 * Truly unbounded loop.
2911 COMPUTE x=0.
2912 COMPUTE y={}.
2913 LOOP.
2914 COMPUTE x=x+1.
2915 COMPUTE y={y, x}.
2916 END LOOP.
2917 PRINT x.
2918 PRINT y.
2919
2920 * Unbounded loop terminates with BREAK.
2921 COMPUTE x=0.
2922 COMPUTE y={}.
2923 LOOP.
2924 COMPUTE x=x+1.
2925 COMPUTE y={y, x}.
2926 DO IF x >= 20.
2927     BREAK.
2928 END IF.
2929 END LOOP.
2930 PRINT x.
2931 PRINT y.
2932
2933 END MATRIX.
2934 ])
2935 AT_CHECK([pspp matrix.sps], [0], [dnl
2936 x
2937   40
2938
2939 y
2940    1   2   3   4   5   6   7   8   9  10  11  12  13  14  15  16  17  18  19
2941 20  21  22  23  24  25  26  27  28  29  30  31  32  33  34  35  36  37  38  39
2942 40
2943
2944 x
2945   20
2946
2947 y
2948    1   2   3   4   5   6   7   8   9  10  11  12  13  14  15  16  17  18  19
2949 20
2950 ])
2951 AT_CLEANUP
2952
2953 AT_SETUP([MATRIX - indexed or conditional LOOP])
2954 AT_DATA([matrix.sps], [dnl
2955 MATRIX.
2956 * Indexed loop terminates based on index.
2957 COMPUTE y={}.
2958 LOOP x=1 TO 20.
2959 COMPUTE y={y, x}.
2960 END LOOP.
2961 PRINT x.
2962 PRINT y.
2963
2964 * Indexed loop terminates based on MXLOOPS.
2965 COMPUTE y={}.
2966 LOOP x=1 TO 50.
2967 COMPUTE y={y, x}.
2968 END LOOP.
2969 PRINT x.
2970 PRINT y.
2971
2972 * Indexed loop terminates with BREAK.
2973 COMPUTE y={}.
2974 LOOP x=1 TO 50.
2975 COMPUTE y={y, x}.
2976 DO IF x >= 20.
2977     BREAK.
2978 END IF.
2979 END LOOP.
2980 PRINT x.
2981 PRINT y.
2982
2983 * Indexed loop terminates with top IF.
2984 COMPUTE y={}.
2985 LOOP x=1 TO 50 IF NCOL(y) < 15.
2986 COMPUTE y={y, x}.
2987 END LOOP.
2988 PRINT x.
2989 PRINT y.
2990
2991 * Indexed loop terminates with bottom IF.
2992 COMPUTE y={}.
2993 LOOP x=1 TO 50.
2994 COMPUTE y={y, x}.
2995 END LOOP IF NCOL(y) >= 22.
2996 PRINT x.
2997 PRINT y.
2998
2999 * Index behavior.
3000 COMPUTE indexing={
3001     1, 10, 1;
3002     1, 10, 2;
3003     1, 10, 3;
3004     1, 10, -1;
3005     1, 10, 0;
3006     10, 1, -1;
3007     10, 1, -2;
3008     10, 1, -3;
3009     10, 1, 1;
3010     10, 1, 0
3011 }.
3012 LOOP i=1 TO NROW(indexing).
3013     COMPUTE y={}.
3014     LOOP j=indexing(i, 1) TO indexing(i, 2) BY indexing(i, 3).
3015         COMPUTE y={y, j}.
3016     END LOOP.
3017     PRINT {indexing(i, :), y}.
3018 END LOOP.
3019
3020 LOOP i={} TO 5.
3021 END LOOP.
3022
3023 LOOP i=5 TO {}.
3024 END LOOP.
3025
3026 LOOP i=5 TO 8 BY {}.
3027 END LOOP.
3028
3029 LOOP IF {}.
3030 END LOOP.
3031
3032 LOOP.
3033 END LOOP IF {}.
3034
3035 LOOP i=1e100 to 1e200.
3036 END LOOP.
3037 END MATRIX.
3038 ])
3039 AT_CHECK([pspp matrix.sps], [1], [dnl
3040 x
3041   20
3042
3043 y
3044    1   2   3   4   5   6   7   8   9  10  11  12  13  14  15  16  17  18  19
3045 20
3046
3047 x
3048   40
3049
3050 y
3051    1   2   3   4   5   6   7   8   9  10  11  12  13  14  15  16  17  18  19
3052 20  21  22  23  24  25  26  27  28  29  30  31  32  33  34  35  36  37  38  39
3053 40
3054
3055 x
3056   20
3057
3058 y
3059    1   2   3   4   5   6   7   8   9  10  11  12  13  14  15  16  17  18  19
3060 20
3061
3062 x
3063   16
3064
3065 y
3066    1   2   3   4   5   6   7   8   9  10  11  12  13  14  15
3067
3068 x
3069   22
3070
3071 y
3072    1   2   3   4   5   6   7   8   9  10  11  12  13  14  15  16  17  18  19
3073 20  21  22
3074
3075 {indexing(i, :), y}
3076    1  10   1   1   2   3   4   5   6   7   8   9  10
3077 {indexing(i, :), y}
3078    1  10   2   1   3   5   7   9
3079 {indexing(i, :), y}
3080    1  10   3   1   4   7  10
3081 {indexing(i, :), y}
3082    1  10  -1
3083 {indexing(i, :), y}
3084    1  10   0
3085 {indexing(i, :), y}
3086   10   1  -1  10   9   8   7   6   5   4   3   2   1
3087 {indexing(i, :), y}
3088   10   1  -2  10   8   6   4   2
3089 {indexing(i, :), y}
3090   10   1  -3  10   7   4   1
3091 {indexing(i, :), y}
3092   10   1   1
3093 {indexing(i, :), y}
3094   10   1   0
3095
3096 matrix.sps:66.8-66.9: error: MATRIX: Expression for LOOP must evaluate to
3097 scalar, not a 0×0 matrix.
3098    66 | LOOP i={} TO 5.
3099       |        ^~
3100
3101 matrix.sps:69.13-69.14: error: MATRIX: Expression for TO must evaluate to
3102 scalar, not a 0×0 matrix.
3103    69 | LOOP i=5 TO {}.
3104       |             ^~
3105
3106 matrix.sps:72.18-72.19: error: MATRIX: Expression for BY must evaluate to
3107 scalar, not a 0×0 matrix.
3108    72 | LOOP i=5 TO 8 BY {}.
3109       |                  ^~
3110
3111 matrix.sps:75.9-75.10: error: MATRIX: Expression for LOOP IF must evaluate to
3112 scalar, not a 0×0 matrix.
3113    75 | LOOP IF {}.
3114       |         ^~
3115
3116 matrix.sps:79.13-79.14: error: MATRIX: Expression for END LOOP IF must evaluate
3117 to scalar, not a 0×0 matrix.
3118    79 | END LOOP IF {}.
3119       |             ^~
3120
3121 matrix.sps:81.8-81.12: error: MATRIX: Expression for LOOP is outside the
3122 integer range.
3123    81 | LOOP i=1e100 to 1e200.
3124       |        ^~~~~
3125 ])
3126 AT_CLEANUP
3127
3128 AT_SETUP([MATRIX - BREAK outside LOOP])
3129 AT_DATA([matrix.sps], [dnl
3130 MATRIX.
3131 BREAK.
3132 END MATRIX.
3133 ])
3134 AT_CHECK([pspp matrix.sps], [1], [dnl
3135 matrix.sps:2.1-2.5: error: BREAK: BREAK not inside LOOP.
3136     2 | BREAK.
3137       | ^~~~~
3138 ])
3139 AT_CLEANUP
3140
3141 AT_SETUP([MATRIX - READ])
3142 AT_DATA([matrix.txt], [dnl
3143 9
3144 8
3145 7
3146 6
3147 1 2 3
3148 4 5 6
3149 7 8 9
3150 10 11 12,13
3151 14, 15 ,16 , 17
3152 18
3153 19
3154 20 21 22 23
3155     12        34
3156 5    6
3157     78        89
3158 10   11
3159 $1 $2 3
3160 4 $5 6
3161 $1   $2   $3   4
3162    $5$6      $78
3163 1% 2% 3% 4
3164   56%  7%8
3165 abcdefghijkl
3166 ABCDEFGHIJKL
3167 ])
3168 AT_DATA([matrix2.txt], [dnl
3169 2, 3, 5, 7
3170 11, 13, 17, 19
3171 23, 29, 31, 37
3172 41, 43, 47, 53
3173 ])
3174 AT_DATA([matrix3.txt], [dnl
3175 1 5
3176 3 1 2 3
3177 5 6 -1 2 5 1
3178 2 8 9
3179 3 1 3 2
3180 ])
3181 AT_DATA([matrix.sps], [dnl
3182 MATRIX.
3183 READ x/FILE='matrix.txt'/SIZE=4/FIELD=1 TO 1.
3184 PRINT x.
3185 READ x/FILE='matrix.txt'/SIZE={3,3}/FIELD=1 TO 80.
3186 PRINT x.
3187 READ x/SIZE={2,4}/FIELD=1 TO 80.
3188 PRINT x.
3189 READ x(:,2)/FILE='matrix.txt'/FIELD=1 TO 80.
3190 PRINT x.
3191 READ x(1,:)/SIZE={1,4}/FIELD=1 TO 80.
3192 PRINT x.
3193
3194 READ x/SIZE={2,6}/FIELD=1 TO 20 BY 5.
3195 PRINT x.
3196 READ x/SIZE={2,3}/FIELD=1 TO 20/FORMAT=DOLLAR.
3197 PRINT x.
3198 READ x/SIZE={2,4}/FIELD=1 TO 20/FORMAT=DOLLAR5.1.
3199 PRINT x.
3200 READ x/SIZE={2,4}/FIELD=1 TO 12/FORMAT='4PCT'.
3201 PRINT x.
3202 READ x/SIZE={2,4}/FIELD=1 TO 12/FORMAT='4A'.
3203 PRINT x/FORMAT=A3.
3204
3205 COMPUTE y={}.
3206 LOOP IF NOT EOF('matrix2.txt').
3207 READ x/FILE='matrix2.txt'/SIZE={1,4}/FIELD=1 TO 80.
3208 COMPUTE y={y; x}.
3209 END LOOP.
3210 PRINT y.
3211
3212 COMPUTE m = MAKE(5, 5, 0).
3213 LOOP i = 1 TO 5.
3214 READ count /FILE='matrix3.txt' /FIELD=1 TO 1 /SIZE=1.
3215 READ m(i, 1:count) /FIELD=3 TO 100 /REREAD.
3216 END LOOP.
3217 PRINT m.
3218 END MATRIX.
3219 ])
3220 AT_CHECK([pspp matrix.sps], [0], [dnl
3221 x
3222   9
3223   8
3224   7
3225   6
3226
3227 x
3228   1  2  3
3229   4  5  6
3230   7  8  9
3231
3232 x
3233   10  11  12  13
3234   14  15  16  17
3235
3236 x
3237   10  18  12  13
3238   14  19  16  17
3239
3240 x
3241   20  21  22  23
3242   14  19  16  17
3243
3244 x
3245    1   2   3   4   5   6
3246    7   8   8   9  10  11
3247
3248 x
3249   1  2  3
3250   4  5  6
3251
3252 x
3253   1  2  3  4
3254   5  6  7  8
3255
3256 x
3257   1  2  3  4
3258   5  6  7  8
3259
3260 x
3261  abc def ghi jkl
3262  ABC DEF GHI JKL
3263
3264 y
3265    2   3   5   7
3266   11  13  17  19
3267   23  29  31  37
3268   41  43  47  53
3269
3270 m
3271   5  0  0  0  0
3272   1  2  3  0  0
3273   6 -1  2  5  1
3274   8  9  0  0  0
3275   1  3  2  0  0
3276 ])
3277 AT_CLEANUP
3278
3279 AT_SETUP([MATRIX - READ - negative])
3280 AT_DATA([matrix.sps], [dnl
3281 MATRIX.
3282 READ !.
3283 READ x/FILE=!.
3284 READ x/ENCODING=!.
3285 READ x/FIELD=!.
3286 READ x/FIELD=1 !.
3287 READ x/FIELD=1 TO !.
3288 READ x/FIELD=1 TO 0.
3289 READ x/FIELD=1 TO 10 BY !.
3290 READ x/FIELD=1 TO 10 BY 6.
3291 READ x/SIZE=!.
3292 READ x/MODE=!.
3293 READ x/FORMAT=!.
3294 READ x/FORMAT=F8.2/FORMAT=F8.2.
3295 READ x/FORMAT='5XYZZY'.
3296 READ x/FORMAT=XYZZY.
3297 READ x/!.
3298 READ x.
3299 READ x/FIELD=1 TO 10.
3300 READ x/FIELD=1 TO 10/SIZE={1,2}.
3301 READ x/FIELD=1 TO 10/SIZE={1,2}/FILE='xyzzy.txt'/FORMAT='15F'.
3302 READ x/FIELD=1 TO 10 BY 2/SIZE={1,2}/FILE='xyzzy.txt'/FORMAT=F5.
3303 READ x/FIELD=1 TO 10 BY 2/SIZE={1,2}/FILE='xyzzy.txt'/FORMAT='2F'.
3304 READ x/FIELD=1 TO 10/SIZE={1,2;3,4}/FILE='matrix.txt'.
3305 READ x/FIELD=1 TO 10/SIZE={1,2,3}/FILE='matrix.txt'.
3306 READ x/FIELD=1 TO 10/SIZE={-1}/FILE='matrix.txt'.
3307 COMPUTE x={1,2,3}.
3308 READ x(:,:)/FIELD=1 TO 10/SIZE={2,2}/FILE='matrix.txt'.
3309 READ x/FIELD=1 TO 10/SIZE={1,3}/FILE='matrix.txt'/MODE=SYMMETRIC.
3310 READ x/FIELD=1 TO 10/SIZE=2/FILE='matrix.txt'.
3311 END MATRIX.
3312 ])
3313 AT_DATA([matrix.txt], [dnl
3314 xyzzy
3315 .
3316 ])
3317 AT_CHECK([pspp matrix.sps], [1], [dnl
3318 matrix.sps:2.6: error: READ: Syntax error expecting identifier.
3319     2 | READ !.
3320       |      ^
3321
3322 matrix.sps:3.13: error: READ: Syntax error expecting a file name or handle
3323 name.
3324     3 | READ x/FILE=!.
3325       |             ^
3326
3327 matrix.sps:4.17: error: READ: Syntax error expecting string.
3328     4 | READ x/ENCODING=!.
3329       |                 ^
3330
3331 matrix.sps:5.14: error: READ: Syntax error expecting positive integer for
3332 FIELD.
3333     5 | READ x/FIELD=!.
3334       |              ^
3335
3336 matrix.sps:6.16: error: READ: Syntax error expecting `TO'.
3337     6 | READ x/FIELD=1 !.
3338       |                ^
3339
3340 matrix.sps:7.19: error: READ: Syntax error expecting positive integer for TO.
3341     7 | READ x/FIELD=1 TO !.
3342       |                   ^
3343
3344 matrix.sps:8.19: error: READ: Syntax error expecting positive integer for TO.
3345     8 | READ x/FIELD=1 TO 0.
3346       |                   ^
3347
3348 matrix.sps:9.25: error: READ: Syntax error expecting integer between 1 and 10
3349 for BY.
3350     9 | READ x/FIELD=1 TO 10 BY !.
3351       |                         ^
3352
3353 matrix.sps:10.14-10.25: error: READ: Field width 6 does not evenly divide
3354 record width 10.
3355    10 | READ x/FIELD=1 TO 10 BY 6.
3356       |              ^~~~~~~~~~~~
3357
3358 matrix.sps:10.14-10.20: note: READ: This syntax designates the record width.
3359    10 | READ x/FIELD=1 TO 10 BY 6.
3360       |              ^~~~~~~
3361
3362 matrix.sps:10.25: note: READ: This syntax specifies the field width.
3363    10 | READ x/FIELD=1 TO 10 BY 6.
3364       |                         ^
3365
3366 matrix.sps:11.13: error: READ: Syntax error expecting matrix expression.
3367    11 | READ x/SIZE=!.
3368       |             ^
3369
3370 matrix.sps:12.13: error: READ: Syntax error expecting RECTANGULAR or SYMMETRIC.
3371    12 | READ x/MODE=!.
3372       |             ^
3373
3374 matrix.sps:13.15: error: READ: Syntax error expecting identifier.
3375    13 | READ x/FORMAT=!.
3376       |               ^
3377
3378 matrix.sps:14.20-14.25: error: READ: Subcommand FORMAT may only be specified
3379 once.
3380    14 | READ x/FORMAT=F8.2/FORMAT=F8.2.
3381       |                    ^~~~~~
3382
3383 matrix.sps:15.15-15.22: error: READ: Unknown format XYZZY.
3384    15 | READ x/FORMAT='5XYZZY'.
3385       |               ^~~~~~~~
3386
3387 matrix.sps:16.15-16.19: error: READ: Unknown format type `XYZZY'.
3388    16 | READ x/FORMAT=XYZZY.
3389       |               ^~~~~
3390
3391 matrix.sps:17.8: error: READ: Syntax error expecting FILE, FIELD, MODE, REREAD,
3392 or FORMAT.
3393    17 | READ x/!.
3394       |        ^
3395
3396 matrix.sps:18.1-18.7: error: READ: Required subcommand FIELD was not specified.
3397    18 | READ x.
3398       | ^~~~~~~
3399
3400 matrix.sps:19: error: READ: SIZE is required for reading data into a full
3401 matrix (as opposed to a submatrix).
3402
3403 matrix.sps:19.6: note: READ: This expression designates a full matrix.
3404    19 | READ x/FIELD=1 TO 10.
3405       |      ^
3406
3407 matrix.sps:20.1-20.32: error: READ: Required subcommand FILE was not specified.
3408    20 | READ x/FIELD=1 TO 10/SIZE={1,2}.
3409       | ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
3410
3411 matrix.sps:21: error: READ: 15 repetitions cannot fit in record width 10.
3412
3413 matrix.sps:21.57-21.61: note: READ: This syntax designates the number of
3414 repetitions.
3415    21 | READ x/FIELD=1 TO 10/SIZE={1,2}/FILE='xyzzy.txt'/FORMAT='15F'.
3416       |                                                         ^~~~~
3417
3418 matrix.sps:21.14-21.20: note: READ: This syntax designates the record width.
3419    21 | READ x/FIELD=1 TO 10/SIZE={1,2}/FILE='xyzzy.txt'/FORMAT='15F'.
3420       |              ^~~~~~~
3421
3422 matrix.sps:22: error: READ: This command specifies two different field widths.
3423
3424 matrix.sps:22.62-22.63: note: READ: This syntax specifies field width 5.
3425    22 | READ x/FIELD=1 TO 10 BY 2/SIZE={1,2}/FILE='xyzzy.txt'/FORMAT=F5.
3426       |                                                              ^~
3427
3428 matrix.sps:22.25: note: READ: This syntax specifies field width 2.
3429    22 | READ x/FIELD=1 TO 10 BY 2/SIZE={1,2}/FILE='xyzzy.txt'/FORMAT=F5.
3430       |                         ^
3431
3432 matrix.sps:23: error: READ: This command specifies two different field widths.
3433
3434 matrix.sps:23.62-23.65: note: READ: This syntax specifies 2 repetitions.
3435    23 | READ x/FIELD=1 TO 10 BY 2/SIZE={1,2}/FILE='xyzzy.txt'/FORMAT='2F'.
3436       |                                                              ^~~~
3437
3438 matrix.sps:23.14-23.20: note: READ: This syntax designates record width 10,
3439 which divided by 2 repetitions implies field width 5.
3440    23 | READ x/FIELD=1 TO 10 BY 2/SIZE={1,2}/FILE='xyzzy.txt'/FORMAT='2F'.
3441       |              ^~~~~~~
3442
3443 matrix.sps:23.25: note: READ: This syntax specifies field width 2.
3444    23 | READ x/FIELD=1 TO 10 BY 2/SIZE={1,2}/FILE='xyzzy.txt'/FORMAT='2F'.
3445       |                         ^
3446
3447 matrix.sps:24.27-24.35: error: MATRIX: SIZE must evaluate to a scalar or a 2-
3448 element vector, not a 2×2 matrix.
3449    24 | READ x/FIELD=1 TO 10/SIZE={1,2;3,4}/FILE='matrix.txt'.
3450       |                           ^~~~~~~~~
3451
3452 matrix.sps:25.27-25.33: error: MATRIX: SIZE must evaluate to a scalar or a 2-
3453 element vector, not a 1×3 matrix.
3454    25 | READ x/FIELD=1 TO 10/SIZE={1,2,3}/FILE='matrix.txt'.
3455       |                           ^~~~~~~
3456
3457 matrix.sps:26.28-26.29: error: MATRIX: Matrix dimensions -1×1 specified on SIZE
3458 are outside valid range.
3459    26 | READ x/FIELD=1 TO 10/SIZE={-1}/FILE='matrix.txt'.
3460       |                            ^~
3461
3462 matrix.sps:28: error: MATRIX: Dimensions specified on SIZE differ from
3463 dimensions of destination submatrix.
3464
3465 matrix.sps:28.32-28.36: note: MATRIX: SIZE specifies dimensions 2×2.
3466    28 | READ x(:,:)/FIELD=1 TO 10/SIZE={2,2}/FILE='matrix.txt'.
3467       |                                ^~~~~
3468
3469 matrix.sps:28.6-28.11: note: MATRIX: Destination submatrix has dimensions 1×3.
3470    28 | READ x(:,:)/FIELD=1 TO 10/SIZE={2,2}/FILE='matrix.txt'.
3471       |      ^~~~~~
3472
3473 matrix.sps:29: error: MATRIX: Cannot read non-square 1×3 matrix using READ with
3474 MODE=SYMMETRIC.
3475
3476 matrix.txt:1.1-1.5: warning: Error reading "xyzzy" as format F for matrix row
3477 1, column 1: Field contents are not numeric.
3478
3479 matrix.txt:2.1: warning: Error reading "." as format F for matrix row 2, column
3480 1: Matrix data may not contain missing value.
3481 ])
3482 AT_CLEANUP
3483
3484 AT_SETUP([MATRIX - WRITE])
3485 AT_DATA([matrix.sps], [dnl
3486 MATRIX.
3487 WRITE {1.5, 2; 3, 4.12345}/OUTFILE='matrix.txt'/FIELD=1 TO 80.
3488 WRITE {1.5, 2; 3, 4.12345}/OUTFILE='matrix.txt'/FIELD=1 TO 5.
3489 WRITE {1, 2; 3, 4}/OUTFILE='matrix.txt'/FIELD=1 TO 80 BY 5.
3490 WRITE {1, 2; 3, 4}/OUTFILE='matrix.txt'/FIELD=1 TO 80/FORMAT=F8.2.
3491 WRITE {1, 2; 3, 4}/OUTFILE='matrix.txt'/FIELD=1 TO 80/FORMAT=E.
3492 WRITE {1, 2; 3, 4}/OUTFILE='matrix.txt'/FIELD=1 TO 10 BY 10/FORMAT=E.
3493 WRITE "abcdefhi"/OUTFILE='matrix.txt'/FIELD=1 TO 80/FORMAT=A8.
3494 WRITE "abcdefhi"/OUTFILE='matrix.txt'/FIELD=1 TO 80/FORMAT=A4.
3495 WRITE "abcdefhi"/OUTFILE='matrix.txt'/FIELD=1 TO 80/FORMAT=AHEX12.
3496 END MATRIX.
3497 ])
3498 AT_CHECK([pspp matrix.sps])
3499 AT_CHECK([cat matrix.txt], [0], [dnl
3500  1.5 2
3501  3 4.12345
3502  1.5 2
3503  3
3504  4.12345
3505      1    2
3506      3    4
3507      1.00    2.00
3508      3.00    4.00
3509  1 2
3510  3 4
3511     1.E+000
3512     2.E+000
3513     3.E+000
3514     4.E+000
3515  abcdefhi
3516  abcd
3517  616263646566
3518 ])
3519 AT_CLEANUP
3520
3521 AT_SETUP([MATRIX - WRITE - negative])
3522 AT_DATA([matrix.sps], [dnl
3523 MATRIX.
3524 WRITE !.
3525 WRITE 1/OUTFILE=!.
3526 WRITE 1/ENCODING=!.
3527 WRITE 1/FIELD=!.
3528 WRITE 1/FIELD=1 !.
3529 WRITE 1/FIELD=1 TO 0.
3530 WRITE 1/FIELD=1 TO 10 BY 20.
3531 WRITE 1/FIELD=1 TO 10 BY 6.
3532 WRITE 1/MODE=TRAPEZOIDAL.
3533 WRITE 1/FORMAT=F5/FORMAT=F5.
3534 WRITE 1/FORMAT='5ASDF'.
3535 WRITE 1/FORMAT=ASDF5.
3536 WRITE 1/!.
3537 WRITE 1.
3538 WRITE 1/FIELD=1 TO 10.
3539 WRITE 1/FIELD=1 TO 10/OUTFILE='matrix.txt'/FORMAT='15F'.
3540 WRITE 1/FIELD=1 TO 10 BY 5/OUTFILE='matrix.txt'/FORMAT='5F'.
3541 WRITE 1/FIELD=1 TO 10 BY 5/OUTFILE='matrix.txt'/FORMAT=E.
3542 WRITE 1/FIELD=1 TO 10/OUTFILE='matrix.txt'/FORMAT=A9.
3543 WRITE {1,2}/FIELD=1 TO 10/OUTFILE='matrix.txt'/MODE=TRIANGULAR.
3544 END MATRIX.
3545 ])
3546 AT_CHECK([pspp matrix.sps], [1], [dnl
3547 matrix.sps:2.7: error: WRITE: Syntax error expecting matrix expression.
3548     2 | WRITE !.
3549       |       ^
3550
3551 matrix.sps:3.17: error: WRITE: Syntax error expecting a file name or handle
3552 name.
3553     3 | WRITE 1/OUTFILE=!.
3554       |                 ^
3555
3556 matrix.sps:4.18: error: WRITE: Syntax error expecting string.
3557     4 | WRITE 1/ENCODING=!.
3558       |                  ^
3559
3560 matrix.sps:5.15: error: WRITE: Syntax error expecting positive integer for
3561 FIELD.
3562     5 | WRITE 1/FIELD=!.
3563       |               ^
3564
3565 matrix.sps:6.17: error: WRITE: Syntax error expecting `TO'.
3566     6 | WRITE 1/FIELD=1 !.
3567       |                 ^
3568
3569 matrix.sps:7.20: error: WRITE: Syntax error expecting positive integer for TO.
3570     7 | WRITE 1/FIELD=1 TO 0.
3571       |                    ^
3572
3573 matrix.sps:8.26-8.27: error: WRITE: Syntax error expecting integer between 1
3574 and 10 for BY.
3575     8 | WRITE 1/FIELD=1 TO 10 BY 20.
3576       |                          ^~
3577
3578 matrix.sps:9.15-9.26: error: WRITE: Field width 6 does not evenly divide record
3579 width 10.
3580     9 | WRITE 1/FIELD=1 TO 10 BY 6.
3581       |               ^~~~~~~~~~~~
3582
3583 matrix.sps:9.15-9.21: note: WRITE: This syntax designates the record width.
3584     9 | WRITE 1/FIELD=1 TO 10 BY 6.
3585       |               ^~~~~~~
3586
3587 matrix.sps:9.26: note: WRITE: This syntax specifies the field width.
3588     9 | WRITE 1/FIELD=1 TO 10 BY 6.
3589       |                          ^
3590
3591 matrix.sps:10.14-10.24: error: WRITE: Syntax error expecting RECTANGULAR or
3592 TRIANGULAR.
3593    10 | WRITE 1/MODE=TRAPEZOIDAL.
3594       |              ^~~~~~~~~~~
3595
3596 matrix.sps:11.19-11.24: error: WRITE: Subcommand FORMAT may only be specified
3597 once.
3598    11 | WRITE 1/FORMAT=F5/FORMAT=F5.
3599       |                   ^~~~~~
3600
3601 matrix.sps:12.16-12.22: error: WRITE: Unknown format ASDF.
3602    12 | WRITE 1/FORMAT='5ASDF'.
3603       |                ^~~~~~~
3604
3605 matrix.sps:13.16-13.20: error: WRITE: Unknown format type `ASDF'.
3606    13 | WRITE 1/FORMAT=ASDF5.
3607       |                ^~~~~
3608
3609 matrix.sps:14.9: error: WRITE: Syntax error expecting OUTFILE, FIELD, MODE,
3610 HOLD, or FORMAT.
3611    14 | WRITE 1/!.
3612       |         ^
3613
3614 matrix.sps:15.1-15.8: error: WRITE: Required subcommand FIELD was not
3615 specified.
3616    15 | WRITE 1.
3617       | ^~~~~~~~
3618
3619 matrix.sps:16.1-16.22: error: WRITE: Required subcommand OUTFILE was not
3620 specified.
3621    16 | WRITE 1/FIELD=1 TO 10.
3622       | ^~~~~~~~~~~~~~~~~~~~~~
3623
3624 matrix.sps:17.51-17.55: note: WRITE: This syntax designates the number of
3625 repetitions.
3626    17 | WRITE 1/FIELD=1 TO 10/OUTFILE='matrix.txt'/FORMAT='15F'.
3627       |                                                   ^~~~~
3628
3629 matrix.sps:17.15-17.21: note: WRITE: This syntax designates the record width.
3630    17 | WRITE 1/FIELD=1 TO 10/OUTFILE='matrix.txt'/FORMAT='15F'.
3631       |               ^~~~~~~
3632
3633 matrix.sps:18: error: WRITE: This command specifies two different field widths.
3634
3635 matrix.sps:18.56-18.59: note: WRITE: This syntax specifies 5 repetitions.
3636    18 | WRITE 1/FIELD=1 TO 10 BY 5/OUTFILE='matrix.txt'/FORMAT='5F'.
3637       |                                                        ^~~~
3638
3639 matrix.sps:18.15-18.21: note: WRITE: This syntax designates record width 10,
3640 which divided by 5 repetitions implies field width 2.
3641    18 | WRITE 1/FIELD=1 TO 10 BY 5/OUTFILE='matrix.txt'/FORMAT='5F'.
3642       |               ^~~~~~~
3643
3644 matrix.sps:18.26: note: WRITE: This syntax specifies field width 5.
3645    18 | WRITE 1/FIELD=1 TO 10 BY 5/OUTFILE='matrix.txt'/FORMAT='5F'.
3646       |                          ^
3647
3648 matrix.sps:19: error: WRITE: Output format E5.0 specifies width 5, but E
3649 requires a width between 6 and 40.
3650
3651 matrix.sps:19.56: note: WRITE: This syntax specifies format E.
3652    19 | WRITE 1/FIELD=1 TO 10 BY 5/OUTFILE='matrix.txt'/FORMAT=E.
3653       |                                                        ^
3654
3655 matrix.sps:19.26: note: WRITE: This syntax specifies field width 5.
3656    19 | WRITE 1/FIELD=1 TO 10 BY 5/OUTFILE='matrix.txt'/FORMAT=E.
3657       |                          ^
3658
3659 matrix.sps:20.51-20.52: error: WRITE: Format A9 is too wide for 8-byte matrix
3660 elements.
3661    20 | WRITE 1/FIELD=1 TO 10/OUTFILE='matrix.txt'/FORMAT=A9.
3662       |                                                   ^~
3663
3664 matrix.sps:21.7-21.11: error: MATRIX: WRITE with MODE=TRIANGULAR requires a
3665 square matrix but the matrix to be written has dimensions 1×2.
3666    21 | WRITE {1,2}/FIELD=1 TO 10/OUTFILE='matrix.txt'/MODE=TRIANGULAR.
3667       |       ^~~~~
3668 ])
3669 AT_CLEANUP
3670
3671 AT_SETUP([MATRIX - GET])
3672 AT_DATA([matrix.sps], [dnl
3673 DATA LIST LIST NOTABLE /a b c.
3674 MISSING VALUES a(1) b(5).
3675 BEGIN DATA.
3676 0 0 0
3677 1 2 3
3678 4 5 6
3679 7 8 .
3680 END DATA.
3681
3682 MATRIX.
3683 GET x0 /NAMES=names0.
3684 PRINT x0.
3685 PRINT names0/FORMAT=A8.
3686 END MATRIX.
3687
3688 MATRIX.
3689 GET x1 /VARIABLES=a b c /NAMES=names1 /MISSING=OMIT.
3690 PRINT x1.
3691 PRINT names1/FORMAT=A8.
3692 END MATRIX.
3693
3694 MATRIX.
3695 GET x2 /VARIABLES=a b /NAMES=names2 /MISSING=OMIT.
3696 PRINT x2.
3697 PRINT names2/FORMAT=A8.
3698 END MATRIX.
3699
3700 MATRIX.
3701 GET x3 /FILE=* /VARIABLES=a b c /NAMES=names3 /MISSING=5.
3702 PRINT x3.
3703 PRINT names3/FORMAT=A8.
3704 END MATRIX.
3705
3706 MATRIX.
3707 GET x4 /FILE=* /VARIABLES=a b /NAMES=names4 /MISSING=5.
3708 PRINT x4.
3709 PRINT names4/FORMAT=A8.
3710 END MATRIX.
3711
3712 SAVE OUTFILE='matrix.sav'.
3713 NEW FILE.
3714
3715 MATRIX.
3716 GET x5 /FILE='matrix.sav' /VARIABLES=a b c /NAMES=names5 /MISSING=ACCEPT.
3717 PRINT x5.
3718 PRINT names5/FORMAT=A8.
3719 END MATRIX.
3720
3721 MATRIX.
3722 GET x6 /FILE='matrix.sav' /VARIABLES=a b c /NAMES=names6 /MISSING=ACCEPT /SYSMIS=9.
3723 PRINT x6.
3724 PRINT names6/FORMAT=A8.
3725 END MATRIX.
3726
3727 MATRIX.
3728 GET x7 /FILE='matrix.sav' /VARIABLES=a b c /NAMES=names7 /MISSING=ACCEPT /SYSMIS=OMIT.
3729 PRINT x7.
3730 PRINT names7/FORMAT=A8.
3731 END MATRIX.
3732 ])
3733 AT_CHECK([pspp matrix.sps], [1], [dnl
3734 matrix.sps:11: error: MATRIX: Variable a in case 2 has user-missing value 1.
3735
3736 matrix.sps:12.7-12.8: error: MATRIX: Uninitialized variable x0 used in
3737 expression.
3738    12 | PRINT x0.
3739       |       ^~
3740
3741 names0
3742  a
3743  b
3744  c
3745
3746 matrix.sps:17: error: MATRIX: Variable c in case 4 is system-missing.
3747
3748 matrix.sps:18.7-18.8: error: MATRIX: Uninitialized variable x1 used in
3749 expression.
3750    18 | PRINT x1.
3751       |       ^~
3752
3753 names1
3754  a
3755  b
3756  c
3757
3758 x2
3759   0  0
3760   7  8
3761
3762 names2
3763  a
3764  b
3765
3766 matrix.sps:29: error: MATRIX: Variable c in case 4 is system-missing.
3767
3768 matrix.sps:30.7-30.8: error: MATRIX: Uninitialized variable x3 used in
3769 expression.
3770    30 | PRINT x3.
3771       |       ^~
3772
3773 names3
3774  a
3775  b
3776  c
3777
3778 x4
3779   0  0
3780   5  2
3781   4  5
3782   7  8
3783
3784 names4
3785  a
3786  b
3787
3788 matrix.sps:44: error: MATRIX: Variable c in case 4 is system-missing.
3789
3790 matrix.sps:45.7-45.8: error: MATRIX: Uninitialized variable x5 used in
3791 expression.
3792    45 | PRINT x5.
3793       |       ^~
3794
3795 names5
3796  a
3797  b
3798  c
3799
3800 x6
3801   0  0  0
3802   1  2  3
3803   4  5  6
3804   7  8  9
3805
3806 names6
3807  a
3808  b
3809  c
3810
3811 x7
3812   0  0  0
3813   1  2  3
3814   4  5  6
3815
3816 names7
3817  a
3818  b
3819  c
3820 ])
3821 AT_CLEANUP
3822
3823 AT_SETUP([MATRIX - GET - negative])
3824 AT_DATA([matrix.sps], [dnl
3825 DATA LIST LIST NOTABLE /a b c * d(a1).
3826 MISSING VALUES a(1) b(5).
3827 BEGIN DATA.
3828 0 0 0 a
3829 1 2 3 b
3830 4 5 6 b
3831 7 8 . d
3832 END DATA.
3833 SAVE OUTFILE='matrix.sav'.
3834
3835 MATRIX.
3836 GET !.
3837 GET x/VARIABLES=!.
3838 GET x/FILE=!.
3839 GET x/ENCODING=!.
3840 GET x/NAMES=!.
3841 GET x/MISSING=!.
3842 GET x/SYSMIS=!.
3843 GET x/!.
3844 GET x/VARIABLES=!.
3845 GET x/VARIABLES=x TO !.
3846 GET x/VARIABLES=x.
3847 GET x/VARIABLES=c TO a.
3848 GET x/VARIABLES=d.
3849 GET x.
3850 END MATRIX.
3851
3852 NEW FILE.
3853 MATRIX.
3854 GET x/VARIABLES=a.
3855 END MATRIX.
3856 ])
3857 AT_CHECK([pspp matrix.sps], [1], [dnl
3858 matrix.sps:12.5: error: GET: Syntax error expecting identifier.
3859    12 | GET !.
3860       |     ^
3861
3862 matrix.sps:13.17: error: GET: Syntax error expecting variable name.
3863    13 | GET x/VARIABLES=!.
3864       |                 ^
3865
3866 matrix.sps:14.12: error: GET: Syntax error expecting a file name or handle
3867 name.
3868    14 | GET x/FILE=!.
3869       |            ^
3870
3871 matrix.sps:15.16: error: GET: Syntax error expecting string.
3872    15 | GET x/ENCODING=!.
3873       |                ^
3874
3875 matrix.sps:16.13: error: GET: Syntax error expecting identifier.
3876    16 | GET x/NAMES=!.
3877       |             ^
3878
3879 matrix.sps:17.15: error: GET: Syntax error expecting ACCEPT or OMIT or a number
3880 for MISSING.
3881    17 | GET x/MISSING=!.
3882       |               ^
3883
3884 matrix.sps:18.14: error: GET: Syntax error expecting OMIT or a number for
3885 SYSMIS.
3886    18 | GET x/SYSMIS=!.
3887       |              ^
3888
3889 matrix.sps:19.7: error: GET: Syntax error expecting FILE, VARIABLES, NAMES,
3890 MISSING, or SYSMIS.
3891    19 | GET x/!.
3892       |       ^
3893
3894 matrix.sps:20.17: error: GET: Syntax error expecting variable name.
3895    20 | GET x/VARIABLES=!.
3896       |                 ^
3897
3898 matrix.sps:21.22: error: GET: Syntax error expecting variable name.
3899    21 | GET x/VARIABLES=x TO !.
3900       |                      ^
3901
3902 matrix.sps:22.17: error: MATRIX: x is not a variable name.
3903    22 | GET x/VARIABLES=x.
3904       |                 ^
3905
3906 matrix.sps:23.17-23.22: error: MATRIX: c TO a is not valid syntax since c
3907 precedes a in the dictionary.
3908    23 | GET x/VARIABLES=c TO a.
3909       |                 ^~~~~~
3910
3911 matrix.sps:24.17: error: MATRIX: d is not a numeric variable.
3912    24 | GET x/VARIABLES=d.
3913       |                 ^
3914
3915 matrix.sps:25: error: MATRIX: Variable d is not numeric.
3916
3917 matrix.sps:30: error: MATRIX: The GET command cannot read an empty active file.
3918 ])
3919 AT_CLEANUP
3920
3921 AT_SETUP([MATRIX - SAVE])
3922 AT_DATA([matrix.sps], [dnl
3923 MATRIX.
3924 SAVE {1,2,3; 4,5,6}/OUTFILE='matrix.sav'.
3925 SAVE {7,8,9}/VARIABLES=a b c d.
3926
3927 SAVE {1,2,3}/OUTFILE='matrix2.sav'/VARIABLES=v01 TO v03.
3928 SAVE {4,5,6}/NAMES={'x', 'y', 'z', 'w'}.
3929
3930 SAVE {1,'abcd',3}/OUTFILE='matrix3.sav'/NAMES={'a', 'b', 'c'}/STRINGS=b.
3931 SAVE {4,'xyzw',6}/STRINGS=a, b.
3932 END MATRIX.
3933 ])
3934 AT_CHECK([pspp matrix.sps])
3935 AT_CHECK([pspp-convert matrix.sav matrix.csv && cat matrix.csv], [0], [dnl
3936 COL1,COL2,COL3
3937 1,2,3
3938 4,5,6
3939 7,8,9
3940 ])
3941 AT_CHECK([pspp-convert matrix2.sav matrix2.csv && cat matrix2.csv], [0], [dnl
3942 v01,v02,v03
3943 1,2,3
3944 4,5,6
3945 ])
3946 AT_CHECK([pspp-convert matrix3.sav matrix3.csv && cat matrix3.csv], [0], [dnl
3947 a,b,c
3948 1,abcd,3
3949 4,xyzw,6
3950 ])
3951 AT_CLEANUP
3952
3953 AT_SETUP([MATRIX - SAVE - inline])
3954 AT_DATA([matrix.sps], [dnl
3955 MATRIX.
3956 SAVE {1,2,3; 4,5,6}/OUTFILE=*.
3957 SAVE {7,8,9}/VARIABLES=a b c d.
3958 END MATRIX.
3959 LIST.
3960
3961 MATRIX.
3962 SAVE {1,2,3}/OUTFILE=*/VARIABLES=v01 TO v03.
3963 SAVE {4,5,6}/NAMES={'x', 'y', 'z', 'w'}.
3964 END MATRIX.
3965 LIST.
3966
3967 MATRIX.
3968 SAVE {1,'abcd',3}/OUTFILE=*/NAMES={'a', 'b', 'c'}/STRINGS=b.
3969 SAVE {4,'xyzw',6}/STRINGS=a, b.
3970 END MATRIX.
3971 LIST.
3972 ])
3973 AT_CHECK([pspp matrix.sps -O format=csv], [0], [dnl
3974 Table: Data List
3975 COL1,COL2,COL3
3976 1.00,2.00,3.00
3977 4.00,5.00,6.00
3978 7.00,8.00,9.00
3979
3980 Table: Data List
3981 v01,v02,v03
3982 1.00,2.00,3.00
3983 4.00,5.00,6.00
3984
3985 Table: Data List
3986 a,b,c
3987 1.00,abcd,3.00
3988 4.00,xyzw,6.00
3989 ])
3990 AT_CLEANUP
3991
3992 AT_SETUP([MATRIX - SAVE - negative])
3993 AT_DATA([matrix.sps], [dnl
3994 MATRIX.
3995 SAVE !.
3996 SAVE 1/OUTFILE=!.
3997 SAVE 1/VARIABLES=!.
3998 SAVE 1/NAMES=!.
3999 SAVE 1/!.
4000 SAVE 1.
4001 SAVE 1/OUTFILE='matrix.sav'/NAMES={'a'}/VARIABLES=a.
4002 SAVE 1/OUTFILE='matrix2.sav'.
4003 SAVE {1,2}/OUTFILE='matrix2.sav'.
4004 SAVE {1,2}/OUTFILE='matrix3.sav'/NAMES={'a', 'a'}.
4005 SAVE {1,2}/OUTFILE='matrix4.sav'/STRINGS=a.
4006 SAVE {1,2}/OUTFILE='matrix5.sav'/STRINGS=a, b.
4007 END MATRIX.
4008 ])
4009 AT_CHECK([pspp matrix.sps], [1], [dnl
4010 matrix.sps:2.6: error: SAVE: Syntax error expecting matrix expression.
4011     2 | SAVE !.
4012       |      ^
4013
4014 matrix.sps:3.16: error: SAVE: Syntax error expecting a file name or handle
4015 name.
4016     3 | SAVE 1/OUTFILE=!.
4017       |                ^
4018
4019 matrix.sps:4.18: error: SAVE: Syntax error expecting variable name.
4020     4 | SAVE 1/VARIABLES=!.
4021       |                  ^
4022
4023 matrix.sps:5.14: error: SAVE: Syntax error expecting matrix expression.
4024     5 | SAVE 1/NAMES=!.
4025       |              ^
4026
4027 matrix.sps:6.8: error: SAVE: Syntax error expecting OUTFILE, VARIABLES, NAMES,
4028 or STRINGS.
4029     6 | SAVE 1/!.
4030       |        ^
4031
4032 matrix.sps:7.1-7.7: error: SAVE: Required subcommand OUTFILE was not specified.
4033     7 | SAVE 1.
4034       | ^~~~~~~
4035
4036 matrix.sps:8.35-8.39: warning: SAVE: Ignoring NAMES because VARIABLES was also
4037 specified.
4038     8 | SAVE 1/OUTFILE='matrix.sav'/NAMES={'a'}/VARIABLES=a.
4039       |                                   ^~~~~
4040
4041 matrix.sps:10: error: MATRIX: Cannot save 1×2 matrix to `matrix2.sav' because
4042 the first SAVE to `matrix2.sav' in this matrix program wrote a 1-column matrix.
4043
4044 matrix.sps:9: error: MATRIX: This is the location of the first SAVE to
4045 `matrix2.sav'.
4046
4047 error: Duplicate variable name a in SAVE statement.
4048
4049 error: The SAVE command STRINGS subcommand specifies an unknown variable a.
4050
4051 error: The SAVE command STRINGS subcommand specifies 2 unknown variables,
4052 including a.
4053 ])
4054 AT_CLEANUP
4055
4056 AT_SETUP([MATRIX - MGET])
4057 AT_DATA([matrix.sps], [dnl
4058 MATRIX DATA
4059     VARIABLES=ROWTYPE_ var01 TO var08.
4060 BEGIN DATA.
4061 MEAN  24.3   5.4  69.7  20.1  13.4   2.7  27.9   3.7
4062 SD     5.7   1.5  23.5   5.8   2.8   4.5   5.4   1.5
4063 N       92    92    92    92    92    92    92    92
4064 CORR  1.00
4065 CORR   .18  1.00
4066 CORR  -.22  -.17  1.00
4067 CORR   .36   .31  -.14  1.00
4068 CORR   .27   .16  -.12   .22  1.00
4069 CORR   .33   .15  -.17   .24   .21  1.00
4070 CORR   .50   .29  -.20   .32   .12   .38  1.00
4071 CORR   .17   .29  -.05   .20   .27   .20   .04  1.00
4072 END DATA.
4073
4074 MATRIX.
4075 MGET.
4076 PRINT MN/FORMAT=F5.1.
4077 PRINT SD/FORMAT=F5.1.
4078 PRINT NC/FORMAT=F5.0.
4079 PRINT CR/FORMAT=F5.2.
4080 END MATRIX.
4081 ])
4082 AT_CHECK([pspp matrix.sps -O format=csv], [0], [dnl
4083 Table: Matrix Variables Created by MGET
4084 ,Dimensions,
4085 ,Rows,Columns
4086 MN,1,8
4087 SD,1,8
4088 NC,1,8
4089 CR,8,8
4090
4091 MN
4092 24.3   5.4  69.7  20.1  13.4   2.7  27.9   3.7
4093
4094 SD
4095 5.7   1.5  23.5   5.8   2.8   4.5   5.4   1.5
4096
4097 NC
4098 92    92    92    92    92    92    92    92
4099
4100 CR
4101 1.00   .18  -.22   .36   .27   .33   .50   .17
4102 .18  1.00  -.17   .31   .16   .15   .29   .29
4103 -.22  -.17  1.00  -.14  -.12  -.17  -.20  -.05
4104 .36   .31  -.14  1.00   .22   .24   .32   .20
4105 .27   .16  -.12   .22  1.00   .21   .12   .27
4106 .33   .15  -.17   .24   .21  1.00   .38   .20
4107 .50   .29  -.20   .32   .12   .38  1.00   .04
4108 .17   .29  -.05   .20   .27   .20   .04  1.00
4109 ])
4110 AT_CLEANUP
4111
4112 AT_SETUP([MATRIX - MGET with split variables])
4113 AT_DATA([matrix.sps], [dnl
4114 matrix data
4115     variables = s1 s2 rowtype_  var01 var02 var03
4116     /split=s1 s2.
4117
4118 begin data
4119 8 0   mean     21.4  5.0  72.9
4120 8 0   sd       6.5   1.6  22.8
4121 8 0   n        106   106  106
4122 8 0   corr     1
4123 8 0   corr    .41  1
4124 8 0   corr    -.16  -.22  1
4125 8 1   mean     11.4  1.0  52.9
4126 8 1   sd       9.5   8.6  12.8
4127 8 1   n        10   11  12
4128 8 1   corr     1
4129 8 1   corr    .51  1
4130 8 1   corr    .36  -.41  1
4131 end data.
4132
4133 MATRIX.
4134 MGET.
4135 PRINT MNS1/FORMAT=F5.1.
4136 PRINT SDS1/FORMAT=F5.1.
4137 PRINT NCS1/FORMAT=F5.0.
4138 PRINT CRS1/FORMAT=F5.2.
4139 PRINT MNS2/FORMAT=F5.1.
4140 PRINT SDS2/FORMAT=F5.1.
4141 PRINT NCS2/FORMAT=F5.0.
4142 PRINT CRS2/FORMAT=F5.2.
4143 END MATRIX.
4144 ])
4145 AT_CHECK([pspp -O format=csv matrix.sps], [0], [dnl
4146 Table: Matrix Variables Created by MGET
4147 ,Split Values,,Dimensions,
4148 ,s1,s2,Rows,Columns
4149 MNS1,8,0,1,3
4150 SDS1,8,0,1,3
4151 NCS1,8,0,1,3
4152 CRS1,8,0,3,3
4153 MNS2,8,1,1,3
4154 SDS2,8,1,1,3
4155 NCS2,8,1,1,3
4156 CRS2,8,1,3,3
4157
4158 MNS1
4159 21.4   5.0  72.9
4160
4161 SDS1
4162 6.5   1.6  22.8
4163
4164 NCS1
4165 106   106   106
4166
4167 CRS1
4168 1.00   .41  -.16
4169 .41  1.00  -.22
4170 -.16  -.22  1.00
4171
4172 MNS2
4173 11.4   1.0  52.9
4174
4175 SDS2
4176 9.5   8.6  12.8
4177
4178 NCS2
4179 10    11    12
4180
4181 CRS2
4182 1.00   .51   .36
4183 .51  1.00  -.41
4184 .36  -.41  1.00
4185 ])
4186 AT_CLEANUP
4187
4188 AT_SETUP([MATRIX - MGET with factor variables])
4189 AT_DATA([matrix.sps], [dnl
4190 MATRIX DATA
4191     VARIABLES=ROWTYPE_ f1 var01 TO var04
4192     /FACTOR=f1.
4193 BEGIN DATA.
4194 MEAN 0 34 35 36 37
4195 SD   0 22 11 55 66
4196 N    0 99 98 99 92
4197 MEAN 1 44 45 34 39
4198 SD   1 23 15 51 46
4199 N    1 98 34 87 23
4200 CORR .  1
4201 CORR . .9  1
4202 CORR . .8 .6  1
4203 CORR . .7 .5 .4  1
4204 END DATA.
4205 FORMATS var01 TO var04(F5.1).
4206 SAVE OUTFILE='matrix.sav'.
4207 ])
4208 AT_DATA([matrix2.sps], [dnl
4209 MATRIX.
4210 MGET FILE='matrix.sav'.
4211 PRINT MNF1/FORMAT=F2.0.
4212 PRINT SDF1/FORMAT=F2.0.
4213 PRINT NCF1/FORMAT=F2.0.
4214 PRINT MNF2/FORMAT=F2.0.
4215 PRINT SDF2/FORMAT=F2.0.
4216 PRINT NCF2/FORMAT=F2.0.
4217 PRINT CR/FORMAT=F3.1.
4218 END MATRIX.
4219 ])
4220 AT_CHECK([pspp matrix.sps])
4221 AT_CHECK([pspp -O format=csv matrix2.sps], [0], [dnl
4222 Table: Matrix Variables Created by MGET
4223 ,Factors,Dimensions,
4224 ,f1,Rows,Columns
4225 MNF1,0,1,4
4226 SDF1,0,1,4
4227 NCF1,0,1,4
4228 MNF2,1,1,4
4229 SDF2,1,1,4
4230 NCF2,1,1,4
4231 CR,.,4,4
4232
4233 MNF1
4234 34 35 36 37
4235
4236 SDF1
4237 22 11 55 66
4238
4239 NCF1
4240 99 98 99 92
4241
4242 MNF2
4243 44 45 34 39
4244
4245 SDF2
4246 23 15 51 46
4247
4248 NCF2
4249 98 34 87 23
4250
4251 CR
4252 1.0  .9  .8  .7
4253 .9 1.0  .6  .5
4254 .8  .6 1.0  .4
4255 .7  .5  .4 1.0
4256 ])
4257 AT_CLEANUP
4258
4259 AT_SETUP([MATRIX - MGET with factor and split variables])
4260 AT_DATA([matrix.sps], [dnl
4261 matrix data
4262     variables = s f rowtype_  var01 var02 var03
4263     /split=s
4264     /factor=f.
4265
4266 begin data
4267 8 0   mean     21.4  5.0  72.9
4268 8 0   sd       6.5   1.6  22.8
4269 8 0   n        106   106  106
4270 8 .   corr     1
4271 8 .   corr    .41  1
4272 8 .   corr    -.16  -.22  1
4273 9 1   mean     11.4  1.0  52.9
4274 9 1   sd       9.5   8.6  12.8
4275 9 1   n        10   11  12
4276 9 .   corr     1
4277 9 .   corr    .51  1
4278 9 .   corr    .36  -.41  1
4279 end data.
4280
4281 MATRIX.
4282 MGET.
4283 PRINT MNF1S1/FORMAT=F5.1.
4284 PRINT SDF1S1/FORMAT=F5.1.
4285 PRINT NCF1S1/FORMAT=F5.0.
4286 PRINT CRS1/FORMAT=F5.2.
4287 PRINT MNF1S2/FORMAT=F5.1.
4288 PRINT SDF1S2/FORMAT=F5.1.
4289 PRINT NCF1S2/FORMAT=F5.0.
4290 PRINT CRS2/FORMAT=F5.2.
4291 END MATRIX.
4292 ])
4293 AT_CHECK([pspp matrix.sps -O format=csv], [0], [dnl
4294 Table: Matrix Variables Created by MGET
4295 ,Split Values,Factors,Dimensions,
4296 ,s,f,Rows,Columns
4297 MNF1S1,8,0,1,3
4298 SDF1S1,8,0,1,3
4299 NCF1S1,8,0,1,3
4300 CRS1,8,.,3,3
4301 MNF1S2,9,1,1,3
4302 SDF1S2,9,1,1,3
4303 NCF1S2,9,1,1,3
4304 CRS2,9,.,3,3
4305
4306 MNF1S1
4307 21.4   5.0  72.9
4308
4309 SDF1S1
4310 6.5   1.6  22.8
4311
4312 NCF1S1
4313 106   106   106
4314
4315 CRS1
4316 1.00   .41  -.16
4317 .41  1.00  -.22
4318 -.16  -.22  1.00
4319
4320 MNF1S2
4321 11.4   1.0  52.9
4322
4323 SDF1S2
4324 9.5   8.6  12.8
4325
4326 NCF1S2
4327 10    11    12
4328
4329 CRS2
4330 1.00   .51   .36
4331 .51  1.00  -.41
4332 .36  -.41  1.00
4333 ])
4334 AT_CLEANUP
4335
4336 AT_SETUP([MATRIX - MGET with TYPE])
4337 AT_DATA([matrix.sps], [dnl
4338 MATRIX DATA
4339     VARIABLES=ROWTYPE_ f1 var01 TO var04
4340     /FACTOR=f1.
4341 BEGIN DATA.
4342 MEAN 0 34 35 36 37
4343 SD   0 22 11 55 66
4344 N    0 99 98 99 92
4345 MEAN 1 44 45 34 39
4346 SD   1 23 15 51 46
4347 N    1 98 34 87 23
4348 CORR .  1
4349 CORR . .9  1
4350 CORR . .8 .6  1
4351 CORR . .7 .5 .4  1
4352 END DATA.
4353 FORMATS var01 TO var04(F5.1).
4354 SAVE OUTFILE='matrix.sav'.
4355 ])
4356 AT_DATA([matrix2.sps], [dnl
4357 MATRIX.
4358 MGET/FILE='matrix.sav'/TYPE=CORR.
4359 PRINT CR/FORMAT=F3.1.
4360 END MATRIX.
4361 ])
4362 AT_CHECK([pspp matrix.sps])
4363 AT_CHECK([pspp -O format=csv matrix2.sps], [0], [dnl
4364 Table: Matrix Variables Created by MGET
4365 ,Factors,Dimensions,
4366 ,f1,Rows,Columns
4367 CR,.,4,4
4368
4369 CR
4370 1.0  .9  .8  .7
4371 .9 1.0  .6  .5
4372 .8  .6 1.0  .4
4373 .7  .5  .4 1.0
4374 ])
4375 AT_CLEANUP
4376
4377 AT_SETUP([MATRIX - MGET - negative - parsing])
4378 AT_DATA([matrix.sps], [dnl
4379 MATRIX.
4380 MGET !.
4381 MGET FILE=!.
4382 MGET ENCODING=!.
4383 MGET TYPE=!.
4384 MGET TYPE=CORR !.
4385 END MATRIX.
4386 ])
4387 AT_CHECK([pspp matrix.sps], [1], [dnl
4388 matrix.sps:2.6: error: MGET: Syntax error expecting FILE or TYPE.
4389     2 | MGET !.
4390       |      ^
4391
4392 matrix.sps:3.11: error: MGET: Syntax error expecting a file name or handle
4393 name.
4394     3 | MGET FILE=!.
4395       |           ^
4396
4397 matrix.sps:4.15: error: MGET: Syntax error expecting string.
4398     4 | MGET ENCODING=!.
4399       |               ^
4400
4401 matrix.sps:5.11: error: MGET: Syntax error expecting COV, CORR, MEAN, STDDEV,
4402 N, or COUNT.
4403     5 | MGET TYPE=!.
4404       |           ^
4405
4406 matrix.sps:6.16: error: MGET: Syntax error expecting COV, CORR, MEAN, STDDEV,
4407 N, or COUNT.
4408     6 | MGET TYPE=CORR !.
4409       |                ^
4410 ])
4411 AT_CLEANUP
4412
4413 AT_SETUP([MATRIX - MGET - missing VARNAME_ and ROWTYPE_])
4414 AT_DATA([matrix.sps], [dnl
4415 DATA LIST LIST NOTABLE /x.
4416 BEGIN DATA.
4417 1
4418 END DATA.
4419
4420 MATRIX.
4421 MGET.
4422 END MATRIX.
4423 ])
4424 AT_CHECK([pspp matrix.sps], [1], [dnl
4425 matrix.sps:7: error: MATRIX: Matrix data file lacks ROWTYPE_ variable.
4426
4427 matrix.sps:7: error: MATRIX: Matrix data file lacks VARNAME_ variable.
4428 ])
4429 AT_CLEANUP
4430
4431 AT_SETUP([MATRIX - MGET - wrong format for VARNAME_ and ROWTYPE_])
4432 AT_DATA([matrix.sps], [dnl
4433 DATA LIST LIST NOTABLE /VARNAME_ * ROWTYPE_ (A7).
4434 BEGIN DATA.
4435 1 asdf
4436 END DATA.
4437
4438 MATRIX.
4439 MGET.
4440 END MATRIX.
4441 ])
4442 AT_CHECK([pspp matrix.sps], [1], [dnl
4443 matrix.sps:7: error: MATRIX: ROWTYPE_ variable in matrix data file must be 8-
4444 byte string, but it has width 7.
4445
4446 matrix.sps:7: error: MATRIX: VARNAME_ variable in matrix data file must be 8-
4447 byte string, but it has width 0.
4448 ])
4449 AT_CLEANUP
4450
4451 AT_SETUP([MATRIX - MGET - wrong order for VARNAME_ and ROWTYPE_])
4452 AT_DATA([matrix.sps], [dnl
4453 DATA LIST LIST NOTABLE /VARNAME_ ROWTYPE_ (A8).
4454 BEGIN DATA.
4455 asdf jkl;
4456 END DATA.
4457
4458 MATRIX.
4459 MGET.
4460 END MATRIX.
4461 ])
4462 AT_CHECK([pspp matrix.sps], [1], [dnl
4463 matrix.sps:7: error: MATRIX: ROWTYPE_ must precede VARNAME_ in matrix data
4464 file.
4465 ])
4466 AT_CLEANUP
4467
4468 AT_SETUP([MATRIX - MGET - no continuous variables])
4469 AT_DATA([matrix.sps], [dnl
4470 DATA LIST LIST NOTABLE /ROWTYPE_ VARNAME_ (A8).
4471 BEGIN DATA.
4472 asdf jkl;
4473 END DATA.
4474
4475 MATRIX.
4476 MGET.
4477 END MATRIX.
4478 ])
4479 AT_CHECK([pspp matrix.sps], [1], [dnl
4480 matrix.sps:7: error: MATRIX: Matrix data file contains no continuous variables.
4481 ])
4482 AT_CLEANUP
4483
4484 AT_SETUP([MATRIX - MGET - unexpected string variables])
4485 AT_DATA([matrix.sps], [dnl
4486 DATA LIST LIST NOTABLE /ROWTYPE_ VARNAME_ cvar1 (A8).
4487 BEGIN DATA.
4488 asdf jkl; zxcv
4489 END DATA.
4490
4491 MATRIX.
4492 MGET.
4493 END MATRIX.
4494 ])
4495 AT_CHECK([pspp matrix.sps], [1], [dnl
4496 matrix.sps:7: error: MATRIX: Matrix data file contains unexpected string
4497 variable cvar1.
4498 ])
4499 AT_CLEANUP
4500
4501 AT_SETUP([MATRIX - MGET - unknown ROWTYPE_])
4502 AT_DATA([matrix.sps], [dnl
4503 DATA LIST LIST NOTABLE /ROWTYPE_ VARNAME_ (A8) cvar1.
4504 BEGIN DATA.
4505 asdf jkl; 1
4506 END DATA.
4507
4508 MATRIX.
4509 MGET.
4510 END MATRIX.
4511 ])
4512 AT_CHECK([pspp matrix.sps -O format=csv], [1], [dnl
4513 "matrix.sps:7: error: MATRIX: Matrix data file contains unknown ROWTYPE_ ""asdf""."
4514 ])
4515 AT_CLEANUP
4516
4517 AT_SETUP([MATRIX - MGET - duplicate matrix variable name])
4518 AT_DATA([matrix.sps], [dnl
4519 DATA LIST LIST NOTABLE /ROWTYPE_ VARNAME_ (A8) cvar1.
4520 BEGIN DATA.
4521 corr jkl; 1
4522 END DATA.
4523
4524 MATRIX.
4525 MGET.
4526 MGET.
4527 END MATRIX.
4528 ])
4529 AT_CHECK([pspp matrix.sps -O format=csv], [0], [dnl
4530 Table: Matrix Variables Created by MGET
4531 ,Dimensions,
4532 ,Rows,Columns
4533 CR,1,1
4534
4535 matrix.sps:8: warning: MATRIX: Matrix data file contains variable with existing name CR.
4536 ])
4537 AT_CLEANUP
4538
4539 AT_SETUP([MATRIX - MGET - missing values in input])
4540 AT_DATA([matrix.sps], [dnl
4541 DATA LIST LIST NOTABLE /s1 * ROWTYPE_ VARNAME_ (A8) cvar1 cvar2.
4542 BEGIN DATA.
4543 1 n "" 1 .
4544 2 n "" . .
4545 END DATA.
4546
4547 MATRIX.
4548 MGET.
4549 PRINT ncs1/FORMAT=F5.
4550 PRINT ncs2/FORMAT=F5.
4551 END MATRIX.
4552 ])
4553 AT_CHECK([pspp matrix.sps -O format=csv], [1], [dnl
4554 "matrix.sps:8: error: MATRIX: Matrix data file variable NCS1 contains a missing value, which was treated as zero."
4555
4556 "matrix.sps:8: error: MATRIX: Matrix data file variable NCS2 contains 2 missing values, which were treated as zero."
4557
4558 Table: Matrix Variables Created by MGET
4559 ,Split Values,Dimensions,
4560 ,s1,Rows,Columns
4561 NCS1,1.00,1,2
4562 NCS2,2.00,1,2
4563
4564 ncs1
4565 1     0
4566
4567 ncs2
4568 0     0
4569 ])
4570 AT_CLEANUP
4571
4572 AT_SETUP([MATRIX - MSAVE])
4573 AT_DATA([matrix.sps], [dnl
4574 MATRIX.
4575 MSAVE {1, 2; 3, 4}/TYPE=CORR/VARIABLES=X,Y/OUTFILE='matrix.sav'.
4576 MSAVE {5, 6; 7, 8; 9, 10}/TYPE=COV/VARIABLES=X,Y.
4577 MSAVE {11, 12}/TYPE=MEAN.
4578 MSAVE {13, 14}/TYPE=STDDEV.
4579 MSAVE {15, 16}/TYPE=N.
4580 MSAVE {17, 18}/TYPE=COUNT.
4581 END MATRIX.
4582 GET 'matrix.sav'.
4583 LIST.
4584 ])
4585 AT_CHECK([pspp matrix.sps -O format=csv], [0], [dnl
4586 Table: Data List
4587 ROWTYPE_,VARNAME_,X,Y
4588 CORR,X,1.00,2.00
4589 CORR,Y,3.00,4.00
4590 COV,X,5.00,6.00
4591 COV,Y,7.00,8.00
4592 COV,,9.00,10.00
4593 MEAN,,11.00,12.00
4594 STDDEV,,13.00,14.00
4595 N,,15.00,16.00
4596 COUNT,,17.00,18.00
4597 ])
4598 AT_CLEANUP
4599
4600 AT_SETUP([MATRIX - MSAVE with factor variables])
4601 AT_DATA([matrix.sps], [dnl
4602 MATRIX.
4603 MSAVE {1, 2; 3, 4}/TYPE=CORR/FACTOR={1,1}/FNAMES=X,Y/OUTFILE='matrix.sav'.
4604 MSAVE {5, 6; 7, 8; 9, 10}/TYPE=COV.
4605 MSAVE {11, 12}/TYPE=MEAN.
4606 MSAVE {13, 14}/FACTOR={2,1}/TYPE=STDDEV.
4607 MSAVE {15, 16}/TYPE=N.
4608 MSAVE {17, 18}/FACTOR={1,2}/TYPE=COUNT.
4609 END MATRIX.
4610 GET 'matrix.sav'.
4611 LIST.
4612
4613 MATRIX.
4614 MSAVE {1, 2; 3, 4}/TYPE=CORR/FACTOR={5,6,7,8}/OUTFILE='matrix2.sav'.
4615 END MATRIX.
4616 GET 'matrix2.sav'.
4617 LIST.
4618 ])
4619 AT_CHECK([pspp matrix.sps -O format=csv], [0], [dnl
4620 Table: Data List
4621 ROWTYPE_,X,Y,VARNAME_,COL1,COL2
4622 CORR,1.00,1.00,COL1,1.00,2.00
4623 CORR,1.00,1.00,COL2,3.00,4.00
4624 COV,1.00,1.00,COL1,5.00,6.00
4625 COV,1.00,1.00,COL2,7.00,8.00
4626 COV,1.00,1.00,,9.00,10.00
4627 MEAN,1.00,1.00,,11.00,12.00
4628 STDDEV,2.00,1.00,,13.00,14.00
4629 N,2.00,1.00,,15.00,16.00
4630 COUNT,1.00,2.00,,17.00,18.00
4631
4632 Table: Data List
4633 ROWTYPE_,FAC1,FAC2,FAC3,FAC4,VARNAME_,COL1,COL2
4634 CORR,5.00,6.00,7.00,8.00,COL1,1.00,2.00
4635 CORR,5.00,6.00,7.00,8.00,COL2,3.00,4.00
4636 ])
4637 AT_CLEANUP
4638
4639 AT_SETUP([MATRIX - MSAVE with split variables])
4640 AT_DATA([matrix.sps], [dnl
4641 MATRIX.
4642 MSAVE {1, 2; 3, 4}/TYPE=CORR/SPLIT={1,1}/SNAMES=X,Y/OUTFILE='matrix.sav'.
4643 MSAVE {5, 6; 7, 8; 9, 10}/TYPE=COV.
4644 MSAVE {11, 12}/TYPE=MEAN.
4645 MSAVE {13, 14}/SPLIT={2,1}/TYPE=STDDEV.
4646 MSAVE {15, 16}/TYPE=N.
4647 MSAVE {17, 18}/SPLIT={1,2}/TYPE=COUNT.
4648 END MATRIX.
4649 GET 'matrix.sav'.
4650 LIST.
4651
4652 MATRIX.
4653 MSAVE {1, 2; 3, 4}/TYPE=CORR/SPLIT={5,6,7,8}/OUTFILE='matrix2.sav'.
4654 END MATRIX.
4655 GET 'matrix2.sav'.
4656 LIST.
4657 ])
4658 AT_CHECK([pspp matrix.sps -O format=csv], [0], [dnl
4659 Table: Data List
4660 X,Y,ROWTYPE_,VARNAME_,COL1,COL2
4661 1.00,1.00,CORR,COL1,1.00,2.00
4662 1.00,1.00,CORR,COL2,3.00,4.00
4663 1.00,1.00,COV,COL1,5.00,6.00
4664 1.00,1.00,COV,COL2,7.00,8.00
4665 1.00,1.00,COV,,9.00,10.00
4666 1.00,1.00,MEAN,,11.00,12.00
4667 2.00,1.00,STDDEV,,13.00,14.00
4668 2.00,1.00,N,,15.00,16.00
4669 1.00,2.00,COUNT,,17.00,18.00
4670
4671 Table: Data List
4672 SPL1,SPL2,SPL3,SPL4,ROWTYPE_,VARNAME_,COL1,COL2
4673 5.00,6.00,7.00,8.00,CORR,COL1,1.00,2.00
4674 5.00,6.00,7.00,8.00,CORR,COL2,3.00,4.00
4675 ])
4676 AT_CLEANUP
4677
4678 AT_SETUP([MATRIX - MSAVE with factor and split variables])
4679 AT_DATA([matrix.sps], [dnl
4680 MATRIX.
4681 MSAVE {1, 2; 3, 4}/TYPE=CORR/SPLIT=1/FACTOR=1/OUTFILE='matrix.sav'.
4682 MSAVE {5, 6; 7, 8; 9, 10}/TYPE=COV.
4683 MSAVE {11, 12}/FACTOR=2/TYPE=MEAN.
4684 MSAVE {13, 14}/FACTOR=1/SPLIT=2/TYPE=STDDEV.
4685 MSAVE {15, 16}/TYPE=N.
4686 MSAVE {17, 18}/FACTOR=2/TYPE=COUNT.
4687 END MATRIX.
4688 GET 'matrix.sav'.
4689 LIST.
4690 ])
4691 AT_CHECK([pspp matrix.sps -O format=csv], [0], [dnl
4692 Table: Data List
4693 SPL1,ROWTYPE_,FAC1,VARNAME_,COL1,COL2
4694 1.00,CORR,1.00,COL1,1.00,2.00
4695 1.00,CORR,1.00,COL2,3.00,4.00
4696 1.00,COV,1.00,COL1,5.00,6.00
4697 1.00,COV,1.00,COL2,7.00,8.00
4698 1.00,COV,1.00,,9.00,10.00
4699 1.00,MEAN,2.00,,11.00,12.00
4700 2.00,STDDEV,1.00,,13.00,14.00
4701 2.00,N,1.00,,15.00,16.00
4702 2.00,COUNT,2.00,,17.00,18.00
4703 ])
4704 AT_CLEANUP
4705
4706 AT_SETUP([MATRIX - MSAVE - negative])
4707 AT_DATA([matrix.sps], [dnl
4708 MATRIX.
4709 MSAVE !.
4710 MSAVE 1/TYPE=!.
4711 MSAVE 1/OUTFILE=!.
4712 MSAVE 1/VARIABLES=!.
4713 MSAVE 1/FNAMES=!.
4714 MSAVE 1/SNAMES=!.
4715 MSAVE 1/SPLIT=!.
4716 MSAVE 1/FACTOR=!.
4717 MSAVE 1/!.
4718 MSAVE 1.
4719 MSAVE 1/TYPE=COV/FNAMES=x.
4720 MSAVE 1/TYPE=COV/SNAMES=x.
4721 MSAVE 1/TYPE=COV.
4722
4723 MSAVE 1/TYPE=COV/OUTFILE='matrix.sav'
4724     /FACTOR=1 /FNAMES=y
4725     /SPLIT=2 /SNAMES=z
4726     /VARIABLES=w.
4727 MSAVE 1/TYPE=COV/OUTFILE='matrix2.sav'.
4728 MSAVE 1/TYPE=COV/VARIABLES=x.
4729 MSAVE 1/TYPE=COV/FNAMES=x.
4730 MSAVE 1/TYPE=COV/SNAMES=x.
4731 END MATRIX.
4732
4733 MATRIX.
4734 MSAVE 1/TYPE=COV/VARIABLES=x/OUTFILE='matrix3.sav'/FACTOR=1/SPLIT=2.
4735 MSAVE {1,2}/TYPE=COV/VARIABLES=x/OUTFILE='matrix3.sav'/FACTOR=1/SPLIT=2.
4736 MSAVE {1,2;3}/TYPE=COV.
4737 MSAVE 0/TYPE=COV/FACTOR={1,2}.
4738 MSAVE 0/TYPE=COV/FACTOR=1/SPLIT={1;2}.
4739 END MATRIX.
4740
4741 MATRIX.
4742 MSAVE 1/TYPE=COV/OUTFILE='matrix4.sav'/SNAMES=x,x/SPLIT=1.
4743 END MATRIX.
4744
4745 MATRIX.
4746 MSAVE 1/TYPE=COV/OUTFILE='matrix5.sav'/SNAMES=x/FNAMES=x/SPLIT=1/FACTOR=1.
4747 END MATRIX.
4748
4749 MATRIX.
4750 MSAVE 1/TYPE=COV/OUTFILE='matrix6.sav'/VARIABLES=x/FNAMES=x/FACTOR=1.
4751 END MATRIX.
4752
4753 MATRIX.
4754 MSAVE 1/TYPE=COV/OUTFILE='matrix6.sav'/VARIABLES=x/SNAMES=x/SPLIT=1.
4755 END MATRIX.
4756
4757 MATRIX.
4758 MSAVE 1/TYPE=COV/OUTFILE='matrix7.sav'/SNAMES=VARNAME_.
4759 MSAVE 1/TYPE=COV/OUTFILE='matrix7.sav'/SNAMES=ROWTYPE_.
4760 MSAVE 1/TYPE=COV/OUTFILE='matrix7.sav'/FNAMES=VARNAME_.
4761 MSAVE 1/TYPE=COV/OUTFILE='matrix7.sav'/FNAMES=ROWTYPE_.
4762 MSAVE 1/TYPE=COV/OUTFILE='matrix7.sav'/VARIABLES=VARNAME_.
4763 MSAVE 1/TYPE=COV/OUTFILE='matrix7.sav'/VARIABLES=ROWTYPE_.
4764 END MATRIX.
4765 ])
4766 AT_CHECK([pspp matrix.sps], [1], [dnl
4767 matrix.sps:2.7: error: MSAVE: Syntax error expecting matrix expression.
4768     2 | MSAVE !.
4769       |       ^
4770
4771 matrix.sps:3.14: error: MSAVE: Syntax error expecting COV, CORR, MEAN, STDDEV,
4772 N, or COUNT.
4773     3 | MSAVE 1/TYPE=!.
4774       |              ^
4775
4776 matrix.sps:4.17: error: MSAVE: Syntax error expecting a file name or handle
4777 name.
4778     4 | MSAVE 1/OUTFILE=!.
4779       |                 ^
4780
4781 matrix.sps:5.19: error: MSAVE: Syntax error expecting variable name.
4782     5 | MSAVE 1/VARIABLES=!.
4783       |                   ^
4784
4785 matrix.sps:6.16: error: MSAVE: Syntax error expecting variable name.
4786     6 | MSAVE 1/FNAMES=!.
4787       |                ^
4788
4789 matrix.sps:7.16: error: MSAVE: Syntax error expecting variable name.
4790     7 | MSAVE 1/SNAMES=!.
4791       |                ^
4792
4793 matrix.sps:8.15: error: MSAVE: Syntax error expecting matrix expression.
4794     8 | MSAVE 1/SPLIT=!.
4795       |               ^
4796
4797 matrix.sps:9.16: error: MSAVE: Syntax error expecting matrix expression.
4798     9 | MSAVE 1/FACTOR=!.
4799       |                ^
4800
4801 matrix.sps:10.9: error: MSAVE: Syntax error expecting TYPE, OUTFILE, VARIABLES,
4802 FNAMES, SNAMES, SPLIT, or FACTOR.
4803    10 | MSAVE 1/!.
4804       |         ^
4805
4806 matrix.sps:11.1-11.8: error: MSAVE: Required subcommand TYPE was not specified.
4807    11 | MSAVE 1.
4808       | ^~~~~~~~
4809
4810 matrix.sps:12.25: error: MSAVE: FNAMES requires FACTOR.
4811    12 | MSAVE 1/TYPE=COV/FNAMES=x.
4812       |                         ^
4813
4814 matrix.sps:13.25: error: MSAVE: SNAMES requires SPLIT.
4815    13 | MSAVE 1/TYPE=COV/SNAMES=x.
4816       |                         ^
4817
4818 matrix.sps:14.1-14.17: error: MSAVE: Required subcommand OUTFILE was not
4819 specified.
4820    14 | MSAVE 1/TYPE=COV.
4821       | ^~~~~~~~~~~~~~~~~
4822
4823 matrix.sps:20: error: MSAVE: OUTFILE must name the same file on each MSAVE
4824 within a single MATRIX command.
4825
4826 matrix.sps:16.26-16.37: note: MSAVE: This is the OUTFILE on the first MSAVE
4827 command.
4828    16 | MSAVE 1/TYPE=COV/OUTFILE='matrix.sav'
4829       |                          ^~~~~~~~~~~~
4830
4831 matrix.sps:20.26-20.38: note: MSAVE: This is the OUTFILE on a later MSAVE
4832 command.
4833    20 | MSAVE 1/TYPE=COV/OUTFILE='matrix2.sav'.
4834       |                          ^~~~~~~~~~~~~
4835
4836 matrix.sps:21: error: MSAVE: VARIABLES must specify the same variables on each
4837 MSAVE within a given MATRIX.
4838
4839 matrix.sps:19.16: error: MSAVE: This is the specification of VARIABLES on the
4840 first MSAVE.
4841    19 |     /VARIABLES=w.
4842       |                ^
4843
4844 matrix.sps:21.28: error: MSAVE: This is a different specification of VARIABLES
4845 on a later MSAVE.
4846    21 | MSAVE 1/TYPE=COV/VARIABLES=x.
4847       |                            ^
4848
4849 matrix.sps:22: error: MSAVE: FNAMES must specify the same variables on each
4850 MSAVE within a given MATRIX.
4851
4852 matrix.sps:17.23: error: MSAVE: This is the specification of FNAMES on the
4853 first MSAVE.
4854    17 |     /FACTOR=1 /FNAMES=y
4855       |                       ^
4856
4857 matrix.sps:22.25: error: MSAVE: This is a different specification of FNAMES on
4858 a later MSAVE.
4859    22 | MSAVE 1/TYPE=COV/FNAMES=x.
4860       |                         ^
4861
4862 matrix.sps:23: error: MSAVE: SNAMES must specify the same variables on each
4863 MSAVE within a given MATRIX.
4864
4865 matrix.sps:18.22: error: MSAVE: This is the specification of SNAMES on the
4866 first MSAVE.
4867    18 |     /SPLIT=2 /SNAMES=z
4868       |                      ^
4869
4870 matrix.sps:23.25: error: MSAVE: This is a different specification of SNAMES on
4871 a later MSAVE.
4872    23 | MSAVE 1/TYPE=COV/SNAMES=x.
4873       |                         ^
4874
4875 matrix.sps:28.7-28.11: error: MATRIX: Matrix on MSAVE has 2 columns but there
4876 are 1 variables.
4877    28 | MSAVE {1,2}/TYPE=COV/VARIABLES=x/OUTFILE='matrix3.sav'/FACTOR=1/
4878 SPLIT=2.
4879       |       ^~~~~
4880
4881 matrix.sps:29.7-29.13: error: MATRIX: This expression tries to vertically join
4882 matrices with differing numbers of columns.
4883    29 | MSAVE {1,2;3}/TYPE=COV.
4884       |       ^~~~~~~
4885
4886 matrix.sps:29.8-29.10: note: MATRIX: This operand is a 1×2 matrix.
4887    29 | MSAVE {1,2;3}/TYPE=COV.
4888       |        ^~~
4889
4890 matrix.sps:29.12: note: MATRIX: This operand is a 1×1 matrix.
4891    29 | MSAVE {1,2;3}/TYPE=COV.
4892       |            ^
4893
4894 matrix.sps:30.25-30.29: error: MATRIX: There are 1 factor variables, but 2
4895 factor values were supplied.
4896    30 | MSAVE 0/TYPE=COV/FACTOR={1,2}.
4897       |                         ^~~~~
4898
4899 matrix.sps:31.33-31.37: error: MATRIX: There are 1 split variables, but 2 split
4900 values were supplied.
4901    31 | MSAVE 0/TYPE=COV/FACTOR=1/SPLIT={1;2}.
4902       |                                 ^~~~~
4903
4904 matrix.sps:35.49: error: MSAVE: Variable x appears twice in variable list.
4905    35 | MSAVE 1/TYPE=COV/OUTFILE='matrix4.sav'/SNAMES=x,x/SPLIT=1.
4906       |                                                 ^
4907
4908 matrix.sps:39.56: error: MATRIX: Duplicate or invalid FACTOR variable name x.
4909    39 | MSAVE 1/TYPE=COV/OUTFILE='matrix5.sav'/SNAMES=x/FNAMES=x/SPLIT=1/
4910 FACTOR=1.
4911       |                                                        ^
4912
4913 matrix.sps:43.50: error: MATRIX: Duplicate or invalid variable name x.
4914    43 | MSAVE 1/TYPE=COV/OUTFILE='matrix6.sav'/VARIABLES=x/FNAMES=x/FACTOR=1.
4915       |                                                  ^
4916
4917 matrix.sps:47.50: error: MATRIX: Duplicate or invalid variable name x.
4918    47 | MSAVE 1/TYPE=COV/OUTFILE='matrix6.sav'/VARIABLES=x/SNAMES=x/SPLIT=1.
4919       |                                                  ^
4920
4921 matrix.sps:51.47-51.54: error: MSAVE: Variable name VARNAME_ is reserved.
4922    51 | MSAVE 1/TYPE=COV/OUTFILE='matrix7.sav'/SNAMES=VARNAME_.
4923       |                                               ^~~~~~~~
4924
4925 matrix.sps:52.47-52.54: error: MSAVE: Variable name ROWTYPE_ is reserved.
4926    52 | MSAVE 1/TYPE=COV/OUTFILE='matrix7.sav'/SNAMES=ROWTYPE_.
4927       |                                               ^~~~~~~~
4928
4929 matrix.sps:53.47-53.54: error: MSAVE: Variable name VARNAME_ is reserved.
4930    53 | MSAVE 1/TYPE=COV/OUTFILE='matrix7.sav'/FNAMES=VARNAME_.
4931       |                                               ^~~~~~~~
4932
4933 matrix.sps:54.47-54.54: error: MSAVE: Variable name ROWTYPE_ is reserved.
4934    54 | MSAVE 1/TYPE=COV/OUTFILE='matrix7.sav'/FNAMES=ROWTYPE_.
4935       |                                               ^~~~~~~~
4936
4937 matrix.sps:55.50-55.57: error: MSAVE: Variable name VARNAME_ is reserved.
4938    55 | MSAVE 1/TYPE=COV/OUTFILE='matrix7.sav'/VARIABLES=VARNAME_.
4939       |                                                  ^~~~~~~~
4940
4941 matrix.sps:56.50-56.57: error: MSAVE: Variable name ROWTYPE_ is reserved.
4942    56 | MSAVE 1/TYPE=COV/OUTFILE='matrix7.sav'/VARIABLES=ROWTYPE_.
4943       |                                                  ^~~~~~~~
4944 ])
4945 AT_CLEANUP
4946
4947 AT_SETUP([MATRIX - DISPLAY])
4948 AT_DATA([matrix-template.sps], [dnl
4949 MATRIX.
4950 COMPUTE a={1,2,3}.
4951 COMPUTE b={1;2;3}.
4952 COMPUTE c={T(b),a}.
4953 COMPUTE d={T(a),b}.
4954 command.
4955 END MATRIX.
4956 ])
4957 for command in 'DISPLAY' 'DISPLAY DICTIONARY' 'DISPLAY STATUS'; do
4958     sed "s/command/$command/" < matrix-template.sps > matrix.sps
4959     AT_CHECK([pspp matrix.sps -O format=csv], [0], [dnl
4960 Table: Matrix Variables
4961 ,Dimension,,Size (kB)
4962 ,Rows,Columns,
4963 a,1,3,0
4964 b,3,1,0
4965 c,1,6,0
4966 d,3,2,0
4967 ])
4968 done
4969 AT_CLEANUP
4970
4971 AT_SETUP([MATRIX - DISPLAY - negative])
4972 AT_DATA([matrix.sps], [dnl
4973 MATRIX.
4974 DISPLAY !.
4975 END MATRIX.
4976 ])
4977 AT_CHECK([pspp matrix.sps], [1], [dnl
4978 matrix.sps:2.9: error: DISPLAY: Syntax error expecting DICTIONARY or STATUS.
4979     2 | DISPLAY !.
4980       |         ^
4981 ])
4982 AT_CLEANUP
4983
4984 AT_SETUP([MATRIX - RELEASE])
4985 AT_DATA([matrix.sps], [dnl
4986 MATRIX.
4987 COMPUTE x=1.
4988 PRINT x.
4989 RELEASE X.
4990 PRINT x.
4991 END MATRIX.
4992 ])
4993 AT_CHECK([pspp matrix.sps], [1], [dnl
4994 x
4995   1
4996
4997 matrix.sps:5.7: error: MATRIX: Uninitialized variable x used in expression.
4998     5 | PRINT x.
4999       |       ^
5000 ])
5001 AT_CLEANUP
5002
5003 AT_SETUP([MATRIX - RELEASE - negative])
5004 AT_DATA([matrix.sps], [dnl
5005 MATRIX.
5006 RELEASE !.
5007 RELEASE x.
5008 COMPUTE x=1.
5009 RELEASE x, !.
5010 COMPUTE x=1.
5011 RELEASE x y.
5012 COMPUTE x=1.
5013 RELEASE x.
5014 RELEASE x.
5015 END MATRIX.
5016 ])
5017 AT_CHECK([pspp matrix.sps], [1], [dnl
5018 matrix.sps:2.9: error: RELEASE: Syntax error expecting end of command.
5019     2 | RELEASE !.
5020       |         ^
5021
5022 matrix.sps:3.9: error: RELEASE: Syntax error expecting variable name.
5023     3 | RELEASE x.
5024       |         ^
5025
5026 matrix.sps:5.12: error: RELEASE: Syntax error expecting end of command.
5027     5 | RELEASE x, !.
5028       |            ^
5029
5030 matrix.sps:7.11: error: RELEASE: Syntax error expecting end of command.
5031     7 | RELEASE x y.
5032       |           ^
5033 ])
5034 AT_CLEANUP