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