557e8c597e79044f635b498fdcb5ccaf747d6719
[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 at end of command: expecting `='.
934
935 matrix.sps:3.11: error: COMPUTE: Syntax error at end of command.
936
937 matrix.sps:4.9: error: MATRIX: Undefined variable x.
938     4 | COMPUTE x(5)=1.
939       |         ^
940
941 matrix.sps:5: error: COMPUTE: Undefined variable y.
942 ])
943 AT_CLEANUP
944
945 AT_SETUP([MATRIX - elementwise arithmetic operators])
946 AT_DATA([matrix.sps], [dnl
947 MATRIX.
948 PRINT (-(5)).
949 PRINT (-{1,2;3,4}).
950
951 PRINT ({1,2;3,4} + {5,6;7,8}).
952 PRINT ({1,2;3,4} + 5).
953 PRINT (5 + {5,6;7,8}).
954 PRINT ({1,2;3,4} + {5,6}).
955
956 PRINT ({1,2;3,4} - {5,6;7,8}).
957 PRINT ({1,2;3,4} - 5).
958 PRINT (5 - {5,6;7,8}).
959 PRINT ({1,2;3,4} - {5,6}).
960
961 PRINT ({1,2;3,4} * 5).
962 PRINT (5 * {5,6;7,8}).
963
964 PRINT ({2,4;6,8} / 2).
965 PRINT (12 / {1,2;3,4}).
966 PRINT ({2,8;18,32} / {1,2;3,4}).
967
968 PRINT ({1,2;3,4} &* {5,6;7,8}).
969 PRINT ({1,2;3,4} &* 5).
970 PRINT (5 &* {5,6;7,8}).
971 PRINT ({1,2;3,4} &* {5,6}).
972
973 PRINT ({2,4;6,8} &/ 2).
974 PRINT (12 &/ {1,2;3,4}).
975 PRINT ({2,8;18,32} &/ {1,2;3,4}).
976
977 PRINT ({1,2;3,4} &** 2).
978 PRINT (2 &** {1,2;3,4}).
979 PRINT ({1,2;3,4} &** {2,3;4,5}).
980 PRINT ({1,2;3,4} &** {5,6}).
981 END MATRIX.
982 ])
983 AT_CHECK([pspp matrix.sps], [1], [dnl
984 (-(5))
985  -5
986
987 (-{1,2;3,4})
988  -1 -2
989  -3 -4
990
991 ({1,2;3,4} + {5,6;7,8})
992    6   8
993   10  12
994
995 ({1,2;3,4} + 5)
996   6  7
997   8  9
998
999 (5 + {5,6;7,8})
1000   10  11
1001   12  13
1002
1003 matrix.sps:8.8-8.24: error: MATRIX: The operands of + must have the same
1004 dimensions or one must be a scalar.
1005     8 | PRINT ({1,2;3,4} + {5,6}).
1006       |        ^~~~~~~~~~~~~~~~~
1007
1008 matrix.sps:8.8-8.16: note: MATRIX: The left-hand operand is a 2×2 matrix.
1009     8 | PRINT ({1,2;3,4} + {5,6}).
1010       |        ^~~~~~~~~
1011
1012 matrix.sps:8.20-8.24: note: MATRIX: The right-hand operand is a 1×2 matrix.
1013     8 | PRINT ({1,2;3,4} + {5,6}).
1014       |                    ^~~~~
1015
1016 ({1,2;3,4} - {5,6;7,8})
1017  -4 -4
1018  -4 -4
1019
1020 ({1,2;3,4} - 5)
1021  -4 -3
1022  -2 -1
1023
1024 (5 - {5,6;7,8})
1025   0 -1
1026  -2 -3
1027
1028 matrix.sps:13.8-13.24: error: MATRIX: The operands of - must have the same
1029 dimensions or one must be a scalar.
1030    13 | PRINT ({1,2;3,4} - {5,6}).
1031       |        ^~~~~~~~~~~~~~~~~
1032
1033 matrix.sps:13.8-13.16: note: MATRIX: The left-hand operand is a 2×2 matrix.
1034    13 | PRINT ({1,2;3,4} - {5,6}).
1035       |        ^~~~~~~~~
1036
1037 matrix.sps:13.20-13.24: note: MATRIX: The right-hand operand is a 1×2 matrix.
1038    13 | PRINT ({1,2;3,4} - {5,6}).
1039       |                    ^~~~~
1040
1041 ({1,2;3,4} * 5)
1042    5  10
1043   15  20
1044
1045 (5 * {5,6;7,8})
1046   25  30
1047   35  40
1048
1049 ({2,4;6,8} / 2)
1050   1  2
1051   3  4
1052
1053 (12 / {1,2;3,4})
1054   12   6
1055    4   3
1056
1057 ({2,8;18,32} / {1,2;3,4})
1058   2  4
1059   6  8
1060
1061 ({1,2;3,4} &* {5,6;7,8})
1062    5  12
1063   21  32
1064
1065 ({1,2;3,4} &* 5)
1066    5  10
1067   15  20
1068
1069 (5 &* {5,6;7,8})
1070   25  30
1071   35  40
1072
1073 matrix.sps:25.8-25.25: error: MATRIX: The operands of &* must have the same
1074 dimensions or one must be a scalar.
1075    25 | PRINT ({1,2;3,4} &* {5,6}).
1076       |        ^~~~~~~~~~~~~~~~~~
1077
1078 matrix.sps:25.8-25.16: note: MATRIX: The left-hand operand is a 2×2 matrix.
1079    25 | PRINT ({1,2;3,4} &* {5,6}).
1080       |        ^~~~~~~~~
1081
1082 matrix.sps:25.21-25.25: note: MATRIX: The right-hand operand is a 1×2 matrix.
1083    25 | PRINT ({1,2;3,4} &* {5,6}).
1084       |                     ^~~~~
1085
1086 ({2,4;6,8} &/ 2)
1087   1  2
1088   3  4
1089
1090 (12 &/ {1,2;3,4})
1091   12   6
1092    4   3
1093
1094 ({2,8;18,32} &/ {1,2;3,4})
1095   2  4
1096   6  8
1097
1098 ({1,2;3,4} &** 2)
1099    1   4
1100    9  16
1101
1102 (2 &** {1,2;3,4})
1103    2   4
1104    8  16
1105
1106 ({1,2;3,4} &** {2,3;4,5})
1107      1     8
1108     81  1024
1109
1110 matrix.sps:34.8-34.26: error: MATRIX: The operands of &** must have the same
1111 dimensions or one must be a scalar.
1112    34 | PRINT ({1,2;3,4} &** {5,6}).
1113       |        ^~~~~~~~~~~~~~~~~~~
1114
1115 matrix.sps:34.8-34.16: note: MATRIX: The left-hand operand is a 2×2 matrix.
1116    34 | PRINT ({1,2;3,4} &** {5,6}).
1117       |        ^~~~~~~~~
1118
1119 matrix.sps:34.22-34.26: note: MATRIX: The right-hand operand is a 1×2 matrix.
1120    34 | PRINT ({1,2;3,4} &** {5,6}).
1121       |                      ^~~~~
1122 ])
1123 AT_CLEANUP
1124
1125 AT_SETUP([MATRIX - relational operators])
1126 AT_DATA([matrix.sps], [dnl
1127 MATRIX.
1128 PRINT ({1, 1; 2, 2} > {1, 2; 1, 2}).
1129 PRINT ({1, 1; 2, 2} > 1).
1130 PRINT (2 > {1, 2; 1, 2}).
1131 PRINT ({1, 2} > {1; 2}).
1132
1133 PRINT ({1, 1; 2, 2} < {1, 2; 1, 2}).
1134 PRINT ({1, 1; 2, 2} < 2).
1135 PRINT (1 < {1, 2; 1, 2}).
1136 PRINT ({1, 2} < {1; 2}).
1137
1138 PRINT ({1, 1; 2, 2} <> {1, 2; 1, 2}).
1139 PRINT ({1, 1; 2, 2} <> 2).
1140 PRINT (1 <> {1, 2; 1, 2}).
1141 PRINT ({1, 2} <> {1; 2}).
1142
1143 PRINT ({1, 1; 2, 2} >= {1, 2; 1, 2}).
1144 PRINT ({1, 1; 2, 2} >= 2).
1145 PRINT (1 >= {1, 2; 1, 2}).
1146 PRINT ({1, 2} >= {1; 2}).
1147
1148 PRINT ({1, 1; 2, 2} <= {1, 2; 1, 2}).
1149 PRINT ({1, 1; 2, 2} <= 2).
1150 PRINT (1 <= {1, 2; 1, 2}).
1151 PRINT ({1, 2} <= {1; 2}).
1152
1153 PRINT ({1, 1; 2, 2} = {1, 2; 1, 2}).
1154 PRINT ({1, 1; 2, 2} = 2).
1155 PRINT (1 = {1, 2; 1, 2}).
1156 PRINT ({1, 2} = {1; 2}).
1157 END MATRIX.
1158 ])
1159 AT_CHECK([pspp matrix.sps], [1], [dnl
1160 ({1, 1; 2, 2} > {1, 2; 1, 2})
1161   0  0
1162   1  0
1163
1164 ({1, 1; 2, 2} > 1)
1165   0  0
1166   1  1
1167
1168 (2 > {1, 2; 1, 2})
1169   1  0
1170   1  0
1171
1172 matrix.sps:5.8-5.22: error: MATRIX: The operands of > must have the same
1173 dimensions or one must be a scalar.
1174     5 | PRINT ({1, 2} > {1; 2}).
1175       |        ^~~~~~~~~~~~~~~
1176
1177 matrix.sps:5.8-5.13: note: MATRIX: The left-hand operand is a 1×2 matrix.
1178     5 | PRINT ({1, 2} > {1; 2}).
1179       |        ^~~~~~
1180
1181 matrix.sps:5.17-5.22: note: MATRIX: The right-hand operand is a 2×1 matrix.
1182     5 | PRINT ({1, 2} > {1; 2}).
1183       |                 ^~~~~~
1184
1185 ({1, 1; 2, 2} < {1, 2; 1, 2})
1186   0  1
1187   0  0
1188
1189 ({1, 1; 2, 2} < 2)
1190   1  1
1191   0  0
1192
1193 (1 < {1, 2; 1, 2})
1194   0  1
1195   0  1
1196
1197 matrix.sps:10.8-10.22: error: MATRIX: The operands of < must have the same
1198 dimensions or one must be a scalar.
1199    10 | PRINT ({1, 2} < {1; 2}).
1200       |        ^~~~~~~~~~~~~~~
1201
1202 matrix.sps:10.8-10.13: note: MATRIX: The left-hand operand is a 1×2 matrix.
1203    10 | PRINT ({1, 2} < {1; 2}).
1204       |        ^~~~~~
1205
1206 matrix.sps:10.17-10.22: note: MATRIX: The right-hand operand is a 2×1 matrix.
1207    10 | PRINT ({1, 2} < {1; 2}).
1208       |                 ^~~~~~
1209
1210 ({1, 1; 2, 2} <> {1, 2; 1, 2})
1211   0  1
1212   1  0
1213
1214 ({1, 1; 2, 2} <> 2)
1215   1  1
1216   0  0
1217
1218 (1 <> {1, 2; 1, 2})
1219   0  1
1220   0  1
1221
1222 matrix.sps:15.8-15.23: error: MATRIX: The operands of <> must have the same
1223 dimensions or one must be a scalar.
1224    15 | PRINT ({1, 2} <> {1; 2}).
1225       |        ^~~~~~~~~~~~~~~~
1226
1227 matrix.sps:15.8-15.13: note: MATRIX: The left-hand operand is a 1×2 matrix.
1228    15 | PRINT ({1, 2} <> {1; 2}).
1229       |        ^~~~~~
1230
1231 matrix.sps:15.18-15.23: note: MATRIX: The right-hand operand is a 2×1 matrix.
1232    15 | PRINT ({1, 2} <> {1; 2}).
1233       |                  ^~~~~~
1234
1235 ({1, 1; 2, 2} >= {1, 2; 1, 2})
1236   1  0
1237   1  1
1238
1239 ({1, 1; 2, 2} >= 2)
1240   0  0
1241   1  1
1242
1243 (1 >= {1, 2; 1, 2})
1244   1  0
1245   1  0
1246
1247 matrix.sps:20.8-20.23: error: MATRIX: The operands of >= must have the same
1248 dimensions or one must be a scalar.
1249    20 | PRINT ({1, 2} >= {1; 2}).
1250       |        ^~~~~~~~~~~~~~~~
1251
1252 matrix.sps:20.8-20.13: note: MATRIX: The left-hand operand is a 1×2 matrix.
1253    20 | PRINT ({1, 2} >= {1; 2}).
1254       |        ^~~~~~
1255
1256 matrix.sps:20.18-20.23: note: MATRIX: The right-hand operand is a 2×1 matrix.
1257    20 | PRINT ({1, 2} >= {1; 2}).
1258       |                  ^~~~~~
1259
1260 ({1, 1; 2, 2} <= {1, 2; 1, 2})
1261   1  1
1262   0  1
1263
1264 ({1, 1; 2, 2} <= 2)
1265   1  1
1266   1  1
1267
1268 (1 <= {1, 2; 1, 2})
1269   1  1
1270   1  1
1271
1272 matrix.sps:25.8-25.23: error: MATRIX: The operands of <= must have the same
1273 dimensions or one must be a scalar.
1274    25 | PRINT ({1, 2} <= {1; 2}).
1275       |        ^~~~~~~~~~~~~~~~
1276
1277 matrix.sps:25.8-25.13: note: MATRIX: The left-hand operand is a 1×2 matrix.
1278    25 | PRINT ({1, 2} <= {1; 2}).
1279       |        ^~~~~~
1280
1281 matrix.sps:25.18-25.23: note: MATRIX: The right-hand operand is a 2×1 matrix.
1282    25 | PRINT ({1, 2} <= {1; 2}).
1283       |                  ^~~~~~
1284
1285 ({1, 1; 2, 2} = {1, 2; 1, 2})
1286   1  0
1287   0  1
1288
1289 ({1, 1; 2, 2} = 2)
1290   0  0
1291   1  1
1292
1293 (1 = {1, 2; 1, 2})
1294   1  0
1295   1  0
1296
1297 matrix.sps:30.8-30.22: error: MATRIX: The operands of = must have the same
1298 dimensions or one must be a scalar.
1299    30 | PRINT ({1, 2} = {1; 2}).
1300       |        ^~~~~~~~~~~~~~~
1301
1302 matrix.sps:30.8-30.13: note: MATRIX: The left-hand operand is a 1×2 matrix.
1303    30 | PRINT ({1, 2} = {1; 2}).
1304       |        ^~~~~~
1305
1306 matrix.sps:30.17-30.22: note: MATRIX: The right-hand operand is a 2×1 matrix.
1307    30 | PRINT ({1, 2} = {1; 2}).
1308       |                 ^~~~~~
1309 ])
1310 AT_CLEANUP
1311
1312 AT_SETUP([MATRIX - logical operators])
1313 AT_DATA([matrix.sps], [dnl
1314 MATRIX.
1315 PRINT (NOT {-1, 0, 1}).
1316
1317 PRINT ({-1, 0, 1; -1, 0, 1; -1, 0, 1} AND {-1, -1, -1; 0, 0, 0; 1, 1, 1}).
1318 PRINT ({-1, 0, 1} AND -1).
1319 PRINT ({-1, 0, 1} AND 0).
1320 PRINT ({-1, 0, 1} AND 1).
1321 PRINT ({-1, 0} AND {2; 3}).
1322
1323 PRINT ({-1, 0, 1; -1, 0, 1; -1, 0, 1} OR {-1, -1, -1; 0, 0, 0; 1, 1, 1}).
1324 PRINT ({-1, 0, 1} OR -1).
1325 PRINT ({-1, 0, 1} OR 0).
1326 PRINT ({-1, 0, 1} OR 1).
1327 PRINT ({-1, 0} OR {2; 3}).
1328
1329 PRINT ({-1, 0, 1; -1, 0, 1; -1, 0, 1} XOR {-1, -1, -1; 0, 0, 0; 1, 1, 1}).
1330 PRINT ({-1, 0, 1} XOR -1).
1331 PRINT ({-1, 0, 1} XOR 0).
1332 PRINT ({-1, 0, 1} XOR 1).
1333 PRINT ({-1, 0} XOR {2; 3}).
1334 END MATRIX.
1335 ])
1336 AT_CHECK([pspp matrix.sps], [1], [dnl
1337 (NOT {-1, 0, 1})
1338   1  1  0
1339
1340 ({-1, 0, 1; -1, 0, 1; -1, 0, 1} AND {-1, -1, -1; 0, 0, 0; 1, 1, 1})
1341   0  0  0
1342   0  0  0
1343   0  0  1
1344
1345 ({-1, 0, 1} AND -1)
1346  0 0 0
1347
1348 ({-1, 0, 1} AND 0)
1349  0 0 0
1350
1351 ({-1, 0, 1} AND 1)
1352   0  0  1
1353
1354 matrix.sps:8.8-8.25: error: MATRIX: The operands of AND must have the same
1355 dimensions or one must be a scalar.
1356     8 | PRINT ({-1, 0} AND {2; 3}).
1357       |        ^~~~~~~~~~~~~~~~~~
1358
1359 matrix.sps:8.8-8.14: note: MATRIX: The left-hand operand is a 1×2 matrix.
1360     8 | PRINT ({-1, 0} AND {2; 3}).
1361       |        ^~~~~~~
1362
1363 matrix.sps:8.20-8.25: note: MATRIX: The right-hand operand is a 2×1 matrix.
1364     8 | PRINT ({-1, 0} AND {2; 3}).
1365       |                    ^~~~~~
1366
1367 ({-1, 0, 1; -1, 0, 1; -1, 0, 1} OR {-1, -1, -1; 0, 0, 0; 1, 1, 1})
1368   0  0  1
1369   0  0  1
1370   1  1  1
1371
1372 ({-1, 0, 1} OR -1)
1373   0  0  1
1374
1375 ({-1, 0, 1} OR 0)
1376   0  0  1
1377
1378 ({-1, 0, 1} OR 1)
1379   1  1  1
1380
1381 matrix.sps:14.8-14.24: error: MATRIX: The operands of OR must have the same
1382 dimensions or one must be a scalar.
1383    14 | PRINT ({-1, 0} OR {2; 3}).
1384       |        ^~~~~~~~~~~~~~~~~
1385
1386 matrix.sps:14.8-14.14: note: MATRIX: The left-hand operand is a 1×2 matrix.
1387    14 | PRINT ({-1, 0} OR {2; 3}).
1388       |        ^~~~~~~
1389
1390 matrix.sps:14.19-14.24: note: MATRIX: The right-hand operand is a 2×1 matrix.
1391    14 | PRINT ({-1, 0} OR {2; 3}).
1392       |                   ^~~~~~
1393
1394 ({-1, 0, 1; -1, 0, 1; -1, 0, 1} XOR {-1, -1, -1; 0, 0, 0; 1, 1, 1})
1395   0  0  1
1396   0  0  1
1397   1  1  0
1398
1399 ({-1, 0, 1} XOR -1)
1400   0  0  1
1401
1402 ({-1, 0, 1} XOR 0)
1403   0  0  1
1404
1405 ({-1, 0, 1} XOR 1)
1406   1  1  0
1407
1408 matrix.sps:20.8-20.25: error: MATRIX: The operands of XOR must have the same
1409 dimensions or one must be a scalar.
1410    20 | PRINT ({-1, 0} XOR {2; 3}).
1411       |        ^~~~~~~~~~~~~~~~~~
1412
1413 matrix.sps:20.8-20.14: note: MATRIX: The left-hand operand is a 1×2 matrix.
1414    20 | PRINT ({-1, 0} XOR {2; 3}).
1415       |        ^~~~~~~
1416
1417 matrix.sps:20.20-20.25: note: MATRIX: The right-hand operand is a 2×1 matrix.
1418    20 | PRINT ({-1, 0} XOR {2; 3}).
1419       |                    ^~~~~~
1420 ])
1421 AT_CLEANUP
1422
1423 AT_SETUP([MATRIX - matrix operators])
1424 AT_DATA([matrix.sps], [dnl
1425 MATRIX.
1426 PRINT ({0, 1; 0, 0} * {0, 0; 1, 0}).
1427 PRINT ({0, 0; 1, 0} * {0, 1; 0, 0}).
1428 PRINT ({1, 2, 3; 4, 5, 6} * {7, 8; 9, 10; 11, 12}).
1429 PRINT ({3, 4, 2} * {13, 9, 7, 15; 8, 7, 4, 6; 6, 4, 0, 3}).
1430 COMPUTE m = {0, 1, 0, 0; 1, 0, 1, 0; 0, 1, 0, 1; 0, 0, 1, 0}.
1431 PRINT m**-2.
1432 PRINT m**-1.
1433 PRINT m**0.
1434 PRINT m**1.
1435 PRINT m**2.
1436 PRINT m**3.
1437 PRINT m**5.
1438 PRINT {3, 3.5; 3.2, 3.6}**-1/FORMAT F6.2.
1439
1440 PRINT ({1, 2, 3} * {1, 2}).
1441 PRINT {1, 2, 3}**2.
1442 PRINT m**{1, 2}.
1443 PRINT m**1.5.
1444 END MATRIX.
1445 ])
1446 AT_CHECK([pspp matrix.sps], [1], [dnl
1447 ({0, 1; 0, 0} * {0, 0; 1, 0})
1448   1  0
1449   0  0
1450
1451 ({0, 0; 1, 0} * {0, 1; 0, 0})
1452   0  0
1453   0  1
1454
1455 ({1, 2, 3; 4, 5, 6} * {7, 8; 9, 10; 11, 12})
1456    58   64
1457   139  154
1458
1459 ({3, 4, 2} * {13, 9, 7, 15; 8, 7, 4, 6; 6, 4, 0, 3})
1460   83  63  37  75
1461
1462 m**-2
1463   2  0 -1  0
1464   0  1  0 -1
1465  -1  0  1  0
1466   0 -1  0  2
1467
1468 m**-1
1469   0  1  0 -1
1470   1  0  0  0
1471   0  0  0  1
1472  -1  0  1  0
1473
1474 m**0
1475   1  0  0  0
1476   0  1  0  0
1477   0  0  1  0
1478   0  0  0  1
1479
1480 m**1
1481   0  1  0  0
1482   1  0  1  0
1483   0  1  0  1
1484   0  0  1  0
1485
1486 m**2
1487   1  0  1  0
1488   0  2  0  1
1489   1  0  2  0
1490   0  1  0  1
1491
1492 m**3
1493   0  2  0  1
1494   2  0  3  0
1495   0  3  0  2
1496   1  0  2  0
1497
1498 m**5
1499   0  5  0  3
1500   5  0  8  0
1501   0  8  0  5
1502   3  0  5  0
1503
1504 {3, 3.5; 3.2, 3.6}**-1
1505   -9.00   8.75
1506    8.00  -7.50
1507
1508 matrix.sps:16.8-16.25: error: MATRIX: Matrices not conformable for
1509 multiplication.
1510    16 | PRINT ({1, 2, 3} * {1, 2}).
1511       |        ^~~~~~~~~~~~~~~~~~
1512
1513 matrix.sps:16.8-16.16: note: MATRIX: The left-hand operand is a 1×3 matrix.
1514    16 | PRINT ({1, 2, 3} * {1, 2}).
1515       |        ^~~~~~~~~
1516
1517 matrix.sps:16.20-16.25: note: MATRIX: The right-hand operand is a 1×2 matrix.
1518    16 | PRINT ({1, 2, 3} * {1, 2}).
1519       |                    ^~~~~~
1520
1521 matrix.sps:17.7-17.15: error: MATRIX: Matrix exponentation with ** requires a
1522 square matrix on the left-hand size, not one with dimensions 1×3.
1523    17 | PRINT {1, 2, 3}**2.
1524       |       ^~~~~~~~~
1525
1526 matrix.sps:18.10-18.15: error: MATRIX: Matrix exponentiation with ** requires a
1527 scalar on the right-hand side, not a matrix with dimensions 1×2.
1528    18 | PRINT m**{1, 2}.
1529       |          ^~~~~~
1530
1531 matrix.sps:19.10-19.12: error: MATRIX: Exponent 1.5 in matrix multiplication is
1532 non-integer or outside the valid range.
1533    19 | PRINT m**1.5.
1534       |          ^~~
1535 ])
1536 AT_CLEANUP
1537
1538 AT_SETUP([MATRIX - sequences and construction])
1539 AT_DATA([matrix.sps], [dnl
1540 MATRIX.
1541 PRINT {1:3:-1}.
1542 PRINT {1:3}.
1543 PRINT {1:10:2}.
1544 PRINT {1:11:2}.
1545
1546 PRINT {-1:-3}.
1547 PRINT {-1:-3:-1}.
1548 PRINT {-1:-10:-2}.
1549 PRINT {-1:-11:-2}.
1550
1551 PRINT {1:1}.
1552 PRINT {1:1:-1}.
1553
1554 PRINT {1:3:0}.
1555 PRINT {-1:-3:0}.
1556
1557 PRINT {1, 2; 3}.
1558 PRINT {{2; 5}, 3}.
1559 END MATRIX.
1560 ])
1561 AT_CHECK([pspp matrix.sps], [1], [dnl
1562 {1:3:-1}
1563
1564 {1:3}
1565   1  2  3
1566
1567 {1:10:2}
1568   1  3  5  7  9
1569
1570 {1:11:2}
1571    1   3   5   7   9  11
1572
1573 {-1:-3}
1574
1575 {-1:-3:-1}
1576  -1 -2 -3
1577
1578 {-1:-10:-2}
1579  -1 -3 -5 -7 -9
1580
1581 {-1:-11:-2}
1582   -1  -3  -5  -7  -9 -11
1583
1584 {1:1}
1585   1
1586
1587 {1:1:-1}
1588   1
1589
1590 matrix.sps:15.12: error: MATRIX: The increment operand to : must be nonzero.
1591    15 | PRINT {1:3:0}.
1592       |            ^
1593
1594 matrix.sps:16.14: error: MATRIX: The increment operand to : must be nonzero.
1595    16 | PRINT {-1:-3:0}.
1596       |              ^
1597
1598 matrix.sps:18.7-18.15: error: MATRIX: This expression tries to vertically join
1599 matrices with differing numbers of columns.
1600    18 | PRINT {1, 2; 3}.
1601       |       ^~~~~~~~~
1602
1603 matrix.sps:18.8-18.11: note: MATRIX: This operand is a 1×2 matrix.
1604    18 | PRINT {1, 2; 3}.
1605       |        ^~~~
1606
1607 matrix.sps:18.14: note: MATRIX: This operand is a 1×1 matrix.
1608    18 | PRINT {1, 2; 3}.
1609       |              ^
1610
1611 matrix.sps:19.7-19.17: error: MATRIX: This expression tries to horizontally
1612 join matrices with differing numbers of rows.
1613    19 | PRINT {{2; 5}, 3}.
1614       |       ^~~~~~~~~~~
1615
1616 matrix.sps:19.8-19.13: note: MATRIX: This operand is a 2×1 matrix.
1617    19 | PRINT {{2; 5}, 3}.
1618       |        ^~~~~~
1619
1620 matrix.sps:19.16: note: MATRIX: This operand is a 1×1 matrix.
1621    19 | PRINT {{2; 5}, 3}.
1622       |                ^
1623 ])
1624 AT_CLEANUP
1625
1626 AT_SETUP([MATRIX - comments])
1627 AT_DATA([matrix.sps], [dnl
1628 MATRIX.
1629 * Comment one.
1630 PRINT (1+2).
1631 COMMENT Comment two.
1632 PRINT (3+4).
1633 END MATRIX.
1634 ])
1635 AT_CHECK([pspp matrix.sps], [0], [dnl
1636 (1+2)
1637   3
1638
1639 (3+4)
1640   7
1641 ])
1642 AT_CLEANUP
1643
1644 AT_SETUP([MATRIX - string matrices])
1645 AT_DATA([matrix.sps], [dnl
1646 MATRIX.
1647 COMPUTE m={'This is', 'a string', 'matrix', 'including', 'some', 'long strings'}.
1648 PRINT m/FORMAT=A8.
1649 END MATRIX.
1650 ])
1651 AT_CHECK([pspp matrix.sps], [0], [dnl
1652 m
1653  This is a string matrix includin some long str
1654 ])
1655 AT_CLEANUP
1656
1657 AT_SETUP([MATRIX - ABS ALL ANY ARSIN ARTAN])
1658 AT_DATA([matrix.sps], [dnl
1659 MATRIX.
1660 PRINT ABS({-1, 0, 1}).
1661
1662 PRINT ALL({0, 0, 0}).
1663 PRINT ALL({-1, 1}).
1664 PRINT ALL({-1, 0, 1}).
1665
1666 PRINT ANY({0, 0, 0}).
1667 PRINT ANY({-1, 1}).
1668 PRINT ANY({-1, 0, 1}).
1669
1670 PRINT ARSIN({-1, 0, 1})/FORMAT=F5.2.
1671
1672 PRINT ARTAN({-5, -1, 0, 1, 5})/FORMAT=F5.2.
1673 END MATRIX.
1674 ])
1675 AT_CHECK([pspp matrix.sps], [0], [dnl
1676 ABS({-1, 0, 1})
1677   1  0  1
1678
1679 ALL({0, 0, 0})
1680  0
1681
1682 ALL({-1, 1})
1683   1
1684
1685 ALL({-1, 0, 1})
1686  0
1687
1688 ANY({0, 0, 0})
1689  0
1690
1691 ANY({-1, 1})
1692   1
1693
1694 ANY({-1, 0, 1})
1695   1
1696
1697 ARSIN({-1, 0, 1})
1698  -1.57   .00  1.57
1699
1700 ARTAN({-5, -1, 0, 1, 5})
1701  -1.37  -.79   .00   .79  1.37
1702 ])
1703 AT_CLEANUP
1704
1705 AT_SETUP([MATRIX - BLOCK CHOL CMAX CMIN COS])
1706 AT_DATA([matrix.sps], [dnl
1707 MATRIX.
1708 PRINT BLOCK({1, 2; 3, 4}, 5, {7; 8; 9}, {10, 11}).
1709
1710 COMPUTE b=CHOL({4, 12, -16; 12, 37, -43; -16, -43, 98}).
1711 PRINT b.
1712 PRINT (T(b)*b).
1713
1714 PRINT CMAX({9, 3, 4; 5, 8, 6; 7, 4, 11}).
1715
1716 PRINT CMIN({9, 3, 4; 5, 8, 6; 7, 4, 11}).
1717
1718 PRINT COS({0.785, 1.57; 3.14, 1.57 + 3.14}) /FORMAT=F5.2.
1719
1720 END MATRIX.
1721 ])
1722 AT_CHECK([pspp matrix.sps], [0], [dnl
1723 BLOCK({1, 2; 3, 4}, 5, {7; 8; 9}, {10, 11})
1724    1   2   0   0   0   0
1725    3   4   0   0   0   0
1726    0   0   5   0   0   0
1727    0   0   0   7   0   0
1728    0   0   0   8   0   0
1729    0   0   0   9   0   0
1730    0   0   0   0  10  11
1731
1732 b
1733   2  6 -8
1734   0  1  5
1735   0  0  3
1736
1737 (T(b)*b)
1738    4  12 -16
1739   12  37 -43
1740  -16 -43  98
1741
1742 CMAX({9, 3, 4; 5, 8, 6; 7, 4, 11})
1743    9   8  11
1744
1745 CMIN({9, 3, 4; 5, 8, 6; 7, 4, 11})
1746   5  3  4
1747
1748 COS({0.785, 1.57; 3.14, 1.57 + 3.14})
1749    .71   .00
1750  -1.00   .00
1751 ])
1752 AT_CLEANUP
1753
1754 AT_SETUP([MATRIX - CSSQ CSUM DESIGN DET DIAG])
1755 AT_DATA([matrix.sps], [dnl
1756 MATRIX.
1757 PRINT CSSQ({1, 2, 3; 4, 5, 6; 7, 8, 9}).
1758 PRINT CSUM({1, 2, 3; 4, 5, 6; 7, 8, 9}).
1759 PRINT DESIGN({1, 2, 0; 2, 1, 0; 3, 0, 1}).
1760 PRINT DESIGN({1, 2, 0; 2, 2, 0; 3, 2, 1}).
1761 PRINT DET({1, 2, 3; 4, 5, 6; 7, 8, 9}) /FORMAT F4.1.
1762 PRINT DIAG({1, 2, 3, 4; 4, 5, 6, 7; 7, 8, 9, 10}).
1763 END MATRIX.
1764 ])
1765 AT_CHECK([pspp matrix.sps], [0], [dnl
1766 CSSQ({1, 2, 3; 4, 5, 6; 7, 8, 9})
1767    66   93  126
1768
1769 CSUM({1, 2, 3; 4, 5, 6; 7, 8, 9})
1770   12  15  18
1771
1772 DESIGN({1, 2, 0; 2, 1, 0; 3, 0, 1})
1773   1  0  0  0  0  1  1  0
1774   0  1  0  0  1  0  1  0
1775   0  0  1  1  0  0  0  1
1776
1777 warning: Column 2 in DESIGN argument has constant value.
1778
1779 DESIGN({1, 2, 0; 2, 2, 0; 3, 2, 1})
1780   1  0  0  1  0
1781   0  1  0  1  0
1782   0  0  1  0  1
1783
1784 DET({1, 2, 3; 4, 5, 6; 7, 8, 9})
1785    .0
1786
1787 DIAG({1, 2, 3, 4; 4, 5, 6, 7; 7, 8, 9, 10})
1788   1
1789   5
1790   9
1791 ])
1792 AT_CLEANUP
1793
1794 AT_SETUP([MATRIX - EVAL EXP GINV GRADE GSCH])
1795 AT_DATA([matrix.sps], [dnl
1796 MATRIX.
1797 PRINT EVAL({2, 0, 0; 0, 3, 4; 0, 4, 9})/FORMAT=F5.2.
1798
1799 PRINT EXP({2, 3; 4, 5})/FORMAT F5.2.
1800
1801 PRINT GINV({1, 2})/FORMAT F5.2.
1802 COMPUTE a={1, 2, 3; 4, 5, 6; 7, 8, 9}.
1803 COMPUTE g=GINV(a).
1804 PRINT (a*g*a)/FORMAT F5.2.
1805
1806 PRINT GRADE({1, 0, 3; 3, 1, 2; 3, 0, 5}).
1807 COMPUTE x={26, 690, 323, 208, 671, 818, 732, 711, 585, 792}.
1808 COMPUTE asort=x.
1809 COMPUTE asort(GRADE(asort))=asort.
1810 PRINT asort.
1811 COMPUTE dsort=x.
1812 COMPUTE dsort(GRADE(-dsort))=dsort.
1813 PRINT dsort.
1814
1815 PRINT (GSCH({3, 2; 1, 2}) * SQRT(10))/FORMAT F5.2.
1816 PRINT (GSCH({0, 3, 6, 2; 0, 1, 2, 2}) * SQRT(10))/FORMAT F5.2.
1817 PRINT GSCH({0; 0}).
1818 PRINT GSCH({0, 0, 0; 0, 0, 0}).
1819 END MATRIX.
1820 ])
1821 AT_CHECK([pspp matrix.sps], [1], [dnl
1822 EVAL({2, 0, 0; 0, 3, 4; 0, 4, 9})
1823  11.00
1824   2.00
1825   1.00
1826
1827 EXP({2, 3; 4, 5})
1828   7.39 20.09
1829  54.60 148.4
1830
1831 GINV({1, 2})
1832    .20
1833    .40
1834
1835 (a*g*a)
1836   1.00  2.00  3.00
1837   4.00  5.00  6.00
1838   7.00  8.00  9.00
1839
1840 GRADE({1, 0, 3; 3, 1, 2; 3, 0, 5})
1841   3  1  6
1842   7  4  5
1843   8  2  9
1844
1845 asort
1846    26  208  323  585  671  690  711  732  792  818
1847
1848 dsort
1849   818  792  732  711  690  671  585  323  208   26
1850
1851 (GSCH({3, 2; 1, 2}) * SQRT(10))
1852   3.00 -1.00
1853   1.00  3.00
1854
1855 (GSCH({0, 3, 6, 2; 0, 1, 2, 2}) * SQRT(10))
1856   3.00 -1.00
1857   1.00  3.00
1858
1859 matrix.sps:22.12-22.17: error: MATRIX: GSCH requires its argument to have at
1860 least as many columns as rows, but it has dimensions 2×1.
1861    22 | PRINT GSCH({0; 0}).
1862       |            ^~~~~~
1863
1864 matrix.sps:23.12-23.29: error: MATRIX: 2×3 argument to GSCH contains only 0
1865 linearly independent columns.
1866    23 | PRINT GSCH({0, 0, 0; 0, 0, 0}).
1867       |            ^~~~~~~~~~~~~~~~~~
1868 ])
1869 AT_CLEANUP
1870
1871 AT_SETUP([MATRIX - IDENT INV KRONEKER LG10 LN])
1872 AT_DATA([matrix.sps], [dnl
1873 MATRIX.
1874 PRINT IDENT(1).
1875 PRINT IDENT(2).
1876 PRINT IDENT(3,5).
1877 PRINT IDENT(5,3).
1878
1879 PRINT INV({3, 3.5; 3.2, 3.6})/FORMAT F8.2.
1880 PRINT INV({4, 7; 2, 6})/FORMAT F8.2.
1881 PRINT (INV({4, -2, 1; 5, 0, 3; -1, 2, 6})*52)/FORMAT F8.2.
1882
1883 PRINT KRONEKER({1, 2; 3, 4}, {0, 5; 6, 7}).
1884
1885 PRINT LG10({1, 10, 100, 1000}).
1886
1887 PRINT LN({1, 2; 3, 4})/FORMAT F5.2.
1888 PRINT LN(0).
1889 END MATRIX.
1890 ])
1891 AT_CHECK([pspp matrix.sps], [1], [dnl
1892 IDENT(1)
1893   1
1894
1895 IDENT(2)
1896   1  0
1897   0  1
1898
1899 IDENT(3,5)
1900   1  0  0  0  0
1901   0  1  0  0  0
1902   0  0  1  0  0
1903
1904 IDENT(5,3)
1905   1  0  0
1906   0  1  0
1907   0  0  1
1908   0  0  0
1909   0  0  0
1910
1911 INV({3, 3.5; 3.2, 3.6})
1912     -9.00     8.75
1913      8.00    -7.50
1914
1915 INV({4, 7; 2, 6})
1916       .60     -.70
1917      -.20      .40
1918
1919 (INV({4, -2, 1; 5, 0, 3; -1, 2, 6})*52)
1920     -6.00    14.00    -6.00
1921    -33.00    25.00    -7.00
1922     10.00    -6.00    10.00
1923
1924 KRONEKER({1, 2; 3, 4}, {0, 5; 6, 7})
1925    0   5   0  10
1926    6   7  12  14
1927    0  15   0  20
1928   18  21  24  28
1929
1930 LG10({1, 10, 100, 1000})
1931   0  1  2  3
1932
1933 LN({1, 2; 3, 4})
1934    .00   .69
1935   1.10  1.39
1936
1937 matrix.sps:16.7-16.11: error: MATRIX: Argument 1 to matrix function LN must be
1938 greater than 0.
1939    16 | PRINT LN(0).
1940       |       ^~~~~
1941
1942 matrix.sps:16.10: note: MATRIX: Argument 1 is 0.
1943    16 | PRINT LN(0).
1944       |          ^
1945 ])
1946 AT_CLEANUP
1947
1948 AT_SETUP([MATRIX - MAGIC])
1949 AT_DATA([matrix.sps], [dnl
1950 MATRIX.
1951
1952 LOOP n=3 to 10.
1953     COMPUTE m=MAGIC(n).
1954     COMPUTE total=n*(n**2 + 1) / 2.
1955     COMPUTE tb={MSUM(DIAG(T(m))), CSUM(m), MSUM(DIAG(m))} - total.
1956     COMPUTE lr=RSUM(m) - total.
1957     PRINT {tb; lr, m, lr; tb}/FORMAT F4.0.
1958 END LOOP.
1959 END MATRIX.
1960 ])
1961 AT_CHECK([pspp matrix.sps], [0], [dnl
1962 {tb; lr, m, lr; tb}
1963     0    0    0    0    0
1964     0    8    1    6    0
1965     0    3    5    7    0
1966     0    4    9    2    0
1967     0    0    0    0    0
1968 {tb; lr, m, lr; tb}
1969     0    0    0    0    0    0
1970     0    1    5   12   16    0
1971     0   15   11    6    2    0
1972     0   14    8    9    3    0
1973     0    4   10    7   13    0
1974     0    0    0    0    0    0
1975 {tb; lr, m, lr; tb}
1976     0    0    0    0    0    0    0
1977     0   17   24    1    8   15    0
1978     0   23    5    7   14   16    0
1979     0    4    6   13   20   22    0
1980     0   10   12   19   21    3    0
1981     0   11   18   25    2    9    0
1982     0    0    0    0    0    0    0
1983 {tb; lr, m, lr; tb}
1984     0    0    0    0    0    0    0    0
1985     0    1    5    9   28   32   36    0
1986     0   35   30   27   10    7    2    0
1987     0   24   14   22   18   17   16    0
1988     0   13   23   15   19   20   21    0
1989     0   34   31   26   11    6    3    0
1990     0    4    8   12   25   29   33    0
1991     0    0    0    0    0    0    0    0
1992 {tb; lr, m, lr; tb}
1993     0    0    0    0    0    0    0    0    0
1994     0   30   39   48    1   10   19   28    0
1995     0   38   47    7    9   18   27   29    0
1996     0   46    6    8   17   26   35   37    0
1997     0    5   14   16   25   34   36   45    0
1998     0   13   15   24   33   42   44    4    0
1999     0   21   23   32   41   43    3   12    0
2000     0   22   31   40   49    2   11   20    0
2001     0    0    0    0    0    0    0    0    0
2002 {tb; lr, m, lr; tb}
2003     0    0    0    0    0    0    0    0    0    0
2004     0    1    9   17   25   40   48   56   64    0
2005     0   63   55   47   39   26   18   10    2    0
2006     0    3   11   19   27   38   46   54   62    0
2007     0   61   53   45   37   28   20   12    4    0
2008     0   60   52   44   32   33   21   13    5    0
2009     0    6   14   22   30   35   43   51   59    0
2010     0   58   50   42   34   31   23   15    7    0
2011     0    8   16   24   36   29   41   49   57    0
2012     0    0    0    0    0    0    0    0    0    0
2013 {tb; lr, m, lr; tb}
2014     0    0    0    0    0    0    0    0    0    0    0
2015     0   47   58   69   80    1   12   23   34   45    0
2016     0   57   68   79    9   11   22   33   44   46    0
2017     0   67   78    8   10   21   32   43   54   56    0
2018     0   77    7   18   20   31   42   53   55   66    0
2019     0    6   17   19   30   41   52   63   65   76    0
2020     0   16   27   29   40   51   62   64   75    5    0
2021     0   26   28   39   50   61   72   74    4   15    0
2022     0   36   38   49   60   71   73    3   14   25    0
2023     0   37   48   59   70   81    2   13   24   35    0
2024     0    0    0    0    0    0    0    0    0    0    0
2025 {tb; lr, m, lr; tb}
2026     0    0    0    0    0    0    0    0    0    0    0    0
2027     0    1    9   17   25   33   68   76   84   92  100    0
2028     0   99   91   83   75   67   34   26   18   10    2    0
2029     0    3   11   19   27   35   66   74   82   90   98    0
2030     0   97   89   81   72   65   36   29   20   12    4    0
2031     0   60   42   58   44   56   50   49   53   47   46    0
2032     0   41   59   43   57   45   51   52   48   54   55    0
2033     0   96   88   80   73   64   37   28   21   13    5    0
2034     0    6   14   22   30   38   63   71   79   87   95    0
2035     0   94   86   78   70   62   39   31   23   15    7    0
2036     0    8   16   24   32   40   61   69   77   85   93    0
2037     0    0    0    0    0    0    0    0    0    0    0    0
2038 ])
2039 AT_CLEANUP
2040
2041 AT_SETUP([MATRIX - MAKE MDIAG MMAX MMIN MOD])
2042 AT_DATA([matrix.sps], [dnl
2043 MATRIX.
2044 PRINT MAKE(1, 2, 3).
2045 PRINT MAKE(2, 1, 4).
2046 PRINT MAKE(2, 3, 5).
2047
2048 PRINT MDIAG({1, 2, 3, 4}).
2049 PRINT MDIAG({1; 2; 3; 4}).
2050 PRINT MDIAG({1, 2; 3, 4}).
2051
2052 PRINT MMAX({55, 44; 66, 11}).
2053
2054 PRINT MMIN({55, 44; 66, 11}).
2055
2056 PRINT MOD({5, 4, 3, 2, 1, 0}, 3).
2057 PRINT MOD({5, 4, 3, 2, 1, 0}, -3).
2058 PRINT MOD({-5, -4, -3, -2, -1, 0}, 3).
2059 PRINT MOD({-5, -4, -3, -2, -1, 0}, -3).
2060 PRINT MOD({5, 4, 3, 2, 1, 0}, 1.5) /FORMAT F5.1.
2061 PRINT MOD({5, 4, 3, 2, 1, 0}, 0).
2062 END MATRIX.
2063 ])
2064 AT_CHECK([pspp matrix.sps], [1], [dnl
2065 MAKE(1, 2, 3)
2066   3  3
2067
2068 MAKE(2, 1, 4)
2069   4
2070   4
2071
2072 MAKE(2, 3, 5)
2073   5  5  5
2074   5  5  5
2075
2076 MDIAG({1, 2, 3, 4})
2077   1  0  0  0
2078   0  2  0  0
2079   0  0  3  0
2080   0  0  0  4
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 matrix.sps:8.13-8.24: error: MATRIX: Function MDIAG argument 1 must be a
2089 vector, not a 2×2 matrix.
2090     8 | PRINT MDIAG({1, 2; 3, 4}).
2091       |             ^~~~~~~~~~~~
2092
2093 MMAX({55, 44; 66, 11})
2094   66
2095
2096 MMIN({55, 44; 66, 11})
2097   11
2098
2099 MOD({5, 4, 3, 2, 1, 0}, 3)
2100   2  1  0  2  1  0
2101
2102 MOD({5, 4, 3, 2, 1, 0}, -3)
2103   2  1  0  2  1  0
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}, 1.5)
2112     .5   1.0    .0    .5   1.0    .0
2113
2114 matrix.sps:19.7-19.32: error: MATRIX: Argument 2 to matrix function MOD must
2115 not be equal to 0.
2116    19 | PRINT MOD({5, 4, 3, 2, 1, 0}, 0).
2117       |       ^~~~~~~~~~~~~~~~~~~~~~~~~~
2118 ])
2119 AT_CLEANUP
2120
2121 AT_SETUP([MATRIX - MSSQ MSUM NCOL NROW RANK])
2122 AT_DATA([matrix.sps], [dnl
2123 MATRIX.
2124 PRINT MSSQ({1, 0, 1; -2, -3, 1; 3, 3, 0}).
2125
2126 PRINT MSUM({1, 0, 1; -2, -3, 1; 3, 3, 0}).
2127
2128 PRINT NCOL({1, 0; -2, -3; 3, 3}).
2129
2130 PRINT NROW({1, 0; -2, -3; 3, 3}).
2131
2132 PRINT RANK({1, 0, 1; -2, -3, 1; 3, 3, 0}).
2133 PRINT RANK({1, 1, 0, 2; -1, -1, 0, -2}).
2134 PRINT RANK({1, -1; 1, -1; 0, 0; 2, -2}).
2135 PRINT RANK({1, 2, 1; -2, -3, 1; 3, 5, 0}).
2136 PRINT RANK({1, 0, 2; 2, 1, 0; 3, 2, 1}).
2137 END MATRIX.
2138 ])
2139 AT_CHECK([pspp matrix.sps], [0], [dnl
2140 MSSQ({1, 0, 1; -2, -3, 1; 3, 3, 0})
2141   34
2142
2143 MSUM({1, 0, 1; -2, -3, 1; 3, 3, 0})
2144   4
2145
2146 NCOL({1, 0; -2, -3; 3, 3})
2147   2
2148
2149 NROW({1, 0; -2, -3; 3, 3})
2150   3
2151
2152 RANK({1, 0, 1; -2, -3, 1; 3, 3, 0})
2153   2
2154
2155 RANK({1, 1, 0, 2; -1, -1, 0, -2})
2156   1
2157
2158 RANK({1, -1; 1, -1; 0, 0; 2, -2})
2159   1
2160
2161 RANK({1, 2, 1; -2, -3, 1; 3, 5, 0})
2162   2
2163
2164 RANK({1, 0, 2; 2, 1, 0; 3, 2, 1})
2165   3
2166 ])
2167 AT_CLEANUP
2168
2169 AT_SETUP([MATRIX - RESHAPE RMAX RMIN RND RNKORDER])
2170 AT_DATA([matrix.sps], [dnl
2171 MATRIX.
2172 PRINT RESHAPE(1:12, 1, 12).
2173 PRINT RESHAPE(1:12, 2, 6).
2174 PRINT RESHAPE(1:12, 3, 4).
2175 PRINT RESHAPE(1:12, 4, 3).
2176 PRINT RESHAPE(1:12, 6, 2).
2177 PRINT RESHAPE(1:12, 12, 1).
2178
2179 PRINT RMAX({1, 0, 1; -2, -3, 1; 3, 3, 0}).
2180
2181 PRINT RMIN({1, 0, 1; -2, -3, 1; 3, 3, 0}).
2182
2183 PRINT RND({-1.6, -1.5, -1.4;
2184            -.6, -.5, -.4;
2185            .4, .5, .6;
2186            1.4, 1.5, 1.6})/FORMAT F5.1.
2187
2188 PRINT RNKORDER({1, 0, 3; 3, 1, 2; 3, 0, 5}) /FORMAT F5.1.
2189 END MATRIX.
2190 ])
2191 AT_CHECK([pspp matrix.sps], [0], [dnl
2192 RESHAPE(1:12, 1, 12)
2193    1   2   3   4   5   6   7   8   9  10  11  12
2194
2195 RESHAPE(1:12, 2, 6)
2196    1   2   3   4   5   6
2197    7   8   9  10  11  12
2198
2199 RESHAPE(1:12, 3, 4)
2200    1   2   3   4
2201    5   6   7   8
2202    9  10  11  12
2203
2204 RESHAPE(1:12, 4, 3)
2205    1   2   3
2206    4   5   6
2207    7   8   9
2208   10  11  12
2209
2210 RESHAPE(1:12, 6, 2)
2211    1   2
2212    3   4
2213    5   6
2214    7   8
2215    9  10
2216   11  12
2217
2218 RESHAPE(1:12, 12, 1)
2219    1
2220    2
2221    3
2222    4
2223    5
2224    6
2225    7
2226    8
2227    9
2228   10
2229   11
2230   12
2231
2232 RMAX({1, 0, 1; -2, -3, 1; 3, 3, 0})
2233   1
2234   1
2235   3
2236
2237 RMIN({1, 0, 1; -2, -3, 1; 3, 3, 0})
2238   0
2239  -3
2240   0
2241
2242 RND({-1.6, -1.5, -1.4;
2243            -.6, -.5, -.4;
2244            .4, .5, .6;
2245            1.4, 1.5, 1.6})
2246   -2.0  -2.0  -1.0
2247   -1.0    .0    .0
2248     .0    .0   1.0
2249    1.0   2.0   2.0
2250
2251 RNKORDER({1, 0, 3; 3, 1, 2; 3, 0, 5})
2252    3.5   1.5   7.0
2253    7.0   3.5   5.0
2254    7.0   1.5   9.0
2255 ])
2256 AT_CLEANUP
2257
2258 AT_SETUP([MATRIX - RSSQ RSUM SIN SOLVE SQRT])
2259 AT_DATA([matrix.sps], [dnl
2260 MATRIX.
2261 PRINT RSSQ({1, 2, 3; 4, 5, 6; 7, 8, 9}).
2262 PRINT RSUM({1, 2, 3; 4, 5, 6; 7, 8, 9}).
2263
2264 PRINT SIN({0, .78, 1.57, 2.35, 3.14}) /FORMAT F5.2.
2265
2266 PRINT SOLVE({2, 3; 4, 9}, {6, 2; 15, 5}) /FORMAT=F6.2.
2267 PRINT SOLVE({1, 3, -2; 3, 5, 6; 2, 4, 3}, {5; 7; 8}) /FORMAT=F6.2.
2268 PRINT SOLVE({2, 1, -1; -3, -1, 2; -2, 1, 2}, {8; -11; -3}) /FORMAT=F6.2.
2269 PRINT SOLVE({1, 2; 3, 4}, {1, 2}).
2270
2271 PRINT SQRT({0, 1, 2, 3, 4, 9, 81}) /FORMAT=F5.2.
2272 PRINT SQRT(-1).
2273 END MATRIX.
2274 ])
2275 AT_CHECK([pspp matrix.sps], [1], [dnl
2276 RSSQ({1, 2, 3; 4, 5, 6; 7, 8, 9})
2277    14
2278    77
2279   194
2280
2281 RSUM({1, 2, 3; 4, 5, 6; 7, 8, 9})
2282    6
2283   15
2284   24
2285
2286 SIN({0, .78, 1.57, 2.35, 3.14})
2287    .00   .70  1.00   .71   .00
2288
2289 SOLVE({2, 3; 4, 9}, {6, 2; 15, 5})
2290    1.50    .50
2291    1.00    .33
2292
2293 SOLVE({1, 3, -2; 3, 5, 6; 2, 4, 3}, {5; 7; 8})
2294  -15.00
2295    8.00
2296    2.00
2297
2298 SOLVE({2, 1, -1; -3, -1, 2; -2, 1, 2}, {8; -11; -3})
2299    2.00
2300    3.00
2301   -1.00
2302
2303 matrix.sps:10.7-10.33: error: MATRIX: SOLVE arguments must have the same number
2304 of rows.
2305    10 | PRINT SOLVE({1, 2; 3, 4}, {1, 2}).
2306       |       ^~~~~~~~~~~~~~~~~~~~~~~~~~~
2307
2308 matrix.sps:10.13-10.24: note: MATRIX: Argument 1 has dimensions 2×2.
2309    10 | PRINT SOLVE({1, 2; 3, 4}, {1, 2}).
2310       |             ^~~~~~~~~~~~
2311
2312 matrix.sps:10.27-10.32: note: MATRIX: Argument 2 has dimensions 1×2.
2313    10 | PRINT SOLVE({1, 2; 3, 4}, {1, 2}).
2314       |                           ^~~~~~
2315
2316 SQRT({0, 1, 2, 3, 4, 9, 81})
2317    .00  1.00  1.41  1.73  2.00  3.00  9.00
2318
2319 matrix.sps:13.7-13.14: error: MATRIX: Argument 1 to matrix function SQRT must
2320 be greater than or equal to 0.
2321    13 | PRINT SQRT(-1).
2322       |       ^~~~~~~~
2323
2324 matrix.sps:13.12-13.13: note: MATRIX: Argument 1 is -1.
2325    13 | PRINT SQRT(-1).
2326       |            ^~
2327 ])
2328 AT_CLEANUP
2329
2330 AT_SETUP([MATRIX - SSCP SVAL SWEEP TRACE TRANSPOS TRUNC])
2331 AT_DATA([matrix.sps], [dnl
2332 MATRIX.
2333 COMPUTE m={1, 2, 3; 4, 5, 6}
2334 COMPUTE sscp1=SSCP(m).
2335 COMPUTE sscp2=T(m)*m.
2336 PRINT sscp1.
2337 PRINT (sscp1 <> sscp2).
2338
2339 PRINT SVAL({1, 1; 0, 0})/FORMAT F5.2.
2340 PRINT SVAL({1, 0, 1; 0, 1, 1; 0, 0, 0})/FORMAT F5.2.
2341 PRINT SVAL({1, 0, 0, 0, 2; 0, 0, 3, 0, 0; 0, 0, 0, 0, 0; 0, 2, 0, 0, 0})
2342     /FORMAT F5.2.
2343 PRINT SVAL({2, 4; 1, 3; 0, 0; 0, 0})/FORMAT F5.2.
2344
2345 COMPUTE s0 = {6, 12, 0, 12; 12, 28, 0, 25; 0, 0, 6, 2; 12, 25, 2, 28}.
2346 PRINT SWEEP(s0, 1)/FORMAT F5.2.
2347 PRINT SWEEP(SWEEP(s0, 1), 2)/FORMAT F5.2.
2348 PRINT SWEEP(SWEEP(SWEEP(s0, 1), 2), 3)/FORMAT F5.2.
2349
2350 COMPUTE s1 = {6, 12, 0, 12; 12, 0, 0, 25; 0, 0, 6, 2; 12, 25, 2, 28}.
2351 PRINT SWEEP(s1, 2).
2352
2353 COMPUTE s2 = {0, 1, 2; 3, 4, 5; 6, 7, 8}.
2354 PRINT SWEEP(s2, 1).
2355 PRINT SWEEP(s2, 2).
2356 PRINT SWEEP(s2, 3).
2357
2358 PRINT TRACE(s0).
2359
2360 PRINT T(s0).
2361 PRINT TRANSPOS(s0).
2362 PRINT ALL(T(T(s0)) = s0).
2363
2364 PRINT TRUNC(SVAL({2, 4; 1, 3; 0, 0; 0, 0})).
2365 PRINT TRUNC(-SVAL({2, 4; 1, 3; 0, 0; 0, 0})).
2366 END MATRIX.
2367 ])
2368 AT_CHECK([pspp matrix.sps], [0], [dnl
2369 sscp1
2370   17  22  27
2371   22  29  36
2372   27  36  45
2373
2374 (sscp1 <> sscp2)
2375  0 0 0
2376  0 0 0
2377  0 0 0
2378
2379 SVAL({1, 1; 0, 0})
2380   1.41
2381    .00
2382
2383 SVAL({1, 0, 1; 0, 1, 1; 0, 0, 0})
2384   1.73
2385   1.00
2386    .00
2387
2388 SVAL({1, 0, 0, 0, 2; 0, 0, 3, 0, 0; 0, 0, 0, 0, 0; 0, 2, 0, 0, 0})
2389   3.00
2390   2.24
2391   2.00
2392    .00
2393
2394 SVAL({2, 4; 1, 3; 0, 0; 0, 0})
2395   5.46
2396    .37
2397
2398 SWEEP(s0, 1)
2399    .17  2.00   .00  2.00
2400  -2.00  4.00   .00  1.00
2401    .00   .00  6.00  2.00
2402  -2.00  1.00  2.00  4.00
2403
2404 SWEEP(SWEEP(s0, 1), 2)
2405   1.17  -.50   .00  1.50
2406   -.50   .25   .00   .25
2407    .00   .00  6.00  2.00
2408  -1.50  -.25  2.00  3.75
2409
2410 SWEEP(SWEEP(SWEEP(s0, 1), 2), 3)
2411   1.17  -.50   .00  1.50
2412   -.50   .25   .00   .25
2413    .00   .00   .17   .33
2414  -1.50  -.25  -.33  3.08
2415
2416 SWEEP(s1, 2)
2417    6   0   0  12
2418    0   0   0   0
2419    0   0   6   2
2420   12   0   2  28
2421
2422 SWEEP(s2, 1)
2423   0  0  0
2424   0  4  5
2425   0  7  8
2426
2427 SWEEP(s2, 2)
2428   -.7500000000  -.2500000000   .7500000000
2429    .7500000000   .2500000000  1.2500000000
2430    .7500000000 -1.7500000000  -.7500000000
2431
2432 SWEEP(s2, 3)
2433  -1.5000000000  -.7500000000  -.2500000000
2434   -.7500000000  -.3750000000  -.6250000000
2435    .7500000000   .8750000000   .1250000000
2436
2437 TRACE(s0)
2438   68
2439
2440 T(s0)
2441    6  12   0  12
2442   12  28   0  25
2443    0   0   6   2
2444   12  25   2  28
2445
2446 TRANSPOS(s0)
2447    6  12   0  12
2448   12  28   0  25
2449    0   0   6   2
2450   12  25   2  28
2451
2452 ALL(T(T(s0)) = s0)
2453   1
2454
2455 TRUNC(SVAL({2, 4; 1, 3; 0, 0; 0, 0}))
2456   5
2457   0
2458
2459 TRUNC(-SVAL({2, 4; 1, 3; 0, 0; 0, 0}))
2460  -5
2461   0
2462 ])
2463 AT_CLEANUP
2464
2465 AT_SETUP([MATRIX - UNIFORM])
2466 AT_DATA([matrix.sps], [dnl
2467 SET SEED=10.
2468 MATRIX.
2469 PRINT (UNIFORM(4, 5)*10)/FORMAT F5.2.
2470 END MATRIX.
2471 ])
2472 AT_CHECK([pspp matrix.sps], [0], [dnl
2473 (UNIFORM(4, 5)*10)
2474   7.71  2.99   .21  4.95  6.34
2475   4.43  7.49  8.32  4.99  5.83
2476   2.25   .25  1.98  7.09  7.61
2477   2.66  1.69  2.64   .88  1.50
2478 ])
2479 AT_CLEANUP
2480
2481 AT_SETUP([MATRIX - invalid function arguments])
2482 AT_DATA([matrix.sps], [dnl
2483 MATRIX.
2484 COMPUTE x=MOD({1,2,3},{4,5,6}).
2485 COMPUTE x=MDIAG({1, 2; 3, 4}).
2486 COMPUTE x=ARSIN(2).
2487 COMPUTE x=ARSIN({1, 1; -1, 2}).
2488 COMPUTE x=CDF.UNIFORM(2,1,1).
2489 COMPUTE x=CDF.UNIFORM(1,2,1).
2490 COMPUTE x=CDF.UNIFORM({1,2},1,1).
2491 COMPUTE x=MAGIC(2).
2492 END MATRIX.
2493 ])
2494 AT_CHECK([pspp matrix.sps], [1], [dnl
2495 matrix.sps:2.23-2.29: error: MATRIX: Function MOD argument 2 must be a scalar,
2496 not a 1×3 matrix.
2497     2 | COMPUTE x=MOD({1,2,3},{4,5,6}).
2498       |                       ^~~~~~~
2499
2500 matrix.sps:3.17-3.28: error: MATRIX: Function MDIAG argument 1 must be a
2501 vector, not a 2×2 matrix.
2502     3 | COMPUTE x=MDIAG({1, 2; 3, 4}).
2503       |                 ^~~~~~~~~~~~
2504
2505 matrix.sps:4.17: error: MATRIX: Argument 1 to matrix function ARSIN is 2, which
2506 is outside the valid range [[-1,1]].
2507     4 | COMPUTE x=ARSIN(2).
2508       |                 ^
2509
2510 matrix.sps:5.17-5.29: error: MATRIX: Row 2, column 2 of argument 1 to matrix
2511 function ARSIN is 2, which is outside the valid range [[-1,1]].
2512     5 | COMPUTE x=ARSIN({1, 1; -1, 2}).
2513       |                 ^~~~~~~~~~~~~
2514
2515 error: Argument 1 to matrix function CDF.UNIFORM must be less than or equal to
2516 argument 3.
2517
2518 matrix.sps:6.23: note: MATRIX: Argument 1 is 2.
2519     6 | COMPUTE x=CDF.UNIFORM(2,1,1).
2520       |                       ^
2521
2522 matrix.sps:6.27: note: MATRIX: Argument 3 is 1.
2523     6 | COMPUTE x=CDF.UNIFORM(2,1,1).
2524       |                           ^
2525
2526 error: Argument 2 to matrix function CDF.UNIFORM must be less than or equal to
2527 argument 3.
2528
2529 matrix.sps:7.25: note: MATRIX: Argument 2 is 2.
2530     7 | COMPUTE x=CDF.UNIFORM(1,2,1).
2531       |                         ^
2532
2533 matrix.sps:7.27: note: MATRIX: Argument 3 is 1.
2534     7 | COMPUTE x=CDF.UNIFORM(1,2,1).
2535       |                           ^
2536
2537 error: Argument 1 to matrix function CDF.UNIFORM must be less than or equal to
2538 argument 3.
2539
2540 matrix.sps:8.23-8.27: note: MATRIX: Row 1, column 2 of argument 1 is 2.
2541     8 | COMPUTE x=CDF.UNIFORM({1,2},1,1).
2542       |                       ^~~~~
2543
2544 matrix.sps:8.31: note: MATRIX: Argument 3 is 1.
2545     8 | COMPUTE x=CDF.UNIFORM({1,2},1,1).
2546       |                               ^
2547
2548 matrix.sps:9.11-9.18: error: MATRIX: Argument 1 to matrix function MAGIC must
2549 be greater than or equal to 3.
2550     9 | COMPUTE x=MAGIC(2).
2551       |           ^~~~~~~~
2552
2553 matrix.sps:9.17: note: MATRIX: Argument 1 is 2.
2554     9 | COMPUTE x=MAGIC(2).
2555       |                 ^
2556 ])
2557 AT_CLEANUP
2558
2559 AT_SETUP([MATRIX - invalid number function arguments])
2560 AT_DATA([matrix.sps], [dnl
2561 MATRIX.
2562 COMPUTE x=ABS().
2563 COMPUTE x=ABS(1,2).
2564 COMPUTE x=KRONEKER(1,2,3).
2565 COMPUTE x=IDENT().
2566 COMPUTE x=IDENT(1,2,3).
2567 COMPUTE x=BLOCK().
2568 END MATRIX.
2569 ])
2570 AT_CHECK([pspp matrix.sps], [1], [dnl
2571 matrix.sps:2: error: COMPUTE: Matrix function ABS requires 1 argument.
2572
2573 matrix.sps:3: error: COMPUTE: Matrix function ABS requires 1 argument.
2574
2575 matrix.sps:4: error: COMPUTE: Matrix function KRONEKER requires 2 arguments.
2576
2577 matrix.sps:5: error: COMPUTE: Matrix function IDENT requires 1 or 2 arguments,
2578 but 0 were provided.
2579
2580 matrix.sps:6: error: COMPUTE: Matrix function IDENT requires 1 or 2 arguments,
2581 but 3 were provided.
2582
2583 matrix.sps:7: error: COMPUTE: Matrix function BLOCK requires at least one
2584 argument.
2585 ])
2586 AT_CLEANUP
2587
2588 AT_SETUP([MATRIX - CALL SETDIAG])
2589 AT_DATA([matrix.sps], [dnl
2590 MATRIX.
2591 COMPUTE x={1, 2, 3; 4, 5, 6; 7, 8, 9}.
2592
2593 COMPUTE x1=x.
2594 CALL SETDIAG(x1, 10).
2595 PRINT x1.
2596
2597 COMPUTE x2=x.
2598 CALL SETDIAG(x2, {10, 11}).
2599 PRINT x2.
2600
2601 COMPUTE x3=x.
2602 CALL SETDIAG(x3, {10, 11, 12}).
2603 PRINT x3.
2604
2605 COMPUTE x4=x.
2606 CALL SETDIAG(x4, {10, 11, 12, 13}).
2607 PRINT x4.
2608
2609 COMPUTE x5=x.
2610 CALL SETDIAG(x5, {10, 11; 12, 13}).
2611 PRINT x5.
2612
2613 END MATRIX.
2614 ])
2615 AT_CHECK([pspp matrix.sps], [1], [dnl
2616 x1
2617   10   2   3
2618    4  10   6
2619    7   8  10
2620
2621 x2
2622   10   2   3
2623    4  11   6
2624    7   8   9
2625
2626 x3
2627   10   2   3
2628    4  11   6
2629    7   8  12
2630
2631 x4
2632   10   2   3
2633    4  11   6
2634    7   8  12
2635
2636 matrix.sps:21.18-21.33: error: MATRIX: SETDIAG argument 2 must be a scalar or a
2637 vector, not a 2×2 matrix.
2638    21 | CALL SETDIAG(x5, {10, 11; 12, 13}).
2639       |                  ^~~~~~~~~~~~~~~~
2640
2641 x5
2642   1  2  3
2643   4  5  6
2644   7  8  9
2645 ])
2646 AT_CLEANUP
2647
2648 dnl I have some doubts about the correctness of the results below.
2649 AT_SETUP([MATRIX - CALL EIGEN])
2650 AT_DATA([matrix.sps], [dnl
2651 MATRIX.
2652 CALL EIGEN({1, 0; 0, 1}, evec, eval).
2653 PRINT evec.
2654 PRINT eval.
2655
2656 CALL EIGEN({3, 2, 4; 2, 0, 2; 4, 2, 3}, evec2, eval2).
2657 PRINT evec2.
2658 PRINT eval2.
2659 END MATRIX.
2660 ])
2661 AT_CHECK([pspp matrix.sps], [0], [dnl
2662 evec
2663   1  0
2664   0  1
2665
2666 eval
2667   1
2668   1
2669
2670 evec2
2671   -.6666666667   .0000000000   .7453559925
2672   -.3333333333  -.8944271910  -.2981423970
2673   -.6666666667   .4472135955  -.5962847940
2674
2675 eval2
2676   8.0000000000
2677  -1.0000000000
2678  -1.0000000000
2679 ])
2680 AT_CLEANUP
2681
2682 AT_SETUP([MATRIX - CALL SVD])
2683 AT_DATA([matrix.sps], [dnl
2684 MATRIX.
2685 CALL SVD({3, 2, 2; 2, 3, -2}, u, s, v).
2686 PRINT (u * s * T(v))/FORMAT F5.1.
2687
2688 CALL SVD({2, 4; 1, 3; 0, 0; 0, 0}, u, s, v).
2689 PRINT (u*s*T(v))/FORMAT F5.1.
2690
2691 CALL SVD({-3, 1; 6, -2; 6, -2}, u, s, v).
2692 PRINT (u*s*T(v))/FORMAT F5.1.
2693 END MATRIX.
2694 ])
2695 AT_CHECK([pspp matrix.sps], [0], [dnl
2696 (u * s * T(v))
2697    3.0   2.0   2.0
2698    2.0   3.0  -2.0
2699
2700 (u*s*T(v))
2701    2.0   4.0
2702    1.0   3.0
2703     .0    .0
2704     .0    .0
2705
2706 (u*s*T(v))
2707   -3.0   1.0
2708    6.0  -2.0
2709    6.0  -2.0
2710 ])
2711 AT_CLEANUP
2712
2713 AT_SETUP([MATRIX - PRINT])
2714 AT_DATA([matrix.sps], [dnl
2715 MATRIX.
2716 PRINT/TITLE="title 1".
2717 PRINT/SPACE=2/TITLE="title 2".
2718
2719 COMPUTE m={1, 2, 3; 3, 4, 5; 6, 7, 8}.
2720 PRINT m/RLABELS=123, a b c, long name.
2721 PRINT m/RNAMES={'123', 'a b c', 'long name'}.
2722 PRINT m/CLABELS=col1, col2, long column name.
2723 PRINT m/CNAMES={'col1', 'col2', 'long column name'}.
2724 PRINT m/RLABELS=123, a b c, long name
2725        /CLABELS=col1, col2, long column name.
2726 PRINT m/RNAMES={'123', 'a b c', 'long name'}
2727        /CNAMES={'col1', 'col2', 'long column name'}.
2728 PRINT {123e10, 456e10, 500}.
2729 END MATRIX.
2730 ])
2731
2732 AT_DATA([matrix-tables.sps], [dnl
2733 SET MDISPLAY=TABLES.
2734 INCLUDE 'matrix.sps'.
2735 ])
2736
2737 AT_CHECK([pspp matrix.sps], [0], [dnl
2738 title 1
2739
2740
2741
2742 title 2
2743
2744 m
2745 123       1  2  3
2746 a b c     3  4  5
2747 long nam  6  7  8
2748
2749 m
2750 123       1  2  3
2751 a b c     3  4  5
2752 long nam  6  7  8
2753
2754 m
2755      col1     col2 long col
2756         1        2        3
2757         3        4        5
2758         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 123             1        2        3
2769 a b c           3        4        5
2770 long nam        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 {123e10, 456e10, 500}
2779   10 ** 12   X
2780   1.2300000000  4.5600000000   .0000000005
2781 ])
2782
2783 AT_CHECK([pspp matrix-tables.sps], [0], [dnl
2784 title 1
2785
2786
2787
2788 title 2
2789
2790         m
2791 +---------+-----+
2792 |123      |1 2 3|
2793 |a b c    |3 4 5|
2794 |long name|6 7 8|
2795 +---------+-----+
2796
2797         m
2798 +--------+-----+
2799 |123     |1 2 3|
2800 |a b c   |3 4 5|
2801 |long nam|6 7 8|
2802 +--------+-----+
2803
2804               m
2805 +----+----+----------------+
2806 |col1|col2|long column name|
2807 +----+----+----------------+
2808 |   1|   2|               3|
2809 |   3|   4|               5|
2810 |   6|   7|               8|
2811 +----+----+----------------+
2812
2813           m
2814 +----+----+--------+
2815 |col1|col2|long col|
2816 +----+----+--------+
2817 |   1|   2|       3|
2818 |   3|   4|       5|
2819 |   6|   7|       8|
2820 +----+----+--------+
2821
2822                    m
2823 +---------+----+----+----------------+
2824 |         |col1|col2|long column name|
2825 +---------+----+----+----------------+
2826 |123      |   1|   2|               3|
2827 |a b c    |   3|   4|               5|
2828 |long name|   6|   7|               8|
2829 +---------+----+----+----------------+
2830
2831               m
2832 +--------+----+----+--------+
2833 |        |col1|col2|long col|
2834 +--------+----+----+--------+
2835 |123     |   1|   2|       3|
2836 |a b c   |   3|   4|       5|
2837 |long nam|   6|   7|       8|
2838 +--------+----+----+--------+
2839
2840               {123e10, 456e10, 500}
2841 +----------------------------------------------+
2842 |1.2300000000[[a]] 4.5600000000[[a]] .0000000005[[a]]|
2843 +----------------------------------------------+
2844 a. × 10**12
2845 ])
2846 AT_CLEANUP
2847
2848 AT_SETUP([MATRIX - DO IF])
2849 AT_DATA([matrix.sps], [dnl
2850 MATRIX.
2851 DO IF 1.
2852 PRINT/TITLE '1'.
2853 END IF.
2854
2855 DO IF 0.
2856 PRINT/TITLE '2'.
2857 ELSE IF 1.
2858 PRINT/TITLE '3'.
2859 END IF.
2860
2861 DO IF -1.
2862 PRINT/TITLE '4'.
2863 ELSE IF 0.
2864 PRINT/TITLE '5'.
2865 ELSE.
2866 PRINT/TITLE '6'.
2867 END IF.
2868
2869 DO IF {1, 2}.
2870 END IF.
2871
2872 DO IF 0.
2873 ELSE IF {}.
2874 END IF.
2875 END MATRIX.
2876 ])
2877 AT_CHECK([pspp matrix.sps], [1], [dnl
2878 1
2879
2880 3
2881
2882 6
2883
2884 matrix.sps:20.7-20.12: error: MATRIX: Expression for DO IF must evaluate to
2885 scalar, not a 1×2 matrix.
2886    20 | DO IF {1, 2}.
2887       |       ^~~~~~
2888
2889 matrix.sps:24.9-24.10: error: MATRIX: Expression for ELSE IF must evaluate to
2890 scalar, not a 0×0 matrix.
2891    24 | ELSE IF {}.
2892       |         ^~
2893 ])
2894 AT_CLEANUP
2895
2896 AT_SETUP([MATRIX - unbounded LOOP])
2897 AT_DATA([matrix.sps], [dnl
2898 MATRIX.
2899 * Truly unbounded loop.
2900 COMPUTE x=0.
2901 COMPUTE y={}.
2902 LOOP.
2903 COMPUTE x=x+1.
2904 COMPUTE y={y, x}.
2905 END LOOP.
2906 PRINT x.
2907 PRINT y.
2908
2909 * Unbounded loop terminates with BREAK.
2910 COMPUTE x=0.
2911 COMPUTE y={}.
2912 LOOP.
2913 COMPUTE x=x+1.
2914 COMPUTE y={y, x}.
2915 DO IF x >= 20.
2916     BREAK.
2917 END IF.
2918 END LOOP.
2919 PRINT x.
2920 PRINT y.
2921
2922 END MATRIX.
2923 ])
2924 AT_CHECK([pspp matrix.sps], [0], [dnl
2925 x
2926   40
2927
2928 y
2929    1   2   3   4   5   6   7   8   9  10  11  12  13  14  15  16  17  18  19
2930 20  21  22  23  24  25  26  27  28  29  30  31  32  33  34  35  36  37  38  39
2931 40
2932
2933 x
2934   20
2935
2936 y
2937    1   2   3   4   5   6   7   8   9  10  11  12  13  14  15  16  17  18  19
2938 20
2939 ])
2940 AT_CLEANUP
2941
2942 AT_SETUP([MATRIX - indexed or conditional LOOP])
2943 AT_DATA([matrix.sps], [dnl
2944 MATRIX.
2945 * Indexed loop terminates based on index.
2946 COMPUTE y={}.
2947 LOOP x=1 TO 20.
2948 COMPUTE y={y, x}.
2949 END LOOP.
2950 PRINT x.
2951 PRINT y.
2952
2953 * Indexed loop terminates based on MXLOOPS.
2954 COMPUTE y={}.
2955 LOOP x=1 TO 50.
2956 COMPUTE y={y, x}.
2957 END LOOP.
2958 PRINT x.
2959 PRINT y.
2960
2961 * Indexed loop terminates with BREAK.
2962 COMPUTE y={}.
2963 LOOP x=1 TO 50.
2964 COMPUTE y={y, x}.
2965 DO IF x >= 20.
2966     BREAK.
2967 END IF.
2968 END LOOP.
2969 PRINT x.
2970 PRINT y.
2971
2972 * Indexed loop terminates with top IF.
2973 COMPUTE y={}.
2974 LOOP x=1 TO 50 IF NCOL(y) < 15.
2975 COMPUTE y={y, x}.
2976 END LOOP.
2977 PRINT x.
2978 PRINT y.
2979
2980 * Indexed loop terminates with bottom IF.
2981 COMPUTE y={}.
2982 LOOP x=1 TO 50.
2983 COMPUTE y={y, x}.
2984 END LOOP IF NCOL(y) >= 22.
2985 PRINT x.
2986 PRINT y.
2987
2988 * Index behavior.
2989 COMPUTE indexing={
2990     1, 10, 1;
2991     1, 10, 2;
2992     1, 10, 3;
2993     1, 10, -1;
2994     1, 10, 0;
2995     10, 1, -1;
2996     10, 1, -2;
2997     10, 1, -3;
2998     10, 1, 1;
2999     10, 1, 0
3000 }.
3001 LOOP i=1 TO NROW(indexing).
3002     COMPUTE y={}.
3003     LOOP j=indexing(i, 1) TO indexing(i, 2) BY indexing(i, 3).
3004         COMPUTE y={y, j}.
3005     END LOOP.
3006     PRINT {indexing(i, :), y}.
3007 END LOOP.
3008
3009 LOOP i={} TO 5.
3010 END LOOP.
3011
3012 LOOP i=5 TO {}.
3013 END LOOP.
3014
3015 LOOP i=5 TO 8 BY {}.
3016 END LOOP.
3017
3018 LOOP IF {}.
3019 END LOOP.
3020
3021 LOOP.
3022 END LOOP IF {}.
3023
3024 LOOP i=1e100 to 1e200.
3025 END LOOP.
3026 END MATRIX.
3027 ])
3028 AT_CHECK([pspp matrix.sps], [1], [dnl
3029 x
3030   20
3031
3032 y
3033    1   2   3   4   5   6   7   8   9  10  11  12  13  14  15  16  17  18  19
3034 20
3035
3036 x
3037   40
3038
3039 y
3040    1   2   3   4   5   6   7   8   9  10  11  12  13  14  15  16  17  18  19
3041 20  21  22  23  24  25  26  27  28  29  30  31  32  33  34  35  36  37  38  39
3042 40
3043
3044 x
3045   20
3046
3047 y
3048    1   2   3   4   5   6   7   8   9  10  11  12  13  14  15  16  17  18  19
3049 20
3050
3051 x
3052   16
3053
3054 y
3055    1   2   3   4   5   6   7   8   9  10  11  12  13  14  15
3056
3057 x
3058   22
3059
3060 y
3061    1   2   3   4   5   6   7   8   9  10  11  12  13  14  15  16  17  18  19
3062 20  21  22
3063
3064 {indexing(i, :), y}
3065    1  10   1   1   2   3   4   5   6   7   8   9  10
3066 {indexing(i, :), y}
3067    1  10   2   1   3   5   7   9
3068 {indexing(i, :), y}
3069    1  10   3   1   4   7  10
3070 {indexing(i, :), y}
3071    1  10  -1
3072 {indexing(i, :), y}
3073    1  10   0
3074 {indexing(i, :), y}
3075   10   1  -1  10   9   8   7   6   5   4   3   2   1
3076 {indexing(i, :), y}
3077   10   1  -2  10   8   6   4   2
3078 {indexing(i, :), y}
3079   10   1  -3  10   7   4   1
3080 {indexing(i, :), y}
3081   10   1   1
3082 {indexing(i, :), y}
3083   10   1   0
3084
3085 matrix.sps:66.8-66.9: error: MATRIX: Expression for LOOP must evaluate to
3086 scalar, not a 0×0 matrix.
3087    66 | LOOP i={} TO 5.
3088       |        ^~
3089
3090 matrix.sps:69.13-69.14: error: MATRIX: Expression for TO must evaluate to
3091 scalar, not a 0×0 matrix.
3092    69 | LOOP i=5 TO {}.
3093       |             ^~
3094
3095 matrix.sps:72.18-72.19: error: MATRIX: Expression for BY must evaluate to
3096 scalar, not a 0×0 matrix.
3097    72 | LOOP i=5 TO 8 BY {}.
3098       |                  ^~
3099
3100 matrix.sps:75.9-75.10: error: MATRIX: Expression for LOOP IF must evaluate to
3101 scalar, not a 0×0 matrix.
3102    75 | LOOP IF {}.
3103       |         ^~
3104
3105 matrix.sps:79.13-79.14: error: MATRIX: Expression for END LOOP IF must evaluate
3106 to scalar, not a 0×0 matrix.
3107    79 | END LOOP IF {}.
3108       |             ^~
3109
3110 matrix.sps:81.8-81.12: error: MATRIX: Expression for LOOP is outside the
3111 integer range.
3112    81 | LOOP i=1e100 to 1e200.
3113       |        ^~~~~
3114 ])
3115 AT_CLEANUP
3116
3117 AT_SETUP([MATRIX - BREAK outside LOOP])
3118 AT_DATA([matrix.sps], [dnl
3119 MATRIX.
3120 BREAK.
3121 END MATRIX.
3122 ])
3123 AT_CHECK([pspp matrix.sps], [1], [dnl
3124 matrix.sps:2: error: BREAK: BREAK not inside LOOP.
3125 ])
3126 AT_CLEANUP
3127
3128 AT_SETUP([MATRIX - READ])
3129 AT_DATA([matrix.txt], [dnl
3130 9
3131 8
3132 7
3133 6
3134 1 2 3
3135 4 5 6
3136 7 8 9
3137 10 11 12,13
3138 14, 15 ,16 , 17
3139 18
3140 19
3141 20 21 22 23
3142     12        34
3143 5    6
3144     78        89
3145 10   11
3146 $1 $2 3
3147 4 $5 6
3148 $1   $2   $3   4
3149    $5$6      $78
3150 1% 2% 3% 4
3151   56%  7%8
3152 abcdefghijkl
3153 ABCDEFGHIJKL
3154 ])
3155 AT_DATA([matrix2.txt], [dnl
3156 2, 3, 5, 7
3157 11, 13, 17, 19
3158 23, 29, 31, 37
3159 41, 43, 47, 53
3160 ])
3161 AT_DATA([matrix3.txt], [dnl
3162 1 5
3163 3 1 2 3
3164 5 6 -1 2 5 1
3165 2 8 9
3166 3 1 3 2
3167 ])
3168 AT_DATA([matrix.sps], [dnl
3169 MATRIX.
3170 READ x/FILE='matrix.txt'/SIZE=4/FIELD=1 TO 1.
3171 PRINT x.
3172 READ x/FILE='matrix.txt'/SIZE={3,3}/FIELD=1 TO 80.
3173 PRINT x.
3174 READ x/SIZE={2,4}/FIELD=1 TO 80.
3175 PRINT x.
3176 READ x(:,2)/FILE='matrix.txt'/FIELD=1 TO 80.
3177 PRINT x.
3178 READ x(1,:)/SIZE={1,4}/FIELD=1 TO 80.
3179 PRINT x.
3180
3181 READ x/SIZE={2,6}/FIELD=1 TO 20 BY 5.
3182 PRINT x.
3183 READ x/SIZE={2,3}/FIELD=1 TO 20/FORMAT=DOLLAR.
3184 PRINT x.
3185 READ x/SIZE={2,4}/FIELD=1 TO 20/FORMAT=DOLLAR5.1.
3186 PRINT x.
3187 READ x/SIZE={2,4}/FIELD=1 TO 12/FORMAT='4PCT'.
3188 PRINT x.
3189 READ x/SIZE={2,4}/FIELD=1 TO 12/FORMAT='4A'.
3190 PRINT x/FORMAT=A3.
3191
3192 COMPUTE y={}.
3193 LOOP IF NOT EOF('matrix2.txt').
3194 READ x/FILE='matrix2.txt'/SIZE={1,4}/FIELD=1 TO 80.
3195 COMPUTE y={y; x}.
3196 END LOOP.
3197 PRINT y.
3198
3199 COMPUTE m = MAKE(5, 5, 0).
3200 LOOP i = 1 TO 5.
3201 READ count /FILE='matrix3.txt' /FIELD=1 TO 1 /SIZE=1.
3202 READ m(i, 1:count) /FIELD=3 TO 100 /REREAD.
3203 END LOOP.
3204 PRINT m.
3205 END MATRIX.
3206 ])
3207 AT_CHECK([pspp matrix.sps], [0], [dnl
3208 x
3209   9
3210   8
3211   7
3212   6
3213
3214 x
3215   1  2  3
3216   4  5  6
3217   7  8  9
3218
3219 x
3220   10  11  12  13
3221   14  15  16  17
3222
3223 x
3224   10  18  12  13
3225   14  19  16  17
3226
3227 x
3228   20  21  22  23
3229   14  19  16  17
3230
3231 x
3232    1   2   3   4   5   6
3233    7   8   8   9  10  11
3234
3235 x
3236   1  2  3
3237   4  5  6
3238
3239 x
3240   1  2  3  4
3241   5  6  7  8
3242
3243 x
3244   1  2  3  4
3245   5  6  7  8
3246
3247 x
3248  abc def ghi jkl
3249  ABC DEF GHI JKL
3250
3251 y
3252    2   3   5   7
3253   11  13  17  19
3254   23  29  31  37
3255   41  43  47  53
3256
3257 m
3258   5  0  0  0  0
3259   1  2  3  0  0
3260   6 -1  2  5  1
3261   8  9  0  0  0
3262   1  3  2  0  0
3263 ])
3264 AT_CLEANUP
3265
3266 AT_SETUP([MATRIX - READ - negative])
3267 AT_DATA([matrix.sps], [dnl
3268 MATRIX.
3269 READ !.
3270 READ x/FILE=!.
3271 READ x/ENCODING=!.
3272 READ x/FIELD=!.
3273 READ x/FIELD=1 !.
3274 READ x/FIELD=1 TO !.
3275 READ x/FIELD=1 TO 0.
3276 READ x/FIELD=1 TO 10 BY !.
3277 READ x/FIELD=1 TO 10 BY 6.
3278 READ x/SIZE=!.
3279 READ x/MODE=!.
3280 READ x/FORMAT=!.
3281 READ x/FORMAT=F8.2/FORMAT=F8.2.
3282 READ x/FORMAT='5XYZZY'.
3283 READ x/FORMAT=XYZZY.
3284 READ x/!.
3285 READ x.
3286 READ x/FIELD=1 TO 10.
3287 READ x/FIELD=1 TO 10/SIZE={1,2}.
3288 READ x/FIELD=1 TO 10/SIZE={1,2}/FILE='xyzzy.txt'/FORMAT='15F'.
3289 READ x/FIELD=1 TO 10 BY 2/SIZE={1,2}/FILE='xyzzy.txt'/FORMAT=F5.
3290 READ x/FIELD=1 TO 10 BY 2/SIZE={1,2}/FILE='xyzzy.txt'/FORMAT='2F'.
3291 READ x/FIELD=1 TO 10/SIZE={1,2;3,4}/FILE='matrix.txt'.
3292 READ x/FIELD=1 TO 10/SIZE={1,2,3}/FILE='matrix.txt'.
3293 READ x/FIELD=1 TO 10/SIZE={-1}/FILE='matrix.txt'.
3294 COMPUTE x={1,2,3}.
3295 READ x(:,:)/FIELD=1 TO 10/SIZE={2,2}/FILE='matrix.txt'.
3296 READ x/FIELD=1 TO 10/SIZE={1,3}/FILE='matrix.txt'/MODE=SYMMETRIC.
3297 READ x/FIELD=1 TO 10/SIZE=2/FILE='matrix.txt'.
3298 END MATRIX.
3299 ])
3300 AT_DATA([matrix.txt], [dnl
3301 xyzzy
3302 .
3303 ])
3304 AT_CHECK([pspp matrix.sps], [1], [dnl
3305 matrix.sps:2.6: error: READ: Syntax error at `!': expecting identifier.
3306
3307 matrix.sps:3.13: error: READ: Syntax error at `!': expecting a file name or
3308 handle name.
3309
3310 matrix.sps:4.17: error: READ: Syntax error at `!': expecting string.
3311
3312 matrix.sps:5.14: error: READ: Syntax error at `!': Expected positive integer
3313 for FIELD.
3314
3315 matrix.sps:6.16: error: READ: Syntax error at `!': expecting `TO'.
3316
3317 matrix.sps:7.19: error: READ: Syntax error at `!': Expected positive integer
3318 for TO.
3319
3320 matrix.sps:8.19: error: READ: Syntax error at `0': Expected positive integer
3321 for TO.
3322
3323 matrix.sps:9.25: error: READ: Syntax error at `!': Expected integer between 1
3324 and 10 for BY.
3325
3326 matrix.sps:10: error: READ: BY 6 does not evenly divide record width 10.
3327
3328 matrix.sps:11.13: error: READ: Syntax error at `!'.
3329
3330 matrix.sps:12.13: error: READ: Syntax error at `!': expecting RECTANGULAR or
3331 SYMMETRIC.
3332
3333 matrix.sps:13.15: error: READ: Syntax error at `!': expecting identifier.
3334
3335 matrix.sps:14: error: READ: Subcommand FORMAT may only be specified once.
3336
3337 matrix.sps:15.15-15.22: error: READ: Syntax error at `'5XYZZY'': Unknown format
3338 XYZZY.
3339
3340 matrix.sps:16: error: READ: Unknown format type `XYZZY'.
3341
3342 matrix.sps:17.8: error: READ: Syntax error at `!': expecting FILE, FIELD, MODE,
3343 REREAD, or FORMAT.
3344
3345 matrix.sps:18: error: READ: Required subcommand FIELD was not specified.
3346
3347 matrix.sps:19: error: READ: SIZE is required for reading data into a full
3348 matrix (as opposed to a submatrix).
3349
3350 matrix.sps:20: error: READ: Required subcommand FILE was not specified.
3351
3352 matrix.sps:21: error: READ: 15 repetitions cannot fit in record width 10.
3353
3354 matrix.sps:22: error: READ: FORMAT specifies field width 5 but BY specifies 2.
3355
3356 matrix.sps:23: error: READ: FORMAT specifies 2 repetitions with record width
3357 10, which implies field width 5, but BY specifies field width 2.
3358
3359 matrix.sps:24.27-24.35: error: MATRIX: SIZE must evaluate to a scalar or a 2-
3360 element vector, not a 2×2 matrix.
3361    24 | READ x/FIELD=1 TO 10/SIZE={1,2;3,4}/FILE='matrix.txt'.
3362       |                           ^~~~~~~~~
3363
3364 matrix.sps:25.27-25.33: error: MATRIX: SIZE must evaluate to a scalar or a 2-
3365 element vector, not a 1×3 matrix.
3366    25 | READ x/FIELD=1 TO 10/SIZE={1,2,3}/FILE='matrix.txt'.
3367       |                           ^~~~~~~
3368
3369 matrix.sps:26.28-26.29: error: MATRIX: Matrix dimensions -1×1 specified on SIZE
3370 are outside valid range.
3371    26 | READ x/FIELD=1 TO 10/SIZE={-1}/FILE='matrix.txt'.
3372       |                            ^~
3373
3374 matrix.sps:28: error: MATRIX: Dimensions specified on SIZE differ from
3375 dimensions of destination submatrix.
3376
3377 matrix.sps:28.32-28.36: note: MATRIX: SIZE specifies dimensions 2×2.
3378    28 | READ x(:,:)/FIELD=1 TO 10/SIZE={2,2}/FILE='matrix.txt'.
3379       |                                ^~~~~
3380
3381 matrix.sps:28.6-28.11: note: MATRIX: Destination submatrix has dimensions 1×3.
3382    28 | READ x(:,:)/FIELD=1 TO 10/SIZE={2,2}/FILE='matrix.txt'.
3383       |      ^~~~~~
3384
3385 matrix.sps:29: error: MATRIX: Cannot read non-square 1×3 matrix using READ with
3386 MODE=SYMMETRIC.
3387
3388 matrix.txt:1.1-1.5: warning: Error reading "xyzzy" as format F for matrix row
3389 1, column 1: Field contents are not numeric.
3390
3391 matrix.txt:2.1: warning: Error reading "." as format F for matrix row 2, column
3392 1: Matrix data may not contain missing value.
3393 ])
3394 AT_CLEANUP
3395
3396 AT_SETUP([MATRIX - WRITE])
3397 AT_DATA([matrix.sps], [dnl
3398 MATRIX.
3399 WRITE {1.5, 2; 3, 4.12345}/OUTFILE='matrix.txt'/FIELD=1 TO 80.
3400 WRITE {1.5, 2; 3, 4.12345}/OUTFILE='matrix.txt'/FIELD=1 TO 5.
3401 WRITE {1, 2; 3, 4}/OUTFILE='matrix.txt'/FIELD=1 TO 80 BY 5.
3402 WRITE {1, 2; 3, 4}/OUTFILE='matrix.txt'/FIELD=1 TO 80/FORMAT=F8.2.
3403 WRITE {1, 2; 3, 4}/OUTFILE='matrix.txt'/FIELD=1 TO 80/FORMAT=E.
3404 WRITE {1, 2; 3, 4}/OUTFILE='matrix.txt'/FIELD=1 TO 10 BY 10/FORMAT=E.
3405 WRITE "abcdefhi"/OUTFILE='matrix.txt'/FIELD=1 TO 80/FORMAT=A8.
3406 WRITE "abcdefhi"/OUTFILE='matrix.txt'/FIELD=1 TO 80/FORMAT=A4.
3407 WRITE "abcdefhi"/OUTFILE='matrix.txt'/FIELD=1 TO 80/FORMAT=AHEX12.
3408 END MATRIX.
3409 ])
3410 AT_CHECK([pspp matrix.sps])
3411 AT_CHECK([cat matrix.txt], [0], [dnl
3412  1.5 2
3413  3 4.12345
3414  1.5 2
3415  3
3416  4.12345
3417      1    2
3418      3    4
3419      1.00    2.00
3420      3.00    4.00
3421  1 2
3422  3 4
3423     1.E+000
3424     2.E+000
3425     3.E+000
3426     4.E+000
3427  abcdefhi
3428  abcd
3429  616263646566
3430 ])
3431 AT_CLEANUP
3432
3433 AT_SETUP([MATRIX - WRITE - negative])
3434 AT_DATA([matrix.sps], [dnl
3435 MATRIX.
3436 WRITE !.
3437 WRITE 1/OUTFILE=!.
3438 WRITE 1/ENCODING=!.
3439 WRITE 1/FIELD=!.
3440 WRITE 1/FIELD=1 !.
3441 WRITE 1/FIELD=1 TO 0.
3442 WRITE 1/FIELD=1 TO 10 BY 20.
3443 WRITE 1/FIELD=1 TO 10 BY 6.
3444 WRITE 1/MODE=TRAPEZOIDAL.
3445 WRITE 1/FORMAT=F5/FORMAT=F5.
3446 WRITE 1/FORMAT='5ASDF'.
3447 WRITE 1/FORMAT=ASDF5.
3448 WRITE 1/!.
3449 WRITE 1.
3450 WRITE 1/FIELD=1 TO 10.
3451 WRITE 1/FIELD=1 TO 10/OUTFILE='matrix.txt'/FORMAT='15F'.
3452 WRITE 1/FIELD=1 TO 10 BY 5/OUTFILE='matrix.txt'/FORMAT='5F'.
3453 WRITE 1/FIELD=1 TO 10 BY 5/OUTFILE='matrix.txt'/FORMAT=E.
3454 WRITE 1/FIELD=1 TO 10/OUTFILE='matrix.txt'/FORMAT=A9.
3455 WRITE {1,2}/FIELD=1 TO 10/OUTFILE='matrix.txt'/MODE=TRIANGULAR.
3456 END MATRIX.
3457 ])
3458 AT_CHECK([pspp matrix.sps], [1], [dnl
3459 matrix.sps:2.7: error: WRITE: Syntax error at `!'.
3460
3461 matrix.sps:3.17: error: WRITE: Syntax error at `!': expecting a file name or
3462 handle name.
3463
3464 matrix.sps:4.18: error: WRITE: Syntax error at `!': expecting string.
3465
3466 matrix.sps:5.15: error: WRITE: Syntax error at `!': Expected positive integer
3467 for FIELD.
3468
3469 matrix.sps:6.17: error: WRITE: Syntax error at `!': expecting `TO'.
3470
3471 matrix.sps:7.20: error: WRITE: Syntax error at `0': Expected positive integer
3472 for TO.
3473
3474 matrix.sps:8.26-8.27: error: WRITE: Syntax error at `20': Expected integer
3475 between 1 and 10 for BY.
3476
3477 matrix.sps:9: error: WRITE: BY 6 does not evenly divide record width 10.
3478
3479 matrix.sps:10.14-10.24: error: WRITE: Syntax error at `TRAPEZOIDAL': expecting
3480 RECTANGULAR or TRIANGULAR.
3481
3482 matrix.sps:11: error: WRITE: Subcommand FORMAT may only be specified once.
3483
3484 matrix.sps:12.16-12.22: error: WRITE: Syntax error at `'5ASDF'': Unknown format
3485 ASDF.
3486
3487 matrix.sps:13: error: WRITE: Unknown format type `ASDF'.
3488
3489 matrix.sps:14.9: error: WRITE: Syntax error at `!': expecting OUTFILE, FIELD,
3490 MODE, HOLD, or FORMAT.
3491
3492 matrix.sps:15: error: WRITE: Required subcommand FIELD was not specified.
3493
3494 matrix.sps:16: error: WRITE: Required subcommand OUTFILE was not specified.
3495
3496 matrix.sps:17: error: WRITE: 15 repetitions cannot fit in record width 10.
3497
3498 matrix.sps:18: error: WRITE: FORMAT specifies 5 repetitions with record width
3499 10, which implies field width 2, but BY specifies field width 5.
3500
3501 matrix.sps:19: error: WRITE: Output format E5.0 specifies width 5, but E
3502 requires a width between 6 and 40.
3503
3504 matrix.sps:20: error: WRITE: Format A9 is too wide for 8-byte matrix eleemnts.
3505
3506 matrix.sps:21.7-21.11: error: MATRIX: WRITE with MODE=TRIANGULAR requires a
3507 square matrix but the matrix to be written has dimensions 1×2.
3508    21 | WRITE {1,2}/FIELD=1 TO 10/OUTFILE='matrix.txt'/MODE=TRIANGULAR.
3509       |       ^~~~~
3510 ])
3511 AT_CLEANUP
3512
3513 AT_SETUP([MATRIX - GET])
3514 AT_DATA([matrix.sps], [dnl
3515 DATA LIST LIST NOTABLE /a b c.
3516 MISSING VALUES a(1) b(5).
3517 BEGIN DATA.
3518 0 0 0
3519 1 2 3
3520 4 5 6
3521 7 8 .
3522 END DATA.
3523
3524 MATRIX.
3525 GET x0 /NAMES=names0.
3526 PRINT x0.
3527 PRINT names0/FORMAT=A8.
3528 END MATRIX.
3529
3530 MATRIX.
3531 GET x1 /VARIABLES=a b c /NAMES=names1 /MISSING=OMIT.
3532 PRINT x1.
3533 PRINT names1/FORMAT=A8.
3534 END MATRIX.
3535
3536 MATRIX.
3537 GET x2 /VARIABLES=a b /NAMES=names2 /MISSING=OMIT.
3538 PRINT x2.
3539 PRINT names2/FORMAT=A8.
3540 END MATRIX.
3541
3542 MATRIX.
3543 GET x3 /FILE=* /VARIABLES=a b c /NAMES=names3 /MISSING=5.
3544 PRINT x3.
3545 PRINT names3/FORMAT=A8.
3546 END MATRIX.
3547
3548 MATRIX.
3549 GET x4 /FILE=* /VARIABLES=a b /NAMES=names4 /MISSING=5.
3550 PRINT x4.
3551 PRINT names4/FORMAT=A8.
3552 END MATRIX.
3553
3554 SAVE OUTFILE='matrix.sav'.
3555 NEW FILE.
3556
3557 MATRIX.
3558 GET x5 /FILE='matrix.sav' /VARIABLES=a b c /NAMES=names5 /MISSING=ACCEPT.
3559 PRINT x5.
3560 PRINT names5/FORMAT=A8.
3561 END MATRIX.
3562
3563 MATRIX.
3564 GET x6 /FILE='matrix.sav' /VARIABLES=a b c /NAMES=names6 /MISSING=ACCEPT /SYSMIS=9.
3565 PRINT x6.
3566 PRINT names6/FORMAT=A8.
3567 END MATRIX.
3568
3569 MATRIX.
3570 GET x7 /FILE='matrix.sav' /VARIABLES=a b c /NAMES=names7 /MISSING=ACCEPT /SYSMIS=OMIT.
3571 PRINT x7.
3572 PRINT names7/FORMAT=A8.
3573 END MATRIX.
3574 ])
3575 AT_CHECK([pspp matrix.sps], [1], [dnl
3576 matrix.sps:11: error: MATRIX: Variable a in case 2 has user-missing value 1.
3577
3578 matrix.sps:12.7-12.8: error: MATRIX: Uninitialized variable x0 used in
3579 expression.
3580    12 | PRINT x0.
3581       |       ^~
3582
3583 names0
3584  a
3585  b
3586  c
3587
3588 matrix.sps:17: error: MATRIX: Variable c in case 4 is system-missing.
3589
3590 matrix.sps:18.7-18.8: error: MATRIX: Uninitialized variable x1 used in
3591 expression.
3592    18 | PRINT x1.
3593       |       ^~
3594
3595 names1
3596  a
3597  b
3598  c
3599
3600 x2
3601   0  0
3602   7  8
3603
3604 names2
3605  a
3606  b
3607
3608 matrix.sps:29: error: MATRIX: Variable c in case 4 is system-missing.
3609
3610 matrix.sps:30.7-30.8: error: MATRIX: Uninitialized variable x3 used in
3611 expression.
3612    30 | PRINT x3.
3613       |       ^~
3614
3615 names3
3616  a
3617  b
3618  c
3619
3620 x4
3621   0  0
3622   5  2
3623   4  5
3624   7  8
3625
3626 names4
3627  a
3628  b
3629
3630 matrix.sps:44: error: MATRIX: Variable c in case 4 is system-missing.
3631
3632 matrix.sps:45.7-45.8: error: MATRIX: Uninitialized variable x5 used in
3633 expression.
3634    45 | PRINT x5.
3635       |       ^~
3636
3637 names5
3638  a
3639  b
3640  c
3641
3642 x6
3643   0  0  0
3644   1  2  3
3645   4  5  6
3646   7  8  9
3647
3648 names6
3649  a
3650  b
3651  c
3652
3653 x7
3654   0  0  0
3655   1  2  3
3656   4  5  6
3657
3658 names7
3659  a
3660  b
3661  c
3662 ])
3663 AT_CLEANUP
3664
3665 AT_SETUP([MATRIX - GET - negative])
3666 AT_DATA([matrix.sps], [dnl
3667 DATA LIST LIST NOTABLE /a b c * d(a1).
3668 MISSING VALUES a(1) b(5).
3669 BEGIN DATA.
3670 0 0 0 a
3671 1 2 3 b
3672 4 5 6 b
3673 7 8 . d
3674 END DATA.
3675 SAVE OUTFILE='matrix.sav'.
3676
3677 MATRIX.
3678 GET !.
3679 GET x/VARIABLES=!.
3680 GET x/FILE=!.
3681 GET x/ENCODING=!.
3682 GET x/NAMES=!.
3683 GET x/MISSING=!.
3684 GET x/SYSMIS=!.
3685 GET x/!.
3686 GET x/VARIABLES=!.
3687 GET x/VARIABLES=x TO !.
3688 GET x/VARIABLES=x.
3689 GET x/VARIABLES=c TO a.
3690 GET x/VARIABLES=d.
3691 GET x.
3692 END MATRIX.
3693
3694 NEW FILE.
3695 MATRIX.
3696 GET x/VARIABLES=a.
3697 END MATRIX.
3698 ])
3699 AT_CHECK([pspp matrix.sps], [1], [dnl
3700 matrix.sps:12.5: error: GET: Syntax error at `!': expecting identifier.
3701
3702 matrix.sps:13.17: error: GET: Syntax error at `!': expecting variable name.
3703
3704 matrix.sps:14.12: error: GET: Syntax error at `!': expecting a file name or
3705 handle name.
3706
3707 matrix.sps:15.16: error: GET: Syntax error at `!': expecting string.
3708
3709 matrix.sps:16.13: error: GET: Syntax error at `!': expecting identifier.
3710
3711 matrix.sps:17.15: error: GET: Syntax error at `!'.
3712
3713 matrix.sps:18.14: error: GET: Syntax error at `!'.
3714
3715 matrix.sps:19.7: error: GET: Syntax error at `!': expecting FILE, VARIABLES,
3716 NAMES, MISSING, or SYSMIS.
3717
3718 matrix.sps:20.17: error: GET: Syntax error at `!': expecting variable name.
3719
3720 matrix.sps:21.22: error: GET: Syntax error at `!': expecting variable name.
3721
3722 matrix.sps:22: error: MATRIX: x is not a variable name.
3723
3724 matrix.sps:23: error: MATRIX: c TO a is not valid syntax since c precedes a in
3725 the dictionary.
3726
3727 matrix.sps:24: warning: MATRIX: d is not a numeric variable.
3728
3729 matrix.sps:25: error: MATRIX: Variable d is not numeric.
3730
3731 error: The GET command cannot read an empty active file.
3732 ])
3733 AT_CLEANUP
3734
3735 AT_SETUP([MATRIX - SAVE])
3736 AT_DATA([matrix.sps], [dnl
3737 MATRIX.
3738 SAVE {1,2,3; 4,5,6}/OUTFILE='matrix.sav'.
3739 SAVE {7,8,9}/VARIABLES=a b c d.
3740
3741 SAVE {1,2,3}/OUTFILE='matrix2.sav'/VARIABLES=v01 TO v03.
3742 SAVE {4,5,6}/NAMES={'x', 'y', 'z', 'w'}.
3743
3744 SAVE {1,'abcd',3}/OUTFILE='matrix3.sav'/NAMES={'a', 'b', 'c'}/STRINGS=b.
3745 SAVE {4,'xyzw',6}/STRINGS=a, b.
3746 END MATRIX.
3747 ])
3748 AT_CHECK([pspp matrix.sps])
3749 AT_CHECK([pspp-convert matrix.sav matrix.csv && cat matrix.csv], [0], [dnl
3750 COL1,COL2,COL3
3751 1,2,3
3752 4,5,6
3753 7,8,9
3754 ])
3755 AT_CHECK([pspp-convert matrix2.sav matrix2.csv && cat matrix2.csv], [0], [dnl
3756 v01,v02,v03
3757 1,2,3
3758 4,5,6
3759 ])
3760 AT_CHECK([pspp-convert matrix3.sav matrix3.csv && cat matrix3.csv], [0], [dnl
3761 a,b,c
3762 1,abcd,3
3763 4,xyzw,6
3764 ])
3765 AT_CLEANUP
3766
3767 AT_SETUP([MATRIX - SAVE - inline])
3768 AT_DATA([matrix.sps], [dnl
3769 MATRIX.
3770 SAVE {1,2,3; 4,5,6}/OUTFILE=*.
3771 SAVE {7,8,9}/VARIABLES=a b c d.
3772 END MATRIX.
3773 LIST.
3774
3775 MATRIX.
3776 SAVE {1,2,3}/OUTFILE=*/VARIABLES=v01 TO v03.
3777 SAVE {4,5,6}/NAMES={'x', 'y', 'z', 'w'}.
3778 END MATRIX.
3779 LIST.
3780
3781 MATRIX.
3782 SAVE {1,'abcd',3}/OUTFILE=*/NAMES={'a', 'b', 'c'}/STRINGS=b.
3783 SAVE {4,'xyzw',6}/STRINGS=a, b.
3784 END MATRIX.
3785 LIST.
3786 ])
3787 AT_CHECK([pspp matrix.sps -O format=csv], [0], [dnl
3788 Table: Data List
3789 COL1,COL2,COL3
3790 1.00,2.00,3.00
3791 4.00,5.00,6.00
3792 7.00,8.00,9.00
3793
3794 Table: Data List
3795 v01,v02,v03
3796 1.00,2.00,3.00
3797 4.00,5.00,6.00
3798
3799 Table: Data List
3800 a,b,c
3801 1.00,abcd,3.00
3802 4.00,xyzw,6.00
3803 ])
3804 AT_CLEANUP
3805
3806 AT_SETUP([MATRIX - SAVE - negative])
3807 AT_DATA([matrix.sps], [dnl
3808 MATRIX.
3809 SAVE !.
3810 SAVE 1/OUTFILE=!.
3811 SAVE 1/VARIABLES=!.
3812 SAVE 1/NAMES=!.
3813 SAVE 1/!.
3814 SAVE 1.
3815 SAVE 1/OUTFILE='matrix.sav'/NAMES={'a'}/VARIABLES=a.
3816 SAVE 1/OUTFILE='matrix2.sav'.
3817 SAVE {1,2}/OUTFILE='matrix2.sav'.
3818 SAVE {1,2}/OUTFILE='matrix3.sav'/NAMES={'a', 'a'}.
3819 SAVE {1,2}/OUTFILE='matrix4.sav'/STRINGS=a.
3820 SAVE {1,2}/OUTFILE='matrix5.sav'/STRINGS=a, b.
3821 END MATRIX.
3822 ])
3823 AT_CHECK([pspp matrix.sps], [1], [dnl
3824 matrix.sps:2.6: error: SAVE: Syntax error at `!'.
3825
3826 matrix.sps:3.16: error: SAVE: Syntax error at `!': expecting a file name or
3827 handle name.
3828
3829 matrix.sps:4.18: error: SAVE: Syntax error at `!': expecting variable name.
3830
3831 matrix.sps:5.14: error: SAVE: Syntax error at `!'.
3832
3833 matrix.sps:6.8: error: SAVE: Syntax error at `!': expecting OUTFILE, VARIABLES,
3834 NAMES, or STRINGS.
3835
3836 matrix.sps:7: error: SAVE: Required subcommand OUTFILE was not specified.
3837
3838 matrix.sps:8: warning: SAVE: VARIABLES and NAMES both specified; ignoring
3839 NAMES.
3840
3841 matrix.sps:10: error: MATRIX: Cannot save 1×2 matrix to `matrix2.sav' because
3842 the first SAVE to `matrix2.sav' in this matrix program wrote a 1-column matrix.
3843
3844 matrix.sps:9: error: MATRIX: This is the location of the first SAVE to
3845 `matrix2.sav'.
3846
3847 error: Duplicate variable name a in SAVE statement.
3848
3849 error: The SAVE command STRINGS subcommand specifies an unknown variable a.
3850
3851 error: The SAVE command STRINGS subcommand specifies 2 unknown variables,
3852 including a.
3853 ])
3854 AT_CLEANUP
3855
3856 AT_SETUP([MATRIX - MGET])
3857 AT_DATA([matrix.sps], [dnl
3858 MATRIX DATA
3859     VARIABLES=ROWTYPE_ var01 TO var08.
3860 BEGIN DATA.
3861 MEAN  24.3   5.4  69.7  20.1  13.4   2.7  27.9   3.7
3862 SD     5.7   1.5  23.5   5.8   2.8   4.5   5.4   1.5
3863 N       92    92    92    92    92    92    92    92
3864 CORR  1.00
3865 CORR   .18  1.00
3866 CORR  -.22  -.17  1.00
3867 CORR   .36   .31  -.14  1.00
3868 CORR   .27   .16  -.12   .22  1.00
3869 CORR   .33   .15  -.17   .24   .21  1.00
3870 CORR   .50   .29  -.20   .32   .12   .38  1.00
3871 CORR   .17   .29  -.05   .20   .27   .20   .04  1.00
3872 END DATA.
3873
3874 MATRIX.
3875 MGET.
3876 PRINT MN/FORMAT=F5.1.
3877 PRINT SD/FORMAT=F5.1.
3878 PRINT NC/FORMAT=F5.0.
3879 PRINT CR/FORMAT=F5.2.
3880 END MATRIX.
3881 ])
3882 AT_CHECK([pspp matrix.sps -O format=csv], [0], [dnl
3883 Table: Matrix Variables Created by MGET
3884 ,Dimensions,
3885 ,Rows,Columns
3886 MN,1,8
3887 SD,1,8
3888 NC,1,8
3889 CR,8,8
3890
3891 MN
3892 24.3   5.4  69.7  20.1  13.4   2.7  27.9   3.7
3893
3894 SD
3895 5.7   1.5  23.5   5.8   2.8   4.5   5.4   1.5
3896
3897 NC
3898 92    92    92    92    92    92    92    92
3899
3900 CR
3901 1.00   .18  -.22   .36   .27   .33   .50   .17
3902 .18  1.00  -.17   .31   .16   .15   .29   .29
3903 -.22  -.17  1.00  -.14  -.12  -.17  -.20  -.05
3904 .36   .31  -.14  1.00   .22   .24   .32   .20
3905 .27   .16  -.12   .22  1.00   .21   .12   .27
3906 .33   .15  -.17   .24   .21  1.00   .38   .20
3907 .50   .29  -.20   .32   .12   .38  1.00   .04
3908 .17   .29  -.05   .20   .27   .20   .04  1.00
3909 ])
3910 AT_CLEANUP
3911
3912 AT_SETUP([MATRIX - MGET with split variables])
3913 AT_DATA([matrix.sps], [dnl
3914 matrix data
3915     variables = s1 s2 rowtype_  var01 var02 var03
3916     /split=s1 s2.
3917
3918 begin data
3919 8 0   mean     21.4  5.0  72.9
3920 8 0   sd       6.5   1.6  22.8
3921 8 0   n        106   106  106
3922 8 0   corr     1
3923 8 0   corr    .41  1
3924 8 0   corr    -.16  -.22  1
3925 8 1   mean     11.4  1.0  52.9
3926 8 1   sd       9.5   8.6  12.8
3927 8 1   n        10   11  12
3928 8 1   corr     1
3929 8 1   corr    .51  1
3930 8 1   corr    .36  -.41  1
3931 end data.
3932
3933 MATRIX.
3934 MGET.
3935 PRINT MNS1/FORMAT=F5.1.
3936 PRINT SDS1/FORMAT=F5.1.
3937 PRINT NCS1/FORMAT=F5.0.
3938 PRINT CRS1/FORMAT=F5.2.
3939 PRINT MNS2/FORMAT=F5.1.
3940 PRINT SDS2/FORMAT=F5.1.
3941 PRINT NCS2/FORMAT=F5.0.
3942 PRINT CRS2/FORMAT=F5.2.
3943 END MATRIX.
3944 ])
3945 AT_CHECK([pspp -O format=csv matrix.sps], [0], [dnl
3946 Table: Matrix Variables Created by MGET
3947 ,Split Values,,Dimensions,
3948 ,s1,s2,Rows,Columns
3949 MNS1,8,0,1,3
3950 SDS1,8,0,1,3
3951 NCS1,8,0,1,3
3952 CRS1,8,0,3,3
3953 MNS2,8,1,1,3
3954 SDS2,8,1,1,3
3955 NCS2,8,1,1,3
3956 CRS2,8,1,3,3
3957
3958 MNS1
3959 21.4   5.0  72.9
3960
3961 SDS1
3962 6.5   1.6  22.8
3963
3964 NCS1
3965 106   106   106
3966
3967 CRS1
3968 1.00   .41  -.16
3969 .41  1.00  -.22
3970 -.16  -.22  1.00
3971
3972 MNS2
3973 11.4   1.0  52.9
3974
3975 SDS2
3976 9.5   8.6  12.8
3977
3978 NCS2
3979 10    11    12
3980
3981 CRS2
3982 1.00   .51   .36
3983 .51  1.00  -.41
3984 .36  -.41  1.00
3985 ])
3986 AT_CLEANUP
3987
3988 AT_SETUP([MATRIX - MGET with factor variables])
3989 AT_DATA([matrix.sps], [dnl
3990 MATRIX DATA
3991     VARIABLES=ROWTYPE_ f1 var01 TO var04
3992     /FACTOR=f1.
3993 BEGIN DATA.
3994 MEAN 0 34 35 36 37
3995 SD   0 22 11 55 66
3996 N    0 99 98 99 92
3997 MEAN 1 44 45 34 39
3998 SD   1 23 15 51 46
3999 N    1 98 34 87 23
4000 CORR .  1
4001 CORR . .9  1
4002 CORR . .8 .6  1
4003 CORR . .7 .5 .4  1
4004 END DATA.
4005 FORMATS var01 TO var04(F5.1).
4006 SAVE OUTFILE='matrix.sav'.
4007 ])
4008 AT_DATA([matrix2.sps], [dnl
4009 MATRIX.
4010 MGET FILE='matrix.sav'.
4011 PRINT MNF1/FORMAT=F2.0.
4012 PRINT SDF1/FORMAT=F2.0.
4013 PRINT NCF1/FORMAT=F2.0.
4014 PRINT MNF2/FORMAT=F2.0.
4015 PRINT SDF2/FORMAT=F2.0.
4016 PRINT NCF2/FORMAT=F2.0.
4017 PRINT CR/FORMAT=F3.1.
4018 END MATRIX.
4019 ])
4020 AT_CHECK([pspp matrix.sps])
4021 AT_CHECK([pspp -O format=csv matrix2.sps], [0], [dnl
4022 Table: Matrix Variables Created by MGET
4023 ,Factors,Dimensions,
4024 ,f1,Rows,Columns
4025 MNF1,0,1,4
4026 SDF1,0,1,4
4027 NCF1,0,1,4
4028 MNF2,1,1,4
4029 SDF2,1,1,4
4030 NCF2,1,1,4
4031 CR,.,4,4
4032
4033 MNF1
4034 34 35 36 37
4035
4036 SDF1
4037 22 11 55 66
4038
4039 NCF1
4040 99 98 99 92
4041
4042 MNF2
4043 44 45 34 39
4044
4045 SDF2
4046 23 15 51 46
4047
4048 NCF2
4049 98 34 87 23
4050
4051 CR
4052 1.0  .9  .8  .7
4053 .9 1.0  .6  .5
4054 .8  .6 1.0  .4
4055 .7  .5  .4 1.0
4056 ])
4057 AT_CLEANUP
4058
4059 AT_SETUP([MATRIX - MGET with factor and split variables])
4060 AT_DATA([matrix.sps], [dnl
4061 matrix data
4062     variables = s f rowtype_  var01 var02 var03
4063     /split=s
4064     /factor=f.
4065
4066 begin data
4067 8 0   mean     21.4  5.0  72.9
4068 8 0   sd       6.5   1.6  22.8
4069 8 0   n        106   106  106
4070 8 .   corr     1
4071 8 .   corr    .41  1
4072 8 .   corr    -.16  -.22  1
4073 9 1   mean     11.4  1.0  52.9
4074 9 1   sd       9.5   8.6  12.8
4075 9 1   n        10   11  12
4076 9 .   corr     1
4077 9 .   corr    .51  1
4078 9 .   corr    .36  -.41  1
4079 end data.
4080
4081 MATRIX.
4082 MGET.
4083 PRINT MNF1S1/FORMAT=F5.1.
4084 PRINT SDF1S1/FORMAT=F5.1.
4085 PRINT NCF1S1/FORMAT=F5.0.
4086 PRINT CRS1/FORMAT=F5.2.
4087 PRINT MNF1S2/FORMAT=F5.1.
4088 PRINT SDF1S2/FORMAT=F5.1.
4089 PRINT NCF1S2/FORMAT=F5.0.
4090 PRINT CRS2/FORMAT=F5.2.
4091 END MATRIX.
4092 ])
4093 AT_CHECK([pspp matrix.sps -O format=csv], [0], [dnl
4094 Table: Matrix Variables Created by MGET
4095 ,Split Values,Factors,Dimensions,
4096 ,s,f,Rows,Columns
4097 MNF1S1,8,0,1,3
4098 SDF1S1,8,0,1,3
4099 NCF1S1,8,0,1,3
4100 CRS1,8,.,3,3
4101 MNF1S2,9,1,1,3
4102 SDF1S2,9,1,1,3
4103 NCF1S2,9,1,1,3
4104 CRS2,9,.,3,3
4105
4106 MNF1S1
4107 21.4   5.0  72.9
4108
4109 SDF1S1
4110 6.5   1.6  22.8
4111
4112 NCF1S1
4113 106   106   106
4114
4115 CRS1
4116 1.00   .41  -.16
4117 .41  1.00  -.22
4118 -.16  -.22  1.00
4119
4120 MNF1S2
4121 11.4   1.0  52.9
4122
4123 SDF1S2
4124 9.5   8.6  12.8
4125
4126 NCF1S2
4127 10    11    12
4128
4129 CRS2
4130 1.00   .51   .36
4131 .51  1.00  -.41
4132 .36  -.41  1.00
4133 ])
4134 AT_CLEANUP
4135
4136 AT_SETUP([MATRIX - MGET with TYPE])
4137 AT_DATA([matrix.sps], [dnl
4138 MATRIX DATA
4139     VARIABLES=ROWTYPE_ f1 var01 TO var04
4140     /FACTOR=f1.
4141 BEGIN DATA.
4142 MEAN 0 34 35 36 37
4143 SD   0 22 11 55 66
4144 N    0 99 98 99 92
4145 MEAN 1 44 45 34 39
4146 SD   1 23 15 51 46
4147 N    1 98 34 87 23
4148 CORR .  1
4149 CORR . .9  1
4150 CORR . .8 .6  1
4151 CORR . .7 .5 .4  1
4152 END DATA.
4153 FORMATS var01 TO var04(F5.1).
4154 SAVE OUTFILE='matrix.sav'.
4155 ])
4156 AT_DATA([matrix2.sps], [dnl
4157 MATRIX.
4158 MGET/FILE='matrix.sav'/TYPE=CORR.
4159 PRINT CR/FORMAT=F3.1.
4160 END MATRIX.
4161 ])
4162 AT_CHECK([pspp matrix.sps])
4163 AT_CHECK([pspp -O format=csv matrix2.sps], [0], [dnl
4164 Table: Matrix Variables Created by MGET
4165 ,Factors,Dimensions,
4166 ,f1,Rows,Columns
4167 CR,.,4,4
4168
4169 CR
4170 1.0  .9  .8  .7
4171 .9 1.0  .6  .5
4172 .8  .6 1.0  .4
4173 .7  .5  .4 1.0
4174 ])
4175 AT_CLEANUP
4176
4177 AT_SETUP([MATRIX - MGET - negative - parsing])
4178 AT_DATA([matrix.sps], [dnl
4179 MATRIX.
4180 MGET !.
4181 MGET FILE=!.
4182 MGET ENCODING=!.
4183 MGET TYPE=!.
4184 MGET TYPE=CORR !.
4185 END MATRIX.
4186 ])
4187 AT_CHECK([pspp matrix.sps], [1], [dnl
4188 matrix.sps:2.6: error: MGET: Syntax error at `!': expecting FILE or TYPE.
4189
4190 matrix.sps:3.11: error: MGET: Syntax error at `!': expecting a file name or
4191 handle name.
4192
4193 matrix.sps:4.15: error: MGET: Syntax error at `!': expecting string.
4194
4195 matrix.sps:5.11: error: MGET: Syntax error at `!': expecting COV, CORR, MEAN,
4196 STDDEV, N, or COUNT.
4197
4198 matrix.sps:6.16: error: MGET: Syntax error at `!': expecting COV, CORR, MEAN,
4199 STDDEV, N, or COUNT.
4200 ])
4201 AT_CLEANUP
4202
4203 AT_SETUP([MATRIX - MGET - missing VARNAME_ and ROWTYPE_])
4204 AT_DATA([matrix.sps], [dnl
4205 DATA LIST LIST NOTABLE /x.
4206 BEGIN DATA.
4207 1
4208 END DATA.
4209
4210 MATRIX.
4211 MGET.
4212 END MATRIX.
4213 ])
4214 AT_CHECK([pspp matrix.sps], [1], [dnl
4215 matrix.sps:7: error: MATRIX: Matrix data file lacks ROWTYPE_ variable.
4216
4217 matrix.sps:7: error: MATRIX: Matrix data file lacks VARNAME_ variable.
4218 ])
4219 AT_CLEANUP
4220
4221 AT_SETUP([MATRIX - MGET - wrong format for VARNAME_ and ROWTYPE_])
4222 AT_DATA([matrix.sps], [dnl
4223 DATA LIST LIST NOTABLE /VARNAME_ * ROWTYPE_ (A7).
4224 BEGIN DATA.
4225 1 asdf
4226 END DATA.
4227
4228 MATRIX.
4229 MGET.
4230 END MATRIX.
4231 ])
4232 AT_CHECK([pspp matrix.sps], [1], [dnl
4233 matrix.sps:7: error: MATRIX: ROWTYPE_ variable in matrix data file must be 8-
4234 byte string, but it has width 7.
4235
4236 matrix.sps:7: error: MATRIX: VARNAME_ variable in matrix data file must be 8-
4237 byte string, but it has width 0.
4238 ])
4239 AT_CLEANUP
4240
4241 AT_SETUP([MATRIX - MGET - wrong order for VARNAME_ and ROWTYPE_])
4242 AT_DATA([matrix.sps], [dnl
4243 DATA LIST LIST NOTABLE /VARNAME_ ROWTYPE_ (A8).
4244 BEGIN DATA.
4245 asdf jkl;
4246 END DATA.
4247
4248 MATRIX.
4249 MGET.
4250 END MATRIX.
4251 ])
4252 AT_CHECK([pspp matrix.sps], [1], [dnl
4253 matrix.sps:7: error: MATRIX: ROWTYPE_ must precede VARNAME_ in matrix data
4254 file.
4255 ])
4256 AT_CLEANUP
4257
4258 AT_SETUP([MATRIX - MGET - no continuous variables])
4259 AT_DATA([matrix.sps], [dnl
4260 DATA LIST LIST NOTABLE /ROWTYPE_ VARNAME_ (A8).
4261 BEGIN DATA.
4262 asdf jkl;
4263 END DATA.
4264
4265 MATRIX.
4266 MGET.
4267 END MATRIX.
4268 ])
4269 AT_CHECK([pspp matrix.sps], [1], [dnl
4270 matrix.sps:7: error: MATRIX: Matrix data file contains no continuous variables.
4271 ])
4272 AT_CLEANUP
4273
4274 AT_SETUP([MATRIX - MGET - unexpected string variables])
4275 AT_DATA([matrix.sps], [dnl
4276 DATA LIST LIST NOTABLE /ROWTYPE_ VARNAME_ cvar1 (A8).
4277 BEGIN DATA.
4278 asdf jkl; zxcv
4279 END DATA.
4280
4281 MATRIX.
4282 MGET.
4283 END MATRIX.
4284 ])
4285 AT_CHECK([pspp matrix.sps], [1], [dnl
4286 matrix.sps:7: error: MATRIX: Matrix data file contains unexpected string
4287 variable cvar1.
4288 ])
4289 AT_CLEANUP
4290
4291 AT_SETUP([MATRIX - MGET - unknown ROWTYPE_])
4292 AT_DATA([matrix.sps], [dnl
4293 DATA LIST LIST NOTABLE /ROWTYPE_ VARNAME_ (A8) cvar1.
4294 BEGIN DATA.
4295 asdf jkl; 1
4296 END DATA.
4297
4298 MATRIX.
4299 MGET.
4300 END MATRIX.
4301 ])
4302 AT_CHECK([pspp matrix.sps -O format=csv], [1], [dnl
4303 "matrix.sps:7: error: MATRIX: Matrix data file contains unknown ROWTYPE_ ""asdf""."
4304 ])
4305 AT_CLEANUP
4306
4307 AT_SETUP([MATRIX - MGET - duplicate matrix variable name])
4308 AT_DATA([matrix.sps], [dnl
4309 DATA LIST LIST NOTABLE /ROWTYPE_ VARNAME_ (A8) cvar1.
4310 BEGIN DATA.
4311 corr jkl; 1
4312 END DATA.
4313
4314 MATRIX.
4315 MGET.
4316 MGET.
4317 END MATRIX.
4318 ])
4319 AT_CHECK([pspp matrix.sps -O format=csv], [0], [dnl
4320 Table: Matrix Variables Created by MGET
4321 ,Dimensions,
4322 ,Rows,Columns
4323 CR,1,1
4324
4325 matrix.sps:8: warning: MATRIX: Matrix data file contains variable with existing name CR.
4326 ])
4327 AT_CLEANUP
4328
4329 AT_SETUP([MATRIX - MGET - missing values in input])
4330 AT_DATA([matrix.sps], [dnl
4331 DATA LIST LIST NOTABLE /s1 * ROWTYPE_ VARNAME_ (A8) cvar1 cvar2.
4332 BEGIN DATA.
4333 1 n "" 1 .
4334 2 n "" . .
4335 END DATA.
4336
4337 MATRIX.
4338 MGET.
4339 PRINT ncs1/FORMAT=F5.
4340 PRINT ncs2/FORMAT=F5.
4341 END MATRIX.
4342 ])
4343 AT_CHECK([pspp matrix.sps -O format=csv], [1], [dnl
4344 "matrix.sps:8: error: MATRIX: Matrix data file variable NCS1 contains a missing value, which was treated as zero."
4345
4346 "matrix.sps:8: error: MATRIX: Matrix data file variable NCS2 contains 2 missing values, which were treated as zero."
4347
4348 Table: Matrix Variables Created by MGET
4349 ,Split Values,Dimensions,
4350 ,s1,Rows,Columns
4351 NCS1,1.00,1,2
4352 NCS2,2.00,1,2
4353
4354 ncs1
4355 1     0
4356
4357 ncs2
4358 0     0
4359 ])
4360 AT_CLEANUP
4361
4362 AT_SETUP([MATRIX - MSAVE])
4363 AT_DATA([matrix.sps], [dnl
4364 MATRIX.
4365 MSAVE {1, 2; 3, 4}/TYPE=CORR/VARIABLES=X,Y/OUTFILE='matrix.sav'.
4366 MSAVE {5, 6; 7, 8; 9, 10}/TYPE=COV/VARIABLES=X,Y.
4367 MSAVE {11, 12}/TYPE=MEAN.
4368 MSAVE {13, 14}/TYPE=STDDEV.
4369 MSAVE {15, 16}/TYPE=N.
4370 MSAVE {17, 18}/TYPE=COUNT.
4371 END MATRIX.
4372 GET 'matrix.sav'.
4373 LIST.
4374 ])
4375 AT_CHECK([pspp matrix.sps -O format=csv], [0], [dnl
4376 Table: Data List
4377 ROWTYPE_,VARNAME_,X,Y
4378 CORR,X,1.00,2.00
4379 CORR,Y,3.00,4.00
4380 COV,X,5.00,6.00
4381 COV,Y,7.00,8.00
4382 COV,,9.00,10.00
4383 MEAN,,11.00,12.00
4384 STDDEV,,13.00,14.00
4385 N,,15.00,16.00
4386 COUNT,,17.00,18.00
4387 ])
4388 AT_CLEANUP
4389
4390 AT_SETUP([MATRIX - MSAVE with factor variables])
4391 AT_DATA([matrix.sps], [dnl
4392 MATRIX.
4393 MSAVE {1, 2; 3, 4}/TYPE=CORR/FACTOR={1,1}/FNAMES=X,Y/OUTFILE='matrix.sav'.
4394 MSAVE {5, 6; 7, 8; 9, 10}/TYPE=COV.
4395 MSAVE {11, 12}/TYPE=MEAN.
4396 MSAVE {13, 14}/FACTOR={2,1}/TYPE=STDDEV.
4397 MSAVE {15, 16}/TYPE=N.
4398 MSAVE {17, 18}/FACTOR={1,2}/TYPE=COUNT.
4399 END MATRIX.
4400 GET 'matrix.sav'.
4401 LIST.
4402
4403 MATRIX.
4404 MSAVE {1, 2; 3, 4}/TYPE=CORR/FACTOR={5,6,7,8}/OUTFILE='matrix2.sav'.
4405 END MATRIX.
4406 GET 'matrix2.sav'.
4407 LIST.
4408 ])
4409 AT_CHECK([pspp matrix.sps -O format=csv], [0], [dnl
4410 Table: Data List
4411 ROWTYPE_,X,Y,VARNAME_,COL1,COL2
4412 CORR,1.00,1.00,COL1,1.00,2.00
4413 CORR,1.00,1.00,COL2,3.00,4.00
4414 COV,1.00,1.00,COL1,5.00,6.00
4415 COV,1.00,1.00,COL2,7.00,8.00
4416 COV,1.00,1.00,,9.00,10.00
4417 MEAN,1.00,1.00,,11.00,12.00
4418 STDDEV,2.00,1.00,,13.00,14.00
4419 N,2.00,1.00,,15.00,16.00
4420 COUNT,1.00,2.00,,17.00,18.00
4421
4422 Table: Data List
4423 ROWTYPE_,FAC1,FAC2,FAC3,FAC4,VARNAME_,COL1,COL2
4424 CORR,5.00,6.00,7.00,8.00,COL1,1.00,2.00
4425 CORR,5.00,6.00,7.00,8.00,COL2,3.00,4.00
4426 ])
4427 AT_CLEANUP
4428
4429 AT_SETUP([MATRIX - MSAVE with split variables])
4430 AT_DATA([matrix.sps], [dnl
4431 MATRIX.
4432 MSAVE {1, 2; 3, 4}/TYPE=CORR/SPLIT={1,1}/SNAMES=X,Y/OUTFILE='matrix.sav'.
4433 MSAVE {5, 6; 7, 8; 9, 10}/TYPE=COV.
4434 MSAVE {11, 12}/TYPE=MEAN.
4435 MSAVE {13, 14}/SPLIT={2,1}/TYPE=STDDEV.
4436 MSAVE {15, 16}/TYPE=N.
4437 MSAVE {17, 18}/SPLIT={1,2}/TYPE=COUNT.
4438 END MATRIX.
4439 GET 'matrix.sav'.
4440 LIST.
4441
4442 MATRIX.
4443 MSAVE {1, 2; 3, 4}/TYPE=CORR/SPLIT={5,6,7,8}/OUTFILE='matrix2.sav'.
4444 END MATRIX.
4445 GET 'matrix2.sav'.
4446 LIST.
4447 ])
4448 AT_CHECK([pspp matrix.sps -O format=csv], [0], [dnl
4449 Table: Data List
4450 X,Y,ROWTYPE_,VARNAME_,COL1,COL2
4451 1.00,1.00,CORR,COL1,1.00,2.00
4452 1.00,1.00,CORR,COL2,3.00,4.00
4453 1.00,1.00,COV,COL1,5.00,6.00
4454 1.00,1.00,COV,COL2,7.00,8.00
4455 1.00,1.00,COV,,9.00,10.00
4456 1.00,1.00,MEAN,,11.00,12.00
4457 2.00,1.00,STDDEV,,13.00,14.00
4458 2.00,1.00,N,,15.00,16.00
4459 1.00,2.00,COUNT,,17.00,18.00
4460
4461 Table: Data List
4462 SPL1,SPL2,SPL3,SPL4,ROWTYPE_,VARNAME_,COL1,COL2
4463 5.00,6.00,7.00,8.00,CORR,COL1,1.00,2.00
4464 5.00,6.00,7.00,8.00,CORR,COL2,3.00,4.00
4465 ])
4466 AT_CLEANUP
4467
4468 AT_SETUP([MATRIX - MSAVE with factor and split variables])
4469 AT_DATA([matrix.sps], [dnl
4470 MATRIX.
4471 MSAVE {1, 2; 3, 4}/TYPE=CORR/SPLIT=1/FACTOR=1/OUTFILE='matrix.sav'.
4472 MSAVE {5, 6; 7, 8; 9, 10}/TYPE=COV.
4473 MSAVE {11, 12}/FACTOR=2/TYPE=MEAN.
4474 MSAVE {13, 14}/FACTOR=1/SPLIT=2/TYPE=STDDEV.
4475 MSAVE {15, 16}/TYPE=N.
4476 MSAVE {17, 18}/FACTOR=2/TYPE=COUNT.
4477 END MATRIX.
4478 GET 'matrix.sav'.
4479 LIST.
4480 ])
4481 AT_CHECK([pspp matrix.sps -O format=csv], [0], [dnl
4482 Table: Data List
4483 SPL1,ROWTYPE_,FAC1,VARNAME_,COL1,COL2
4484 1.00,CORR,1.00,COL1,1.00,2.00
4485 1.00,CORR,1.00,COL2,3.00,4.00
4486 1.00,COV,1.00,COL1,5.00,6.00
4487 1.00,COV,1.00,COL2,7.00,8.00
4488 1.00,COV,1.00,,9.00,10.00
4489 1.00,MEAN,2.00,,11.00,12.00
4490 2.00,STDDEV,1.00,,13.00,14.00
4491 2.00,N,1.00,,15.00,16.00
4492 2.00,COUNT,2.00,,17.00,18.00
4493 ])
4494 AT_CLEANUP
4495
4496 AT_SETUP([MATRIX - MSAVE - negative])
4497 AT_DATA([matrix.sps], [dnl
4498 MATRIX.
4499 MSAVE !.
4500 MSAVE 1/TYPE=!.
4501 MSAVE 1/OUTFILE=!.
4502 MSAVE 1/VARIABLES=!.
4503 MSAVE 1/FNAMES=!.
4504 MSAVE 1/SNAMES=!.
4505 MSAVE 1/SPLIT=!.
4506 MSAVE 1/FACTOR=!.
4507 MSAVE 1/!.
4508 MSAVE 1.
4509 MSAVE 1/TYPE=COV/FNAMES=x.
4510 MSAVE 1/TYPE=COV/SNAMES=x.
4511 MSAVE 1/TYPE=COV.
4512
4513 MSAVE 1/TYPE=COV/OUTFILE='matrix.sav'
4514     /FACTOR=1 /FNAMES=y
4515     /SPLIT=2 /SNAMES=z
4516     /VARIABLES=w.
4517 MSAVE 1/TYPE=COV/OUTFILE='matrix2.sav'.
4518 MSAVE 1/TYPE=COV/VARIABLES=x.
4519 MSAVE 1/TYPE=COV/FNAMES=x.
4520 MSAVE 1/TYPE=COV/SNAMES=x.
4521 END MATRIX.
4522
4523 MATRIX.
4524 MSAVE 1/TYPE=COV/VARIABLES=x/OUTFILE='matrix3.sav'/FACTOR=1/SPLIT=2.
4525 MSAVE {1,2}/TYPE=COV/VARIABLES=x/OUTFILE='matrix3.sav'/FACTOR=1/SPLIT=2.
4526 MSAVE {1,2;3}/TYPE=COV.
4527 MSAVE 0/TYPE=COV/FACTOR={1,2}.
4528 MSAVE 0/TYPE=COV/FACTOR=1/SPLIT={1;2}.
4529 END MATRIX.
4530
4531 MATRIX.
4532 MSAVE 1/TYPE=COV/OUTFILE='matrix4.sav'/SNAMES=x,x/SPLIT=1.
4533 END MATRIX.
4534
4535 MATRIX.
4536 MSAVE 1/TYPE=COV/OUTFILE='matrix5.sav'/SNAMES=x/FNAMES=x/SPLIT=1/FACTOR=1.
4537 END MATRIX.
4538
4539 MATRIX.
4540 MSAVE 1/TYPE=COV/OUTFILE='matrix6.sav'/VARIABLES=x/FNAMES=x/FACTOR=1.
4541 END MATRIX.
4542
4543 MATRIX.
4544 MSAVE 1/TYPE=COV/OUTFILE='matrix6.sav'/VARIABLES=x/SNAMES=x/SPLIT=1.
4545 END MATRIX.
4546
4547 MATRIX.
4548 MSAVE 1/TYPE=COV/OUTFILE='matrix7.sav'/SNAMES=VARNAME_.
4549 MSAVE 1/TYPE=COV/OUTFILE='matrix7.sav'/SNAMES=ROWTYPE_.
4550 MSAVE 1/TYPE=COV/OUTFILE='matrix7.sav'/FNAMES=VARNAME_.
4551 MSAVE 1/TYPE=COV/OUTFILE='matrix7.sav'/FNAMES=ROWTYPE_.
4552 MSAVE 1/TYPE=COV/OUTFILE='matrix7.sav'/VARIABLES=VARNAME_.
4553 MSAVE 1/TYPE=COV/OUTFILE='matrix7.sav'/VARIABLES=ROWTYPE_.
4554 END MATRIX.
4555 ])
4556 AT_CHECK([pspp matrix.sps], [1], [dnl
4557 matrix.sps:2.7: error: MSAVE: Syntax error at `!'.
4558
4559 matrix.sps:3.14: error: MSAVE: Syntax error at `!': expecting COV, CORR, MEAN,
4560 STDDEV, N, or COUNT.
4561
4562 matrix.sps:4.17: error: MSAVE: Syntax error at `!': expecting a file name or
4563 handle name.
4564
4565 matrix.sps:5.19: error: MSAVE: Syntax error at `!': expecting variable name.
4566
4567 matrix.sps:6.16: error: MSAVE: Syntax error at `!': expecting variable name.
4568
4569 matrix.sps:7.16: error: MSAVE: Syntax error at `!': expecting variable name.
4570
4571 matrix.sps:8.15: error: MSAVE: Syntax error at `!'.
4572
4573 matrix.sps:9.16: error: MSAVE: Syntax error at `!'.
4574
4575 matrix.sps:10.9: error: MSAVE: Syntax error at `!': expecting TYPE, OUTFILE,
4576 VARIABLES, FNAMES, SNAMES, SPLIT, or FACTOR.
4577
4578 matrix.sps:11: error: MSAVE: Required subcommand TYPE was not specified.
4579
4580 matrix.sps:12: error: MSAVE: FNAMES requires FACTOR.
4581
4582 matrix.sps:13: error: MSAVE: SNAMES requires SPLIT.
4583
4584 matrix.sps:14: error: MSAVE: Required subcommand OUTFILE was not specified.
4585
4586 matrix.sps:20: error: MSAVE: OUTFILE must name the same file on each MSAVE
4587 within a single MATRIX command.
4588
4589 matrix.sps:21: error: MSAVE: VARIABLES must specify the same variables each
4590 time within a given MATRIX.
4591
4592 matrix.sps:16-19: note: MSAVE: This is the location of the first MSAVE command.
4593
4594 matrix.sps:22: error: MSAVE: FNAMES must specify the same variables each time
4595 within a given MATRIX.
4596
4597 matrix.sps:16-19: note: MSAVE: This is the location of the first MSAVE command.
4598
4599 matrix.sps:23: error: MSAVE: SNAMES must specify the same variables each time
4600 within a given MATRIX.
4601
4602 matrix.sps:16-19: note: MSAVE: This is the location of the first MSAVE command.
4603
4604 matrix.sps:28.7-28.11: error: MATRIX: Matrix on MSAVE has 2 columns but there
4605 are 1 variables.
4606    28 | MSAVE {1,2}/TYPE=COV/VARIABLES=x/OUTFILE='matrix3.sav'/FACTOR=1/
4607 SPLIT=2.
4608       |       ^~~~~
4609
4610 matrix.sps:29.7-29.13: error: MATRIX: This expression tries to vertically join
4611 matrices with differing numbers of columns.
4612    29 | MSAVE {1,2;3}/TYPE=COV.
4613       |       ^~~~~~~
4614
4615 matrix.sps:29.8-29.10: note: MATRIX: This operand is a 1×2 matrix.
4616    29 | MSAVE {1,2;3}/TYPE=COV.
4617       |        ^~~
4618
4619 matrix.sps:29.12: note: MATRIX: This operand is a 1×1 matrix.
4620    29 | MSAVE {1,2;3}/TYPE=COV.
4621       |            ^
4622
4623 matrix.sps:30.25-30.29: error: MATRIX: There are 1 factor variables, but 2
4624 factor values were supplied.
4625    30 | MSAVE 0/TYPE=COV/FACTOR={1,2}.
4626       |                         ^~~~~
4627
4628 matrix.sps:31.33-31.37: error: MATRIX: There are 1 split variables, but 2 split
4629 values were supplied.
4630    31 | MSAVE 0/TYPE=COV/FACTOR=1/SPLIT={1;2}.
4631       |                                 ^~~~~
4632
4633 matrix.sps:35: error: MSAVE: Variable x appears twice in variable list.
4634
4635 matrix.sps:39: error: MATRIX: Duplicate or invalid FACTOR variable name x.
4636
4637 matrix.sps:43: error: MATRIX: Duplicate or invalid variable name x.
4638
4639 matrix.sps:47: error: MATRIX: Duplicate or invalid variable name x.
4640
4641 matrix.sps:51: error: MSAVE: Variable name VARNAME_ is reserved.
4642
4643 matrix.sps:52: error: MSAVE: Variable name ROWTYPE_ is reserved.
4644
4645 matrix.sps:53: error: MSAVE: Variable name VARNAME_ is reserved.
4646
4647 matrix.sps:54: error: MSAVE: Variable name ROWTYPE_ is reserved.
4648
4649 matrix.sps:55: error: MSAVE: Variable name VARNAME_ is reserved.
4650
4651 matrix.sps:56: error: MSAVE: Variable name ROWTYPE_ is reserved.
4652 ])
4653 AT_CLEANUP
4654
4655 AT_SETUP([MATRIX - DISPLAY])
4656 AT_DATA([matrix-template.sps], [dnl
4657 MATRIX.
4658 COMPUTE a={1,2,3}.
4659 COMPUTE b={1;2;3}.
4660 COMPUTE c={T(b),a}.
4661 COMPUTE d={T(a),b}.
4662 command.
4663 END MATRIX.
4664 ])
4665 for command in 'DISPLAY' 'DISPLAY DICTIONARY' 'DISPLAY STATUS'; do
4666     sed "s/command/$command/" < matrix-template.sps > matrix.sps
4667     AT_CHECK([pspp matrix.sps -O format=csv], [0], [dnl
4668 Table: Matrix Variables
4669 ,Dimension,,Size (kB)
4670 ,Rows,Columns,
4671 a,1,3,0
4672 b,3,1,0
4673 c,1,6,0
4674 d,3,2,0
4675 ])
4676 done
4677 AT_CLEANUP
4678
4679 AT_SETUP([MATRIX - DISPLAY - negative])
4680 AT_DATA([matrix.sps], [dnl
4681 MATRIX.
4682 DISPLAY !.
4683 END MATRIX.
4684 ])
4685 AT_CHECK([pspp matrix.sps], [1], [dnl
4686 matrix.sps:2.9: error: DISPLAY: Syntax error at `!': expecting DICTIONARY or
4687 STATUS.
4688 ])
4689 AT_CLEANUP
4690
4691 AT_SETUP([MATRIX - RELEASE])
4692 AT_DATA([matrix.sps], [dnl
4693 MATRIX.
4694 COMPUTE x=1.
4695 PRINT x.
4696 RELEASE X.
4697 PRINT x.
4698 END MATRIX.
4699 ])
4700 AT_CHECK([pspp matrix.sps], [1], [dnl
4701 x
4702   1
4703
4704 matrix.sps:5.7: error: MATRIX: Uninitialized variable x used in expression.
4705     5 | PRINT x.
4706       |       ^
4707 ])
4708 AT_CLEANUP
4709
4710 AT_SETUP([MATRIX - RELEASE - negative])
4711 AT_DATA([matrix.sps], [dnl
4712 MATRIX.
4713 RELEASE !.
4714 RELEASE x.
4715 COMPUTE x=1.
4716 RELEASE x, !.
4717 COMPUTE x=1.
4718 RELEASE x y.
4719 COMPUTE x=1.
4720 RELEASE x.
4721 RELEASE x.
4722 END MATRIX.
4723 ])
4724 AT_CHECK([pspp matrix.sps], [1], [dnl
4725 matrix.sps:2.9: error: RELEASE: Syntax error at `!': expecting end of command.
4726
4727 matrix.sps:3.9: error: RELEASE: Syntax error at `x': Variable name expected.
4728
4729 matrix.sps:5.12: error: RELEASE: Syntax error at `!': expecting end of command.
4730
4731 matrix.sps:7.11: error: RELEASE: Syntax error at `y': expecting end of command.
4732 ])
4733 AT_CLEANUP