Use constraints more widely in matrix functions.
[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: error: MATRIX: 0 is not a valid row index for a 3×3 matrix.
152
153 matrix.sps:25: error: MATRIX: 0 is not a valid column index for a 3×3 matrix.
154
155 matrix.sps:26: error: MATRIX: 4 is not a valid row index for a 3×3 matrix.
156
157 matrix.sps:27: error: MATRIX: 4 is not a valid column index for a 3×3 matrix.
158
159 {}(:,{})
160
161 {}({},:)
162
163 {}({},{})
164
165 matrix.sps:33: error: MATRIX: Matrix row index must be scalar or vector, not a
166 2×2 matrix.
167
168 matrix.sps:34: error: MATRIX: Matrix column index must be scalar or vector, not
169 a 2×2 matrix.
170 ])
171 AT_CLEANUP
172
173 AT_SETUP([MATRIX - COMPUTE submatrices as lvalues])
174 AT_DATA([matrix.sps], [dnl
175 MATRIX.
176 COMPUTE y={1, 2, 3; 4, 5, 6; 7, 8, 9}.
177
178 COMPUTE x1=y.
179 COMPUTE x1(1, :) = {11, 12, 13}.
180 PRINT x1.
181
182 COMPUTE x2=y.
183 COMPUTE x2(2, :) = {14, 15, 16}.
184 PRINT x2.
185
186 COMPUTE x3=y.
187 COMPUTE x3(3, :) = {17, 18, 19}.
188 PRINT x3.
189
190 COMPUTE x4=y.
191 COMPUTE x4(:, 1) = {11; 14; 17}.
192 PRINT x4.
193
194 COMPUTE x5=y.
195 COMPUTE x5(:, 2) = {12; 15; 18}.
196 PRINT x5.
197
198 COMPUTE x6=y.
199 COMPUTE x6(:, 3) = {13; 16; 19}.
200 PRINT x6.
201
202 COMPUTE x7=y.
203 COMPUTE x7(1, 1) = 11.
204 PRINT x7.
205
206 COMPUTE x8=y.
207 COMPUTE x8(1:2, 2:3) = {12, 13; 15, 16}.
208 PRINT x8.
209
210 COMPUTE x9=y.
211 COMPUTE x9({3, 1}, {2; 3}) = {18, 19; 12, 13}.
212 PRINT x9.
213 END MATRIX.
214 ])
215 AT_CHECK([pspp matrix.sps], [0], [dnl
216 x1
217   11  12  13
218    4   5   6
219    7   8   9
220
221 x2
222    1   2   3
223   14  15  16
224    7   8   9
225
226 x3
227    1   2   3
228    4   5   6
229   17  18  19
230
231 x4
232   11   2   3
233   14   5   6
234   17   8   9
235
236 x5
237    1  12   3
238    4  15   6
239    7  18   9
240
241 x6
242    1   2  13
243    4   5  16
244    7   8  19
245
246 x7
247   11   2   3
248    4   5   6
249    7   8   9
250
251 x8
252    1  12  13
253    4  15  16
254    7   8   9
255
256 x9
257    1  12  13
258    4   5   6
259    7  18  19
260 ])
261 AT_CLEANUP
262
263 AT_SETUP([MATRIX - COMPUTE submatrices as lvalues - negative])
264 AT_DATA([matrix.sps], [dnl
265 MATRIX.
266 COMPUTE x={1, 2, 3; 4, 5, 6; 7, 8, 9}.
267 COMPUTE x(1, :) = {}.
268 COMPUTE x(1, :) = 15.
269 COMPUTE x(1, :) = {11, 12}.
270 COMPUTE x(1, :) = {11, 12, 13, 14}.
271 COMPUTE x(:, 1) = {}.
272 COMPUTE x(:, 1) = 15.
273 COMPUTE x(:, 1) = {11, 12}.
274 COMPUTE x(:, 1) = {11, 12, 13, 14}.
275 COMPUTE x(:) = 1.
276 COMPUTE x(0, 1) = 1.
277 COMPUTE x(1, 0) = 1.
278 COMPUTE x({1, 0, 2}, 1) = {1; 2; 3}.
279 COMPUTE x(4, 3) = 1.
280 COMPUTE x(3, 4) = 1.
281 COMPUTE x({1, 2; 3, 4}, 5) = 1.
282 COMPUTE x(3, {1, 2; 3, 4}) = 1.
283 PRINT x.
284 END MATRIX.
285 ])
286 AT_CHECK([pspp matrix.sps], [1], [dnl
287 matrix.sps:3: error: MATRIX: Row index vector for assignment to x has 1
288 elements but source matrix has 0 rows.
289
290 matrix.sps:4: error: MATRIX: Column index vector for assignment to x has 3
291 elements but source matrix has 1 columns.
292
293 matrix.sps:5: error: MATRIX: Column index vector for assignment to x has 3
294 elements but source matrix has 2 columns.
295
296 matrix.sps:6: error: MATRIX: Column index vector for assignment to x has 3
297 elements but source matrix has 4 columns.
298
299 matrix.sps:7: error: MATRIX: Row index vector for assignment to x has 3
300 elements but source matrix has 0 rows.
301
302 matrix.sps:8: error: MATRIX: Row index vector for assignment to x has 3
303 elements but source matrix has 1 rows.
304
305 matrix.sps:9: error: MATRIX: Row index vector for assignment to x has 3
306 elements but source matrix has 1 rows.
307
308 matrix.sps:10: error: MATRIX: Row index vector for assignment to x has 3
309 elements but source matrix has 1 rows.
310
311 matrix.sps:11: error: MATRIX: Can't use vector indexing on 3×3 matrix x.
312
313 matrix.sps:12: error: MATRIX: 0 is not a valid row index for a 3×3 matrix.
314
315 matrix.sps:13: error: MATRIX: 0 is not a valid column index for a 3×3 matrix.
316
317 matrix.sps:14: error: MATRIX: 0 is not a valid row index for a 3×3 matrix.
318
319 matrix.sps:15: error: MATRIX: 4 is not a valid row index for a 3×3 matrix.
320
321 matrix.sps:16: error: MATRIX: 4 is not a valid column index for a 3×3 matrix.
322
323 matrix.sps:17: error: MATRIX: Matrix row index must be scalar or vector, not a
324 2×2 matrix.
325
326 matrix.sps:18: error: MATRIX: Matrix column index must be scalar or vector, not
327 a 2×2 matrix.
328
329 x
330   1  2  3
331   4  5  6
332   7  8  9
333 ])
334 AT_CLEANUP
335
336 AT_SETUP([MATRIX - subvectors as rvalues])
337 AT_DATA([matrix.sps], [dnl
338 MATRIX.
339 PRINT {10, 20, 30}({}).
340 PRINT {10, 20, 30}(2).
341 PRINT {10, 20, 30}({2}).
342 PRINT {10, 20, 30}({1,3}).
343 PRINT {10, 20, 30}({2,3}).
344 PRINT {10, 20, 30}({1;3}).
345 PRINT {10, 20, 30}({2;3}).
346 PRINT {10, 20, 30}(2:3).
347 PRINT {10, 20, 30}(:).
348
349 PRINT {10; 20; 30}({}).
350 PRINT {10; 20; 30}(2).
351 PRINT {10; 20; 30}({2}).
352 PRINT {10; 20; 30}({1,3}).
353 PRINT {10; 20; 30}({2,3}).
354 PRINT {10; 20; 30}({1;3}).
355 PRINT {10; 20; 30}({2;3}).
356 PRINT {10; 20; 30}(2:3).
357 PRINT {10; 20; 30}(:).
358
359 PRINT {}({}).
360
361 PRINT {1, 2; 3, 4}(:).
362 PRINT {1, 2, 3, 4}({1, 2; 3, 4}).
363 PRINT {1, 2, 3, 4}(0).
364 PRINT {1, 2, 3, 4}(5).
365 END MATRIX.
366 ])
367 AT_CHECK([pspp matrix.sps], [1], [dnl
368 {10, 20, 30}({})
369
370 {10, 20, 30}(2)
371   20
372
373 {10, 20, 30}({2})
374   20
375
376 {10, 20, 30}({1,3})
377   10  30
378
379 {10, 20, 30}({2,3})
380   20  30
381
382 {10, 20, 30}({1;3})
383   10  30
384
385 {10, 20, 30}({2;3})
386   20  30
387
388 {10, 20, 30}(2:3)
389   20  30
390
391 {10, 20, 30}(:)
392   10  20  30
393
394 {10; 20; 30}({})
395
396 {10; 20; 30}(2)
397   20
398
399 {10; 20; 30}({2})
400   20
401
402 {10; 20; 30}({1,3})
403   10
404   30
405
406 {10; 20; 30}({2,3})
407   20
408   30
409
410 {10; 20; 30}({1;3})
411   10
412   30
413
414 {10; 20; 30}({2;3})
415   20
416   30
417
418 {10; 20; 30}(2:3)
419   20
420   30
421
422 {10; 20; 30}(:)
423   10
424   20
425   30
426
427 {}({})
428
429 matrix.sps:24: error: MATRIX: Vector index operator may not be applied to a 2×2
430 matrix.
431
432 matrix.sps:25: error: MATRIX: Vector index must be scalar or vector, not a 2×2
433 matrix.
434
435 matrix.sps:26: error: MATRIX: Index 0 is out of range for vector with 4
436 elements.
437
438 matrix.sps:27: error: MATRIX: Index 5 is out of range for vector with 4
439 elements.
440 ])
441 AT_CLEANUP
442
443 AT_SETUP([MATRIX - COMPUTE subvectors as lvalues])
444 AT_DATA([matrix.sps], [dnl
445 MATRIX.
446 COMPUTE r={1, 2, 3, 4, 5, 6, 7, 8, 9}.
447
448 COMPUTE r1=r.
449 COMPUTE r1(:) = {11, 12, 13, 14, 15, 16, 17, 18, 19}.
450 PRINT r1.
451
452 COMPUTE r2=r.
453 COMPUTE r2(:) = {11; 12; 13; 14; 15; 16; 17; 18; 19}.
454 PRINT r2.
455
456 COMPUTE r3=r.
457 COMPUTE r3(1) = 11.
458 PRINT r3.
459
460 COMPUTE r4=r.
461 COMPUTE r4(1:2) = {11:12}.
462 PRINT r4.
463
464 COMPUTE r5=r.
465 COMPUTE r5({8;9}) = {18:19}.
466 PRINT r5.
467
468 COMPUTE c={1, 2, 3, 4, 5, 6, 7, 8, 9}.
469
470 COMPUTE c1=c.
471 COMPUTE c1(:) = {11, 12, 13, 14, 15, 16, 17, 18, 19}.
472 PRINT c1.
473
474 COMPUTE c2=c.
475 COMPUTE c2(:) = {11; 12; 13; 14; 15; 16; 17; 18; 19}.
476 PRINT c2.
477
478 COMPUTE c3=c.
479 COMPUTE c3(1) = 11.
480 PRINT c3.
481
482 COMPUTE c4=c.
483 COMPUTE c4(1:2) = {11:12}.
484 PRINT c4.
485
486 COMPUTE c5=c.
487 COMPUTE c5(8:9) = {18:19}.
488 PRINT c5.
489 END MATRIX.
490 ])
491 AT_CHECK([pspp matrix.sps], [0], [dnl
492 r1
493   11  12  13  14  15  16  17  18  19
494
495 r2
496   11  12  13  14  15  16  17  18  19
497
498 r3
499   11   2   3   4   5   6   7   8   9
500
501 r4
502   11  12   3   4   5   6   7   8   9
503
504 r5
505    1   2   3   4   5   6   7  18  19
506
507 c1
508   11  12  13  14  15  16  17  18  19
509
510 c2
511   11  12  13  14  15  16  17  18  19
512
513 c3
514   11   2   3   4   5   6   7   8   9
515
516 c4
517   11  12   3   4   5   6   7   8   9
518
519 c5
520    1   2   3   4   5   6   7  18  19
521 ])
522 AT_CLEANUP
523
524 AT_SETUP([MATRIX - COMPUTE subvectors as lvalues - negative])
525 AT_DATA([matrix.sps], [dnl
526 MATRIX.
527 COMPUTE r={1, 2, 3, 4, 5, 6, 7, 8, 9}.
528 COMPUTE r(1:3) = {1, 2; 3, 4}.
529 COMPUTE r(1:3) = {}.
530 COMPUTE r(1:3) = {1}.
531 COMPUTE r(1:3) = {1, 2}.
532 COMPUTE r(1:3) = {1, 2, 3, 4}.
533 COMPUTE r(1:3) = {}.
534 COMPUTE r(1:3) = {1}.
535 COMPUTE r(1:3) = {1; 2}.
536 COMPUTE r(1:3) = {1; 2; 3; 4}.
537 COMPUTE r(:) = {1; 2; 3; 4}.
538 COMPUTE r(0) = 5.
539 COMPUTE r(10) = 5.
540 COMPUTE r({1, 2; 3, 4}) = 1.
541
542 COMPUTE c={1, 2, 3, 4, 5, 6, 7, 8, 9}.
543 COMPUTE c(1:3) = {1, 2; 3, 4}.
544 COMPUTE c(1:3) = {}.
545 COMPUTE c(1:3) = {1}.
546 COMPUTE c(1:3) = {1, 2}.
547 COMPUTE c(1:3) = {1, 2, 3, 4}.
548 COMPUTE c(1:3) = {}.
549 COMPUTE c(1:3) = {1}.
550 COMPUTE c(1:3) = {1; 2}.
551 COMPUTE c(1:3) = {1; 2; 3; 4}.
552 COMPUTE c(:) = {1; 2; 3; 4}.
553 COMPUTE c(0) = 5.
554 COMPUTE c(10) = 5.
555 COMPUTE c({1, 2; 3, 4}) = 1.
556
557 COMPUTE m = {1, 2; 3, 4}.
558 COMPUTE m(5) = 1.
559 COMPUTE m(:) = 1.
560 END MATRIX.
561 ])
562 AT_CHECK([pspp matrix.sps], [1], [dnl
563 matrix.sps:3: error: MATRIX: Can't assign 2×2 matrix to subvector.
564
565 matrix.sps:4: error: MATRIX: Can't assign 0-element vector to 3-element
566 subvector.
567
568 matrix.sps:5: error: MATRIX: Can't assign 1-element vector to 3-element
569 subvector.
570
571 matrix.sps:6: error: MATRIX: Can't assign 2-element vector to 3-element
572 subvector.
573
574 matrix.sps:7: error: MATRIX: Can't assign 4-element vector to 3-element
575 subvector.
576
577 matrix.sps:8: error: MATRIX: Can't assign 0-element vector to 3-element
578 subvector.
579
580 matrix.sps:9: error: MATRIX: Can't assign 1-element vector to 3-element
581 subvector.
582
583 matrix.sps:10: error: MATRIX: Can't assign 2-element vector to 3-element
584 subvector.
585
586 matrix.sps:11: error: MATRIX: Can't assign 4-element vector to 3-element
587 subvector.
588
589 matrix.sps:12: error: MATRIX: Can't assign 4-element vector to 9-element
590 subvector.
591
592 matrix.sps:13: error: MATRIX: Index 0 is out of range for vector with 9
593 elements.
594
595 matrix.sps:14: error: MATRIX: Index 10 is out of range for vector with 9
596 elements.
597
598 matrix.sps:15: error: MATRIX: Vector index must be scalar or vector, not a 2×2
599 matrix.
600
601 matrix.sps:18: error: MATRIX: Can't assign 2×2 matrix to subvector.
602
603 matrix.sps:19: error: MATRIX: Can't assign 0-element vector to 3-element
604 subvector.
605
606 matrix.sps:20: error: MATRIX: Can't assign 1-element vector to 3-element
607 subvector.
608
609 matrix.sps:21: error: MATRIX: Can't assign 2-element vector to 3-element
610 subvector.
611
612 matrix.sps:22: error: MATRIX: Can't assign 4-element vector to 3-element
613 subvector.
614
615 matrix.sps:23: error: MATRIX: Can't assign 0-element vector to 3-element
616 subvector.
617
618 matrix.sps:24: error: MATRIX: Can't assign 1-element vector to 3-element
619 subvector.
620
621 matrix.sps:25: error: MATRIX: Can't assign 2-element vector to 3-element
622 subvector.
623
624 matrix.sps:26: error: MATRIX: Can't assign 4-element vector to 3-element
625 subvector.
626
627 matrix.sps:27: error: MATRIX: Can't assign 4-element vector to 9-element
628 subvector.
629
630 matrix.sps:28: error: MATRIX: Index 0 is out of range for vector with 9
631 elements.
632
633 matrix.sps:29: error: MATRIX: Index 10 is out of range for vector with 9
634 elements.
635
636 matrix.sps:30: error: MATRIX: Vector index must be scalar or vector, not a 2×2
637 matrix.
638
639 matrix.sps:33: error: MATRIX: Can't use vector indexing on 2×2 matrix m.
640
641 matrix.sps:34: error: MATRIX: Can't use vector indexing on 2×2 matrix m.
642 ])
643 AT_CLEANUP
644
645 AT_SETUP([MATRIX - COMPUTE - negative])
646 AT_DATA([matrix.sps], [dnl
647 MATRIX.
648 COMPUTE x.
649 COMPUTE x=.
650 COMPUTE x(5)=1.
651 COMPUTE y(5)=1.
652 END MATRIX.
653 ])
654 AT_CHECK([pspp matrix.sps], [1], [dnl
655 matrix.sps:2.10: error: COMPUTE: Syntax error at end of command: expecting `='.
656
657 matrix.sps:3.11: error: COMPUTE: Syntax error at end of command.
658
659 matrix.sps:4: error: MATRIX: Undefined variable x.
660
661 matrix.sps:5: error: COMPUTE: Undefined variable y.
662 ])
663 AT_CLEANUP
664
665 AT_SETUP([MATRIX - elementwise arithmetic operators])
666 AT_DATA([matrix.sps], [dnl
667 MATRIX.
668 PRINT (-(5)).
669 PRINT (-{1,2;3,4}).
670
671 PRINT ({1,2;3,4} + {5,6;7,8}).
672 PRINT ({1,2;3,4} + 5).
673 PRINT (5 + {5,6;7,8}).
674 PRINT ({1,2;3,4} + {5,6}).
675
676 PRINT ({1,2;3,4} - {5,6;7,8}).
677 PRINT ({1,2;3,4} - 5).
678 PRINT (5 - {5,6;7,8}).
679 PRINT ({1,2;3,4} - {5,6}).
680
681 PRINT ({1,2;3,4} * 5).
682 PRINT (5 * {5,6;7,8}).
683
684 PRINT ({2,4;6,8} / 2).
685 PRINT (12 / {1,2;3,4}).
686 PRINT ({2,8;18,32} / {1,2;3,4}).
687
688 PRINT ({1,2;3,4} &* {5,6;7,8}).
689 PRINT ({1,2;3,4} &* 5).
690 PRINT (5 &* {5,6;7,8}).
691 PRINT ({1,2;3,4} &* {5,6}).
692
693 PRINT ({2,4;6,8} &/ 2).
694 PRINT (12 &/ {1,2;3,4}).
695 PRINT ({2,8;18,32} &/ {1,2;3,4}).
696
697 PRINT ({1,2;3,4} &** 2).
698 PRINT (2 &** {1,2;3,4}).
699 PRINT ({1,2;3,4} &** {2,3;4,5}).
700 PRINT ({1,2;3,4} &** {5,6}).
701 END MATRIX.
702 ])
703 AT_CHECK([pspp matrix.sps], [1], [dnl
704 (-(5))
705  -5
706
707 (-{1,2;3,4})
708  -1 -2
709  -3 -4
710
711 ({1,2;3,4} + {5,6;7,8})
712    6   8
713   10  12
714
715 ({1,2;3,4} + 5)
716   6  7
717   8  9
718
719 (5 + {5,6;7,8})
720   10  11
721   12  13
722
723 matrix.sps:8: error: MATRIX: Operands to + must have the same dimensions or one
724 must be a scalar, not 2×2 and 1×2 matrices.
725
726 ({1,2;3,4} - {5,6;7,8})
727  -4 -4
728  -4 -4
729
730 ({1,2;3,4} - 5)
731  -4 -3
732  -2 -1
733
734 (5 - {5,6;7,8})
735   0 -1
736  -2 -3
737
738 matrix.sps:13: error: MATRIX: Operands to - must have the same dimensions or
739 one must be a scalar, not 2×2 and 1×2 matrices.
740
741 ({1,2;3,4} * 5)
742    5  10
743   15  20
744
745 (5 * {5,6;7,8})
746   25  30
747   35  40
748
749 ({2,4;6,8} / 2)
750   1  2
751   3  4
752
753 (12 / {1,2;3,4})
754   12   6
755    4   3
756
757 ({2,8;18,32} / {1,2;3,4})
758   2  4
759   6  8
760
761 ({1,2;3,4} &* {5,6;7,8})
762    5  12
763   21  32
764
765 ({1,2;3,4} &* 5)
766    5  10
767   15  20
768
769 (5 &* {5,6;7,8})
770   25  30
771   35  40
772
773 matrix.sps:25: error: MATRIX: Operands to &* must have the same dimensions or
774 one must be a scalar, not 2×2 and 1×2 matrices.
775
776 ({2,4;6,8} &/ 2)
777   1  2
778   3  4
779
780 (12 &/ {1,2;3,4})
781   12   6
782    4   3
783
784 ({2,8;18,32} &/ {1,2;3,4})
785   2  4
786   6  8
787
788 ({1,2;3,4} &** 2)
789    1   4
790    9  16
791
792 (2 &** {1,2;3,4})
793    2   4
794    8  16
795
796 ({1,2;3,4} &** {2,3;4,5})
797      1     8
798     81  1024
799
800 matrix.sps:34: error: MATRIX: Operands to &** must have the same dimensions or
801 one must be a scalar, not 2×2 and 1×2 matrices.
802 ])
803 AT_CLEANUP
804
805 AT_SETUP([MATRIX - relational operators])
806 AT_DATA([matrix.sps], [dnl
807 MATRIX.
808 PRINT ({1, 1; 2, 2} > {1, 2; 1, 2}).
809 PRINT ({1, 1; 2, 2} > 1).
810 PRINT (2 > {1, 2; 1, 2}).
811 PRINT ({1, 2} > {1; 2}).
812
813 PRINT ({1, 1; 2, 2} < {1, 2; 1, 2}).
814 PRINT ({1, 1; 2, 2} < 2).
815 PRINT (1 < {1, 2; 1, 2}).
816 PRINT ({1, 2} < {1; 2}).
817
818 PRINT ({1, 1; 2, 2} <> {1, 2; 1, 2}).
819 PRINT ({1, 1; 2, 2} <> 2).
820 PRINT (1 <> {1, 2; 1, 2}).
821 PRINT ({1, 2} <> {1; 2}).
822
823 PRINT ({1, 1; 2, 2} >= {1, 2; 1, 2}).
824 PRINT ({1, 1; 2, 2} >= 2).
825 PRINT (1 >= {1, 2; 1, 2}).
826 PRINT ({1, 2} >= {1; 2}).
827
828 PRINT ({1, 1; 2, 2} <= {1, 2; 1, 2}).
829 PRINT ({1, 1; 2, 2} <= 2).
830 PRINT (1 <= {1, 2; 1, 2}).
831 PRINT ({1, 2} <= {1; 2}).
832
833 PRINT ({1, 1; 2, 2} = {1, 2; 1, 2}).
834 PRINT ({1, 1; 2, 2} = 2).
835 PRINT (1 = {1, 2; 1, 2}).
836 PRINT ({1, 2} = {1; 2}).
837 END MATRIX.
838 ])
839 AT_CHECK([pspp matrix.sps], [1], [dnl
840 ({1, 1; 2, 2} > {1, 2; 1, 2})
841   0  0
842   1  0
843
844 ({1, 1; 2, 2} > 1)
845   0  0
846   1  1
847
848 (2 > {1, 2; 1, 2})
849   1  0
850   1  0
851
852 matrix.sps:5: error: MATRIX: Operands to > must have the same dimensions or one
853 must be a scalar, not 1×2 and 2×1 matrices.
854
855 ({1, 1; 2, 2} < {1, 2; 1, 2})
856   0  1
857   0  0
858
859 ({1, 1; 2, 2} < 2)
860   1  1
861   0  0
862
863 (1 < {1, 2; 1, 2})
864   0  1
865   0  1
866
867 matrix.sps:10: error: MATRIX: Operands to < must have the same dimensions or
868 one must be a scalar, not 1×2 and 2×1 matrices.
869
870 ({1, 1; 2, 2} <> {1, 2; 1, 2})
871   0  1
872   1  0
873
874 ({1, 1; 2, 2} <> 2)
875   1  1
876   0  0
877
878 (1 <> {1, 2; 1, 2})
879   0  1
880   0  1
881
882 matrix.sps:15: error: MATRIX: Operands to <> must have the same dimensions or
883 one must be a scalar, not 1×2 and 2×1 matrices.
884
885 ({1, 1; 2, 2} >= {1, 2; 1, 2})
886   1  0
887   1  1
888
889 ({1, 1; 2, 2} >= 2)
890   0  0
891   1  1
892
893 (1 >= {1, 2; 1, 2})
894   1  0
895   1  0
896
897 matrix.sps:20: error: MATRIX: Operands to >= must have the same dimensions or
898 one must be a scalar, not 1×2 and 2×1 matrices.
899
900 ({1, 1; 2, 2} <= {1, 2; 1, 2})
901   1  1
902   0  1
903
904 ({1, 1; 2, 2} <= 2)
905   1  1
906   1  1
907
908 (1 <= {1, 2; 1, 2})
909   1  1
910   1  1
911
912 matrix.sps:25: error: MATRIX: Operands to <= must have the same dimensions or
913 one must be a scalar, not 1×2 and 2×1 matrices.
914
915 ({1, 1; 2, 2} = {1, 2; 1, 2})
916   1  0
917   0  1
918
919 ({1, 1; 2, 2} = 2)
920   0  0
921   1  1
922
923 (1 = {1, 2; 1, 2})
924   1  0
925   1  0
926
927 matrix.sps:30: error: MATRIX: Operands to = must have the same dimensions or
928 one must be a scalar, not 1×2 and 2×1 matrices.
929 ])
930 AT_CLEANUP
931
932 AT_SETUP([MATRIX - logical operators])
933 AT_DATA([matrix.sps], [dnl
934 MATRIX.
935 PRINT (NOT {-1, 0, 1}).
936
937 PRINT ({-1, 0, 1; -1, 0, 1; -1, 0, 1} AND {-1, -1, -1; 0, 0, 0; 1, 1, 1}).
938 PRINT ({-1, 0, 1} AND -1).
939 PRINT ({-1, 0, 1} AND 0).
940 PRINT ({-1, 0, 1} AND 1).
941 PRINT ({-1, 0} AND {2; 3}).
942
943 PRINT ({-1, 0, 1; -1, 0, 1; -1, 0, 1} OR {-1, -1, -1; 0, 0, 0; 1, 1, 1}).
944 PRINT ({-1, 0, 1} OR -1).
945 PRINT ({-1, 0, 1} OR 0).
946 PRINT ({-1, 0, 1} OR 1).
947 PRINT ({-1, 0} OR {2; 3}).
948
949 PRINT ({-1, 0, 1; -1, 0, 1; -1, 0, 1} XOR {-1, -1, -1; 0, 0, 0; 1, 1, 1}).
950 PRINT ({-1, 0, 1} XOR -1).
951 PRINT ({-1, 0, 1} XOR 0).
952 PRINT ({-1, 0, 1} XOR 1).
953 PRINT ({-1, 0} XOR {2; 3}).
954 END MATRIX.
955 ])
956 AT_CHECK([pspp matrix.sps], [1], [dnl
957 (NOT {-1, 0, 1})
958   1  1  0
959
960 ({-1, 0, 1; -1, 0, 1; -1, 0, 1} AND {-1, -1, -1; 0, 0, 0; 1, 1, 1})
961   0  0  0
962   0  0  0
963   0  0  1
964
965 ({-1, 0, 1} AND -1)
966  0 0 0
967
968 ({-1, 0, 1} AND 0)
969  0 0 0
970
971 ({-1, 0, 1} AND 1)
972   0  0  1
973
974 matrix.sps:8: error: MATRIX: Operands to AND must have the same dimensions or
975 one must be a scalar, not 1×2 and 2×1 matrices.
976
977 ({-1, 0, 1; -1, 0, 1; -1, 0, 1} OR {-1, -1, -1; 0, 0, 0; 1, 1, 1})
978   0  0  1
979   0  0  1
980   1  1  1
981
982 ({-1, 0, 1} OR -1)
983   0  0  1
984
985 ({-1, 0, 1} OR 0)
986   0  0  1
987
988 ({-1, 0, 1} OR 1)
989   1  1  1
990
991 matrix.sps:14: error: MATRIX: Operands to OR must have the same dimensions or
992 one must be a scalar, not 1×2 and 2×1 matrices.
993
994 ({-1, 0, 1; -1, 0, 1; -1, 0, 1} XOR {-1, -1, -1; 0, 0, 0; 1, 1, 1})
995   0  0  1
996   0  0  1
997   1  1  0
998
999 ({-1, 0, 1} XOR -1)
1000   0  0  1
1001
1002 ({-1, 0, 1} XOR 0)
1003   0  0  1
1004
1005 ({-1, 0, 1} XOR 1)
1006   1  1  0
1007
1008 matrix.sps:20: error: MATRIX: Operands to XOR must have the same dimensions or
1009 one must be a scalar, not 1×2 and 2×1 matrices.
1010 ])
1011 AT_CLEANUP
1012
1013 AT_SETUP([MATRIX - matrix operators])
1014 AT_DATA([matrix.sps], [dnl
1015 MATRIX.
1016 PRINT ({0, 1; 0, 0} * {0, 0; 1, 0}).
1017 PRINT ({0, 0; 1, 0} * {0, 1; 0, 0}).
1018 PRINT ({1, 2, 3; 4, 5, 6} * {7, 8; 9, 10; 11, 12}).
1019 PRINT ({3, 4, 2} * {13, 9, 7, 15; 8, 7, 4, 6; 6, 4, 0, 3}).
1020 COMPUTE m = {0, 1, 0, 0; 1, 0, 1, 0; 0, 1, 0, 1; 0, 0, 1, 0}.
1021 PRINT m**-2.
1022 PRINT m**-1.
1023 PRINT m**0.
1024 PRINT m**1.
1025 PRINT m**2.
1026 PRINT m**3.
1027 PRINT m**5.
1028 PRINT {3, 3.5; 3.2, 3.6}**-1/FORMAT F6.2.
1029
1030 PRINT ({1, 2, 3} * {1, 2}).
1031 PRINT {1, 2, 3}**2.
1032 PRINT m**{1, 2}.
1033 PRINT m**1.5.
1034 END MATRIX.
1035 ])
1036 AT_CHECK([pspp matrix.sps], [1], [dnl
1037 ({0, 1; 0, 0} * {0, 0; 1, 0})
1038   1  0
1039   0  0
1040
1041 ({0, 0; 1, 0} * {0, 1; 0, 0})
1042   0  0
1043   0  1
1044
1045 ({1, 2, 3; 4, 5, 6} * {7, 8; 9, 10; 11, 12})
1046    58   64
1047   139  154
1048
1049 ({3, 4, 2} * {13, 9, 7, 15; 8, 7, 4, 6; 6, 4, 0, 3})
1050   83  63  37  75
1051
1052 m**-2
1053   2  0 -1  0
1054   0  1  0 -1
1055  -1  0  1  0
1056   0 -1  0  2
1057
1058 m**-1
1059   0  1  0 -1
1060   1  0  0  0
1061   0  0  0  1
1062  -1  0  1  0
1063
1064 m**0
1065   1  0  0  0
1066   0  1  0  0
1067   0  0  1  0
1068   0  0  0  1
1069
1070 m**1
1071   0  1  0  0
1072   1  0  1  0
1073   0  1  0  1
1074   0  0  1  0
1075
1076 m**2
1077   1  0  1  0
1078   0  2  0  1
1079   1  0  2  0
1080   0  1  0  1
1081
1082 m**3
1083   0  2  0  1
1084   2  0  3  0
1085   0  3  0  2
1086   1  0  2  0
1087
1088 m**5
1089   0  5  0  3
1090   5  0  8  0
1091   0  8  0  5
1092   3  0  5  0
1093
1094 {3, 3.5; 3.2, 3.6}**-1
1095   -9.00   8.75
1096    8.00  -7.50
1097
1098 matrix.sps:16: error: MATRIX: Matrices with dimensions 1×3 and 1×2 are not
1099 conformable for multiplication.
1100
1101 matrix.sps:17: error: MATRIX: Matrix exponentation with ** requires a square
1102 matrix on the left-hand size, not one with dimensions 1×3.
1103
1104 matrix.sps:18: error: MATRIX: Matrix exponentiation with ** requires a scalar
1105 on the right-hand side, not a matrix with dimensions 1×2.
1106
1107 matrix.sps:19: error: MATRIX: Exponent 1.5 in matrix multiplication is non-
1108 integer or outside the valid range.
1109 ])
1110 AT_CLEANUP
1111
1112 AT_SETUP([MATRIX - sequences and construction])
1113 AT_DATA([matrix.sps], [dnl
1114 MATRIX.
1115 PRINT {1:3:-1}.
1116 PRINT {1:3}.
1117 PRINT {1:10:2}.
1118 PRINT {1:11:2}.
1119
1120 PRINT {-1:-3}.
1121 PRINT {-1:-3:-1}.
1122 PRINT {-1:-10:-2}.
1123 PRINT {-1:-11:-2}.
1124
1125 PRINT {1:1}.
1126 PRINT {1:1:-1}.
1127
1128 PRINT {1:3:0}.
1129 PRINT {-1:-3:0}.
1130
1131 PRINT {1, 2; 3}.
1132 PRINT {{2; 5}, 3}.
1133 END MATRIX.
1134 ])
1135 AT_CHECK([pspp matrix.sps], [1], [dnl
1136 {1:3:-1}
1137
1138 {1:3}
1139   1  2  3
1140
1141 {1:10:2}
1142   1  3  5  7  9
1143
1144 {1:11:2}
1145    1   3   5   7   9  11
1146
1147 {-1:-3}
1148
1149 {-1:-3:-1}
1150  -1 -2 -3
1151
1152 {-1:-10:-2}
1153  -1 -3 -5 -7 -9
1154
1155 {-1:-11:-2}
1156   -1  -3  -5  -7  -9 -11
1157
1158 {1:1}
1159   1
1160
1161 {1:1:-1}
1162   1
1163
1164 matrix.sps:15: error: MATRIX: The increment operand to : must be nonzero.
1165
1166 matrix.sps:16: error: MATRIX: The increment operand to : must be nonzero.
1167
1168 matrix.sps:18: error: MATRIX: All rows in a matrix must have the same number of
1169 columns, but this tries to stack matrices with 2 and 1 columns.
1170
1171 matrix.sps:19: error: MATRIX: All columns in a matrix must have the same number
1172 of rows, but this tries to paste matrices with 2 and 1 rows.
1173 ])
1174 AT_CLEANUP
1175
1176 AT_SETUP([MATRIX - comments])
1177 AT_DATA([matrix.sps], [dnl
1178 MATRIX.
1179 * Comment one.
1180 PRINT (1+2).
1181 COMMENT Comment two.
1182 PRINT (3+4).
1183 END MATRIX.
1184 ])
1185 AT_CHECK([pspp matrix.sps], [0], [dnl
1186 (1+2)
1187   3
1188
1189 (3+4)
1190   7
1191 ])
1192 AT_CLEANUP
1193
1194 AT_SETUP([MATRIX - string matrices])
1195 AT_DATA([matrix.sps], [dnl
1196 MATRIX.
1197 COMPUTE m={'This is', 'a string', 'matrix', 'including', 'some', 'long strings'}.
1198 PRINT m/FORMAT=A8.
1199 END MATRIX.
1200 ])
1201 AT_CHECK([pspp matrix.sps], [0], [dnl
1202 m
1203  This is a string matrix includin some long str
1204 ])
1205 AT_CLEANUP
1206
1207 AT_SETUP([MATRIX - ABS ALL ANY ARSIN ARTAN])
1208 AT_DATA([matrix.sps], [dnl
1209 MATRIX.
1210 PRINT ABS({-1, 0, 1}).
1211
1212 PRINT ALL({0, 0, 0}).
1213 PRINT ALL({-1, 1}).
1214 PRINT ALL({-1, 0, 1}).
1215
1216 PRINT ANY({0, 0, 0}).
1217 PRINT ANY({-1, 1}).
1218 PRINT ANY({-1, 0, 1}).
1219
1220 PRINT ARSIN({-1, 0, 1})/FORMAT=F5.2.
1221
1222 PRINT ARTAN({-5, -1, 0, 1, 5})/FORMAT=F5.2.
1223 END MATRIX.
1224 ])
1225 AT_CHECK([pspp matrix.sps], [0], [dnl
1226 ABS({-1, 0, 1})
1227   1  0  1
1228
1229 ALL({0, 0, 0})
1230  0
1231
1232 ALL({-1, 1})
1233   1
1234
1235 ALL({-1, 0, 1})
1236  0
1237
1238 ANY({0, 0, 0})
1239  0
1240
1241 ANY({-1, 1})
1242   1
1243
1244 ANY({-1, 0, 1})
1245   1
1246
1247 ARSIN({-1, 0, 1})
1248  -1.57   .00  1.57
1249
1250 ARTAN({-5, -1, 0, 1, 5})
1251  -1.37  -.79   .00   .79  1.37
1252 ])
1253 AT_CLEANUP
1254
1255 AT_SETUP([MATRIX - BLOCK CHOL CMAX CMIN COS])
1256 AT_DATA([matrix.sps], [dnl
1257 MATRIX.
1258 PRINT BLOCK({1, 2; 3, 4}, 5, {7; 8; 9}, {10, 11}).
1259
1260 COMPUTE b=CHOL({4, 12, -16; 12, 37, -43; -16, -43, 98}).
1261 PRINT b.
1262 PRINT (T(b)*b).
1263
1264 PRINT CMAX({9, 3, 4; 5, 8, 6; 7, 4, 11}).
1265
1266 PRINT CMIN({9, 3, 4; 5, 8, 6; 7, 4, 11}).
1267
1268 PRINT COS({0.785, 1.57; 3.14, 1.57 + 3.14}) /FORMAT=F5.2.
1269
1270 END MATRIX.
1271 ])
1272 AT_CHECK([pspp matrix.sps], [0], [dnl
1273 BLOCK({1, 2; 3, 4}, 5, {7; 8; 9}, {10, 11})
1274    1   2   0   0   0   0
1275    3   4   0   0   0   0
1276    0   0   5   0   0   0
1277    0   0   0   7   0   0
1278    0   0   0   8   0   0
1279    0   0   0   9   0   0
1280    0   0   0   0  10  11
1281
1282 b
1283   2  6 -8
1284   0  1  5
1285   0  0  3
1286
1287 (T(b)*b)
1288    4  12 -16
1289   12  37 -43
1290  -16 -43  98
1291
1292 CMAX({9, 3, 4; 5, 8, 6; 7, 4, 11})
1293    9   8  11
1294
1295 CMIN({9, 3, 4; 5, 8, 6; 7, 4, 11})
1296   5  3  4
1297
1298 COS({0.785, 1.57; 3.14, 1.57 + 3.14})
1299    .71   .00
1300  -1.00   .00
1301 ])
1302 AT_CLEANUP
1303
1304 AT_SETUP([MATRIX - CSSQ CSUM DESIGN DET DIAG])
1305 AT_DATA([matrix.sps], [dnl
1306 MATRIX.
1307 PRINT CSSQ({1, 2, 3; 4, 5, 6; 7, 8, 9}).
1308 PRINT CSUM({1, 2, 3; 4, 5, 6; 7, 8, 9}).
1309 PRINT DESIGN({1, 2, 0; 2, 1, 0; 3, 0, 1}).
1310 PRINT DESIGN({1, 2, 0; 2, 2, 0; 3, 2, 1}).
1311 PRINT DET({1, 2, 3; 4, 5, 6; 7, 8, 9}) /FORMAT F4.1.
1312 PRINT DIAG({1, 2, 3, 4; 4, 5, 6, 7; 7, 8, 9, 10}).
1313 END MATRIX.
1314 ])
1315 AT_CHECK([pspp matrix.sps], [0], [dnl
1316 CSSQ({1, 2, 3; 4, 5, 6; 7, 8, 9})
1317    66   93  126
1318
1319 CSUM({1, 2, 3; 4, 5, 6; 7, 8, 9})
1320   12  15  18
1321
1322 DESIGN({1, 2, 0; 2, 1, 0; 3, 0, 1})
1323   1  0  0  0  0  1  1  0
1324   0  1  0  0  1  0  1  0
1325   0  0  1  1  0  0  0  1
1326
1327 warning: Column 2 in DESIGN argument has constant value.
1328
1329 DESIGN({1, 2, 0; 2, 2, 0; 3, 2, 1})
1330   1  0  0  1  0
1331   0  1  0  1  0
1332   0  0  1  0  1
1333
1334 DET({1, 2, 3; 4, 5, 6; 7, 8, 9})
1335    .0
1336
1337 DIAG({1, 2, 3, 4; 4, 5, 6, 7; 7, 8, 9, 10})
1338   1
1339   5
1340   9
1341 ])
1342 AT_CLEANUP
1343
1344 AT_SETUP([MATRIX - EVAL EXP GINV GRADE GSCH])
1345 AT_DATA([matrix.sps], [dnl
1346 MATRIX.
1347 PRINT EVAL({2, 0, 0; 0, 3, 4; 0, 4, 9}).
1348
1349 PRINT EXP({2, 3; 4, 5})/FORMAT F5.2.
1350
1351 PRINT GINV({1, 2})/FORMAT F5.2.
1352 COMPUTE a={1, 2, 3; 4, 5, 6; 7, 8, 9}.
1353 COMPUTE g=GINV(a).
1354 PRINT (a*g*a)/FORMAT F5.2.
1355
1356 PRINT GRADE({1, 0, 3; 3, 1, 2; 3, 0, 5}).
1357 COMPUTE x={26, 690, 323, 208, 671, 818, 732, 711, 585, 792}.
1358 COMPUTE asort=x.
1359 COMPUTE asort(GRADE(asort))=asort.
1360 PRINT asort.
1361 COMPUTE dsort=x.
1362 COMPUTE dsort(GRADE(-dsort))=dsort.
1363 PRINT dsort.
1364
1365 PRINT (GSCH({3, 2; 1, 2}) * SQRT(10))/FORMAT F5.2.
1366 PRINT (GSCH({0, 3, 6, 2; 0, 1, 2, 2}) * SQRT(10))/FORMAT F5.2.
1367 PRINT GSCH({0; 0}).
1368 PRINT GSCH({0, 0, 0; 0, 0, 0}).
1369 END MATRIX.
1370 ])
1371 AT_CHECK([pspp matrix.sps], [1], [dnl
1372 EVAL({2, 0, 0; 0, 3, 4; 0, 4, 9})
1373  11.0000000000
1374   2.0000000000
1375   1.0000000000
1376
1377 EXP({2, 3; 4, 5})
1378   7.39 20.09
1379  54.60 148.4
1380
1381 GINV({1, 2})
1382    .20
1383    .40
1384
1385 (a*g*a)
1386   1.00  2.00  3.00
1387   4.00  5.00  6.00
1388   7.00  8.00  9.00
1389
1390 GRADE({1, 0, 3; 3, 1, 2; 3, 0, 5})
1391   3  1  6
1392   7  4  5
1393   8  2  9
1394
1395 asort
1396    26  208  323  585  671  690  711  732  792  818
1397
1398 dsort
1399   818  792  732  711  690  671  585  323  208   26
1400
1401 (GSCH({3, 2; 1, 2}) * SQRT(10))
1402   3.00 -1.00
1403   1.00  3.00
1404
1405 (GSCH({0, 3, 6, 2; 0, 1, 2, 2}) * SQRT(10))
1406   3.00 -1.00
1407   1.00  3.00
1408
1409 matrix.sps:22: error: MATRIX: GSCH requires its argument to have at least as
1410 many columns as rows, but it has dimensions 2×1.
1411
1412 matrix.sps:23: error: MATRIX: 2×3 argument to GSCH contains only 0 linearly
1413 independent columns.
1414 ])
1415 AT_CLEANUP
1416
1417 AT_SETUP([MATRIX - IDENT INV KRONEKER LG10 LN])
1418 AT_DATA([matrix.sps], [dnl
1419 MATRIX.
1420 PRINT IDENT(1).
1421 PRINT IDENT(2).
1422 PRINT IDENT(3,5).
1423 PRINT IDENT(5,3).
1424
1425 PRINT INV({3, 3.5; 3.2, 3.6})/FORMAT F8.2.
1426 PRINT INV({4, 7; 2, 6})/FORMAT F8.2.
1427 PRINT (INV({4, -2, 1; 5, 0, 3; -1, 2, 6})*52)/FORMAT F8.2.
1428
1429 PRINT KRONEKER({1, 2; 3, 4}, {0, 5; 6, 7}).
1430
1431 PRINT LG10({1, 10, 100, 1000}).
1432
1433 PRINT LN({1, 2; 3, 4})/FORMAT F5.2.
1434 PRINT LN(0).
1435 END MATRIX.
1436 ])
1437 AT_CHECK([pspp matrix.sps], [1], [dnl
1438 IDENT(1)
1439   1
1440
1441 IDENT(2)
1442   1  0
1443   0  1
1444
1445 IDENT(3,5)
1446   1  0  0  0  0
1447   0  1  0  0  0
1448   0  0  1  0  0
1449
1450 IDENT(5,3)
1451   1  0  0
1452   0  1  0
1453   0  0  1
1454   0  0  0
1455   0  0  0
1456
1457 INV({3, 3.5; 3.2, 3.6})
1458     -9.00     8.75
1459      8.00    -7.50
1460
1461 INV({4, 7; 2, 6})
1462       .60     -.70
1463      -.20      .40
1464
1465 (INV({4, -2, 1; 5, 0, 3; -1, 2, 6})*52)
1466     -6.00    14.00    -6.00
1467    -33.00    25.00    -7.00
1468     10.00    -6.00    10.00
1469
1470 KRONEKER({1, 2; 3, 4}, {0, 5; 6, 7})
1471    0   5   0  10
1472    6   7  12  14
1473    0  15   0  20
1474   18  21  24  28
1475
1476 LG10({1, 10, 100, 1000})
1477   0  1  2  3
1478
1479 LN({1, 2; 3, 4})
1480    .00   .69
1481   1.10  1.39
1482
1483 error: Argument 1 to matrix function LN has invalid value 0.  This argument
1484 must be greater than 0.
1485 ])
1486 AT_CLEANUP
1487
1488 AT_SETUP([MATRIX - MAGIC])
1489 AT_DATA([matrix.sps], [dnl
1490 MATRIX.
1491
1492 LOOP n=3 to 10.
1493     COMPUTE m=MAGIC(n).
1494     COMPUTE total=n*(n**2 + 1) / 2.
1495     COMPUTE tb={MSUM(DIAG(T(m))), CSUM(m), MSUM(DIAG(m))} - total.
1496     COMPUTE lr=RSUM(m) - total.
1497     PRINT {tb; lr, m, lr; tb}/FORMAT F4.0.
1498 END LOOP.
1499 END MATRIX.
1500 ])
1501 AT_CHECK([pspp matrix.sps], [0], [dnl
1502 {tb; lr, m, lr; tb}
1503     0    0    0    0    0
1504     0    8    1    6    0
1505     0    3    5    7    0
1506     0    4    9    2    0
1507     0    0    0    0    0
1508 {tb; lr, m, lr; tb}
1509     0    0    0    0    0    0
1510     0    1    5   12   16    0
1511     0   15   11    6    2    0
1512     0   14    8    9    3    0
1513     0    4   10    7   13    0
1514     0    0    0    0    0    0
1515 {tb; lr, m, lr; tb}
1516     0    0    0    0    0    0    0
1517     0   17   24    1    8   15    0
1518     0   23    5    7   14   16    0
1519     0    4    6   13   20   22    0
1520     0   10   12   19   21    3    0
1521     0   11   18   25    2    9    0
1522     0    0    0    0    0    0    0
1523 {tb; lr, m, lr; tb}
1524     0    0    0    0    0    0    0    0
1525     0    1    5    9   28   32   36    0
1526     0   35   30   27   10    7    2    0
1527     0   24   14   22   18   17   16    0
1528     0   13   23   15   19   20   21    0
1529     0   34   31   26   11    6    3    0
1530     0    4    8   12   25   29   33    0
1531     0    0    0    0    0    0    0    0
1532 {tb; lr, m, lr; tb}
1533     0    0    0    0    0    0    0    0    0
1534     0   30   39   48    1   10   19   28    0
1535     0   38   47    7    9   18   27   29    0
1536     0   46    6    8   17   26   35   37    0
1537     0    5   14   16   25   34   36   45    0
1538     0   13   15   24   33   42   44    4    0
1539     0   21   23   32   41   43    3   12    0
1540     0   22   31   40   49    2   11   20    0
1541     0    0    0    0    0    0    0    0    0
1542 {tb; lr, m, lr; tb}
1543     0    0    0    0    0    0    0    0    0    0
1544     0    1    9   17   25   40   48   56   64    0
1545     0   63   55   47   39   26   18   10    2    0
1546     0    3   11   19   27   38   46   54   62    0
1547     0   61   53   45   37   28   20   12    4    0
1548     0   60   52   44   32   33   21   13    5    0
1549     0    6   14   22   30   35   43   51   59    0
1550     0   58   50   42   34   31   23   15    7    0
1551     0    8   16   24   36   29   41   49   57    0
1552     0    0    0    0    0    0    0    0    0    0
1553 {tb; lr, m, lr; tb}
1554     0    0    0    0    0    0    0    0    0    0    0
1555     0   47   58   69   80    1   12   23   34   45    0
1556     0   57   68   79    9   11   22   33   44   46    0
1557     0   67   78    8   10   21   32   43   54   56    0
1558     0   77    7   18   20   31   42   53   55   66    0
1559     0    6   17   19   30   41   52   63   65   76    0
1560     0   16   27   29   40   51   62   64   75    5    0
1561     0   26   28   39   50   61   72   74    4   15    0
1562     0   36   38   49   60   71   73    3   14   25    0
1563     0   37   48   59   70   81    2   13   24   35    0
1564     0    0    0    0    0    0    0    0    0    0    0
1565 {tb; lr, m, lr; tb}
1566     0    0    0    0    0    0    0    0    0    0    0    0
1567     0    1    9   17   25   33   68   76   84   92  100    0
1568     0   99   91   83   75   67   34   26   18   10    2    0
1569     0    3   11   19   27   35   66   74   82   90   98    0
1570     0   97   89   81   72   65   36   29   20   12    4    0
1571     0   60   42   58   44   56   50   49   53   47   46    0
1572     0   41   59   43   57   45   51   52   48   54   55    0
1573     0   96   88   80   73   64   37   28   21   13    5    0
1574     0    6   14   22   30   38   63   71   79   87   95    0
1575     0   94   86   78   70   62   39   31   23   15    7    0
1576     0    8   16   24   32   40   61   69   77   85   93    0
1577     0    0    0    0    0    0    0    0    0    0    0    0
1578 ])
1579 AT_CLEANUP
1580
1581 AT_SETUP([MATRIX - MAKE MDIAG MMAX MMIN MOD])
1582 AT_DATA([matrix.sps], [dnl
1583 MATRIX.
1584 PRINT MAKE(1, 2, 3).
1585 PRINT MAKE(2, 1, 4).
1586 PRINT MAKE(2, 3, 5).
1587
1588 PRINT MDIAG({1, 2, 3, 4}).
1589 PRINT MDIAG({1; 2; 3; 4}).
1590 PRINT MDIAG({1, 2; 3, 4}).
1591
1592 PRINT MMAX({55, 44; 66, 11}).
1593
1594 PRINT MMIN({55, 44; 66, 11}).
1595
1596 PRINT MOD({5, 4, 3, 2, 1, 0}, 3).
1597 PRINT MOD({5, 4, 3, 2, 1, 0}, -3).
1598 PRINT MOD({-5, -4, -3, -2, -1, 0}, 3).
1599 PRINT MOD({-5, -4, -3, -2, -1, 0}, -3).
1600 PRINT MOD({5, 4, 3, 2, 1, 0}, 1.5) /FORMAT F5.1.
1601 PRINT MOD({5, 4, 3, 2, 1, 0}, 0).
1602 END MATRIX.
1603 ])
1604 AT_CHECK([pspp matrix.sps], [1], [dnl
1605 MAKE(1, 2, 3)
1606   3  3
1607
1608 MAKE(2, 1, 4)
1609   4
1610   4
1611
1612 MAKE(2, 3, 5)
1613   5  5  5
1614   5  5  5
1615
1616 MDIAG({1, 2, 3, 4})
1617   1  0  0  0
1618   0  2  0  0
1619   0  0  3  0
1620   0  0  0  4
1621
1622 MDIAG({1; 2; 3; 4})
1623   1  0  0  0
1624   0  2  0  0
1625   0  0  3  0
1626   0  0  0  4
1627
1628 matrix.sps:8: error: MATRIX: Function MDIAG argument 1 must be a vector, not a
1629 2×2 matrix.
1630
1631 MMAX({55, 44; 66, 11})
1632   66
1633
1634 MMIN({55, 44; 66, 11})
1635   11
1636
1637 MOD({5, 4, 3, 2, 1, 0}, 3)
1638   2  1  0  2  1  0
1639
1640 MOD({5, 4, 3, 2, 1, 0}, -3)
1641   2  1  0  2  1  0
1642
1643 MOD({-5, -4, -3, -2, -1, 0}, 3)
1644  -2 -1  0 -2 -1  0
1645
1646 MOD({-5, -4, -3, -2, -1, 0}, -3)
1647  -2 -1  0 -2 -1  0
1648
1649 MOD({5, 4, 3, 2, 1, 0}, 1.5)
1650     .5   1.0    .0    .5   1.0    .0
1651
1652 matrix.sps:19: error: MATRIX: Divisor argument to MOD function must be nonzero.
1653 ])
1654 AT_CLEANUP
1655
1656 AT_SETUP([MATRIX - MSSQ MSUM NCOL NROW RANK])
1657 AT_DATA([matrix.sps], [dnl
1658 MATRIX.
1659 PRINT MSSQ({1, 0, 1; -2, -3, 1; 3, 3, 0}).
1660
1661 PRINT MSUM({1, 0, 1; -2, -3, 1; 3, 3, 0}).
1662
1663 PRINT NCOL({1, 0; -2, -3; 3, 3}).
1664
1665 PRINT NROW({1, 0; -2, -3; 3, 3}).
1666
1667 PRINT RANK({1, 0, 1; -2, -3, 1; 3, 3, 0}).
1668 PRINT RANK({1, 1, 0, 2; -1, -1, 0, -2}).
1669 PRINT RANK({1, -1; 1, -1; 0, 0; 2, -2}).
1670 PRINT RANK({1, 2, 1; -2, -3, 1; 3, 5, 0}).
1671 PRINT RANK({1, 0, 2; 2, 1, 0; 3, 2, 1}).
1672 END MATRIX.
1673 ])
1674 AT_CHECK([pspp matrix.sps], [0], [dnl
1675 MSSQ({1, 0, 1; -2, -3, 1; 3, 3, 0})
1676   34
1677
1678 MSUM({1, 0, 1; -2, -3, 1; 3, 3, 0})
1679   4
1680
1681 NCOL({1, 0; -2, -3; 3, 3})
1682   2
1683
1684 NROW({1, 0; -2, -3; 3, 3})
1685   3
1686
1687 RANK({1, 0, 1; -2, -3, 1; 3, 3, 0})
1688   2
1689
1690 RANK({1, 1, 0, 2; -1, -1, 0, -2})
1691   1
1692
1693 RANK({1, -1; 1, -1; 0, 0; 2, -2})
1694   1
1695
1696 RANK({1, 2, 1; -2, -3, 1; 3, 5, 0})
1697   2
1698
1699 RANK({1, 0, 2; 2, 1, 0; 3, 2, 1})
1700   3
1701 ])
1702 AT_CLEANUP
1703
1704 AT_SETUP([MATRIX - RESHAPE RMAX RMIN RND RNKORDER])
1705 AT_DATA([matrix.sps], [dnl
1706 MATRIX.
1707 PRINT RESHAPE(1:12, 1, 12).
1708 PRINT RESHAPE(1:12, 2, 6).
1709 PRINT RESHAPE(1:12, 3, 4).
1710 PRINT RESHAPE(1:12, 4, 3).
1711 PRINT RESHAPE(1:12, 6, 2).
1712 PRINT RESHAPE(1:12, 12, 1).
1713
1714 PRINT RMAX({1, 0, 1; -2, -3, 1; 3, 3, 0}).
1715
1716 PRINT RMIN({1, 0, 1; -2, -3, 1; 3, 3, 0}).
1717
1718 PRINT RND({-1.6, -1.5, -1.4;
1719            -.6, -.5, -.4;
1720            .4, .5, .6;
1721            1.4, 1.5, 1.6})/FORMAT F5.1.
1722
1723 PRINT RNKORDER({1, 0, 3; 3, 1, 2; 3, 0, 5}) /FORMAT F5.1.
1724 END MATRIX.
1725 ])
1726 AT_CHECK([pspp matrix.sps], [0], [dnl
1727 RESHAPE(1:12, 1, 12)
1728    1   2   3   4   5   6   7   8   9  10  11  12
1729
1730 RESHAPE(1:12, 2, 6)
1731    1   2   3   4   5   6
1732    7   8   9  10  11  12
1733
1734 RESHAPE(1:12, 3, 4)
1735    1   2   3   4
1736    5   6   7   8
1737    9  10  11  12
1738
1739 RESHAPE(1:12, 4, 3)
1740    1   2   3
1741    4   5   6
1742    7   8   9
1743   10  11  12
1744
1745 RESHAPE(1:12, 6, 2)
1746    1   2
1747    3   4
1748    5   6
1749    7   8
1750    9  10
1751   11  12
1752
1753 RESHAPE(1:12, 12, 1)
1754    1
1755    2
1756    3
1757    4
1758    5
1759    6
1760    7
1761    8
1762    9
1763   10
1764   11
1765   12
1766
1767 RMAX({1, 0, 1; -2, -3, 1; 3, 3, 0})
1768   1
1769   1
1770   3
1771
1772 RMIN({1, 0, 1; -2, -3, 1; 3, 3, 0})
1773   0
1774  -3
1775   0
1776
1777 RND({-1.6, -1.5, -1.4;
1778            -.6, -.5, -.4;
1779            .4, .5, .6;
1780            1.4, 1.5, 1.6})
1781   -2.0  -2.0  -1.0
1782   -1.0    .0    .0
1783     .0    .0   1.0
1784    1.0   2.0   2.0
1785
1786 RNKORDER({1, 0, 3; 3, 1, 2; 3, 0, 5})
1787    3.5   1.5   7.0
1788    7.0   3.5   5.0
1789    7.0   1.5   9.0
1790 ])
1791 AT_CLEANUP
1792
1793 AT_SETUP([MATRIX - RSSQ RSUM SIN SOLVE SQRT])
1794 AT_DATA([matrix.sps], [dnl
1795 MATRIX.
1796 PRINT RSSQ({1, 2, 3; 4, 5, 6; 7, 8, 9}).
1797 PRINT RSUM({1, 2, 3; 4, 5, 6; 7, 8, 9}).
1798
1799 PRINT SIN({0, .78, 1.57, 2.35, 3.14}) /FORMAT F5.2.
1800
1801 PRINT SOLVE({2, 3; 4, 9}, {6, 2; 15, 5}) /FORMAT=F6.2.
1802 PRINT SOLVE({1, 3, -2; 3, 5, 6; 2, 4, 3}, {5; 7; 8}) /FORMAT=F6.2.
1803 PRINT SOLVE({2, 1, -1; -3, -1, 2; -2, 1, 2}, {8; -11; -3}) /FORMAT=F6.2.
1804 PRINT SOLVE({1, 2; 3, 4}, {1, 2}).
1805
1806 PRINT SQRT({0, 1, 2, 3, 4, 9, 81}) /FORMAT=F5.2.
1807 PRINT SQRT(-1).
1808 END MATRIX.
1809 ])
1810 AT_CHECK([pspp matrix.sps], [1], [dnl
1811 RSSQ({1, 2, 3; 4, 5, 6; 7, 8, 9})
1812    14
1813    77
1814   194
1815
1816 RSUM({1, 2, 3; 4, 5, 6; 7, 8, 9})
1817    6
1818   15
1819   24
1820
1821 SIN({0, .78, 1.57, 2.35, 3.14})
1822    .00   .70  1.00   .71   .00
1823
1824 SOLVE({2, 3; 4, 9}, {6, 2; 15, 5})
1825    1.50    .50
1826    1.00    .33
1827
1828 SOLVE({1, 3, -2; 3, 5, 6; 2, 4, 3}, {5; 7; 8})
1829  -15.00
1830    8.00
1831    2.00
1832
1833 SOLVE({2, 1, -1; -3, -1, 2; -2, 1, 2}, {8; -11; -3})
1834    2.00
1835    3.00
1836   -1.00
1837
1838 matrix.sps:10: error: MATRIX: SOLVE requires its arguments to have the same
1839 number of rows, but the first argument has dimensions 2×2 and the second 1×2.
1840
1841 SQRT({0, 1, 2, 3, 4, 9, 81})
1842    .00  1.00  1.41  1.73  2.00  3.00  9.00
1843
1844 error: Argument 1 to matrix function SQRT has invalid value -1.  This argument
1845 must be greater than or equal to 0.
1846 ])
1847 AT_CLEANUP
1848
1849 AT_SETUP([MATRIX - SSCP SVAL SWEEP TRACE TRANSPOS TRUNC])
1850 AT_DATA([matrix.sps], [dnl
1851 MATRIX.
1852 COMPUTE m={1, 2, 3; 4, 5, 6}
1853 COMPUTE sscp1=SSCP(m).
1854 COMPUTE sscp2=T(m)*m.
1855 PRINT sscp1.
1856 PRINT (sscp1 <> sscp2).
1857
1858 PRINT SVAL({1, 1; 0, 0})/FORMAT F5.2.
1859 PRINT SVAL({1, 0, 1; 0, 1, 1; 0, 0, 0})/FORMAT F5.2.
1860 PRINT SVAL({1, 0, 0, 0, 2; 0, 0, 3, 0, 0; 0, 0, 0, 0, 0; 0, 2, 0, 0, 0})
1861     /FORMAT F5.2.
1862 PRINT SVAL({2, 4; 1, 3; 0, 0; 0, 0})/FORMAT F5.2.
1863
1864 COMPUTE s0 = {6, 12, 0, 12; 12, 28, 0, 25; 0, 0, 6, 2; 12, 25, 2, 28}.
1865 PRINT SWEEP(s0, 1)/FORMAT F5.2.
1866 PRINT SWEEP(SWEEP(s0, 1), 2)/FORMAT F5.2.
1867 PRINT SWEEP(SWEEP(SWEEP(s0, 1), 2), 3)/FORMAT F5.2.
1868
1869 COMPUTE s1 = {6, 12, 0, 12; 12, 0, 0, 25; 0, 0, 6, 2; 12, 25, 2, 28}.
1870 PRINT SWEEP(s1, 2).
1871
1872 COMPUTE s2 = {0, 1, 2; 3, 4, 5; 6, 7, 8}.
1873 PRINT SWEEP(s2, 1).
1874 PRINT SWEEP(s2, 2).
1875 PRINT SWEEP(s2, 3).
1876
1877 PRINT TRACE(s0).
1878
1879 PRINT T(s0).
1880 PRINT TRANSPOS(s0).
1881 PRINT ALL(T(T(s0)) = s0).
1882
1883 PRINT TRUNC(SVAL({2, 4; 1, 3; 0, 0; 0, 0})).
1884 PRINT TRUNC(-SVAL({2, 4; 1, 3; 0, 0; 0, 0})).
1885 END MATRIX.
1886 ])
1887 AT_CHECK([pspp matrix.sps], [0], [dnl
1888 sscp1
1889   17  22  27
1890   22  29  36
1891   27  36  45
1892
1893 (sscp1 <> sscp2)
1894  0 0 0
1895  0 0 0
1896  0 0 0
1897
1898 SVAL({1, 1; 0, 0})
1899   1.41
1900    .00
1901
1902 SVAL({1, 0, 1; 0, 1, 1; 0, 0, 0})
1903   1.73
1904   1.00
1905    .00
1906
1907 SVAL({1, 0, 0, 0, 2; 0, 0, 3, 0, 0; 0, 0, 0, 0, 0; 0, 2, 0, 0, 0})
1908   3.00
1909   2.24
1910   2.00
1911    .00
1912
1913 SVAL({2, 4; 1, 3; 0, 0; 0, 0})
1914   5.46
1915    .37
1916
1917 SWEEP(s0, 1)
1918    .17  2.00   .00  2.00
1919  -2.00  4.00   .00  1.00
1920    .00   .00  6.00  2.00
1921  -2.00  1.00  2.00  4.00
1922
1923 SWEEP(SWEEP(s0, 1), 2)
1924   1.17  -.50   .00  1.50
1925   -.50   .25   .00   .25
1926    .00   .00  6.00  2.00
1927  -1.50  -.25  2.00  3.75
1928
1929 SWEEP(SWEEP(SWEEP(s0, 1), 2), 3)
1930   1.17  -.50   .00  1.50
1931   -.50   .25   .00   .25
1932    .00   .00   .17   .33
1933  -1.50  -.25  -.33  3.08
1934
1935 SWEEP(s1, 2)
1936    6   0   0  12
1937    0   0   0   0
1938    0   0   6   2
1939   12   0   2  28
1940
1941 SWEEP(s2, 1)
1942   0  0  0
1943   0  4  5
1944   0  7  8
1945
1946 SWEEP(s2, 2)
1947   -.7500000000  -.2500000000   .7500000000
1948    .7500000000   .2500000000  1.2500000000
1949    .7500000000 -1.7500000000  -.7500000000
1950
1951 SWEEP(s2, 3)
1952  -1.5000000000  -.7500000000  -.2500000000
1953   -.7500000000  -.3750000000  -.6250000000
1954    .7500000000   .8750000000   .1250000000
1955
1956 TRACE(s0)
1957   68
1958
1959 T(s0)
1960    6  12   0  12
1961   12  28   0  25
1962    0   0   6   2
1963   12  25   2  28
1964
1965 TRANSPOS(s0)
1966    6  12   0  12
1967   12  28   0  25
1968    0   0   6   2
1969   12  25   2  28
1970
1971 ALL(T(T(s0)) = s0)
1972   1
1973
1974 TRUNC(SVAL({2, 4; 1, 3; 0, 0; 0, 0}))
1975   5
1976   0
1977
1978 TRUNC(-SVAL({2, 4; 1, 3; 0, 0; 0, 0}))
1979  -5
1980   0
1981 ])
1982 AT_CLEANUP
1983
1984 AT_SETUP([MATRIX - UNIFORM])
1985 AT_DATA([matrix.sps], [dnl
1986 SET SEED=10.
1987 MATRIX.
1988 PRINT (UNIFORM(4, 5)*10)/FORMAT F5.2.
1989 END MATRIX.
1990 ])
1991 AT_CHECK([pspp matrix.sps], [0], [dnl
1992 (UNIFORM(4, 5)*10)
1993   7.71  2.99   .21  4.95  6.34
1994   4.43  7.49  8.32  4.99  5.83
1995   2.25   .25  1.98  7.09  7.61
1996   2.66  1.69  2.64   .88  1.50
1997 ])
1998 AT_CLEANUP
1999
2000 AT_SETUP([MATRIX - invalid number function arguments])
2001 AT_DATA([matrix.sps], [dnl
2002 MATRIX.
2003 COMPUTE x=ABS().
2004 COMPUTE x=ABS(1,2).
2005 COMPUTE x=KRONEKER(1,2,3).
2006 COMPUTE x=IDENT().
2007 COMPUTE x=IDENT(1,2,3).
2008 COMPUTE x=BLOCK().
2009 END MATRIX.
2010 ])
2011 AT_CHECK([pspp matrix.sps], [1], [dnl
2012 matrix.sps:2: error: COMPUTE: Matrix function ABS requires 1 argument.
2013
2014 matrix.sps:3: error: COMPUTE: Matrix function ABS requires 1 argument.
2015
2016 matrix.sps:4: error: COMPUTE: Matrix function KRONEKER requires 2 arguments.
2017
2018 matrix.sps:5: error: COMPUTE: Matrix function IDENT requires 1 or 2 arguments,
2019 but 0 were provided.
2020
2021 matrix.sps:6: error: COMPUTE: Matrix function IDENT requires 1 or 2 arguments,
2022 but 3 were provided.
2023
2024 matrix.sps:7: error: COMPUTE: Matrix function BLOCK requires at least one
2025 argument.
2026 ])
2027 AT_CLEANUP
2028
2029 AT_SETUP([MATRIX - CALL SETDIAG])
2030 AT_DATA([matrix.sps], [dnl
2031 MATRIX.
2032 COMPUTE x={1, 2, 3; 4, 5, 6; 7, 8, 9}.
2033
2034 COMPUTE x1=x.
2035 CALL SETDIAG(x1, 10).
2036 PRINT x1.
2037
2038 COMPUTE x2=x.
2039 CALL SETDIAG(x2, {10, 11}).
2040 PRINT x2.
2041
2042 COMPUTE x3=x.
2043 CALL SETDIAG(x3, {10, 11, 12}).
2044 PRINT x3.
2045
2046 COMPUTE x4=x.
2047 CALL SETDIAG(x4, {10, 11, 12, 13}).
2048 PRINT x4.
2049
2050 COMPUTE x5=x.
2051 CALL SETDIAG(x5, {10, 11; 12, 13}).
2052 PRINT x5.
2053
2054 END MATRIX.
2055 ])
2056 AT_CHECK([pspp matrix.sps], [1], [dnl
2057 x1
2058   10   2   3
2059    4  10   6
2060    7   8  10
2061
2062 x2
2063   10   2   3
2064    4  11   6
2065    7   8   9
2066
2067 x3
2068   10   2   3
2069    4  11   6
2070    7   8  12
2071
2072 x4
2073   10   2   3
2074    4  11   6
2075    7   8  12
2076
2077 matrix.sps:21: error: MATRIX: SETDIAG argument 2 must be a scalar or a vector,
2078 not a 2×2 matrix.
2079
2080 x5
2081   1  2  3
2082   4  5  6
2083   7  8  9
2084 ])
2085 AT_CLEANUP
2086
2087 dnl I have some doubts about the correctness of the results below.
2088 AT_SETUP([MATRIX - CALL EIGEN])
2089 AT_DATA([matrix.sps], [dnl
2090 MATRIX.
2091 CALL EIGEN({1, 0; 0, 1}, evec, eval).
2092 PRINT evec.
2093 PRINT eval.
2094
2095 CALL EIGEN({3, 2, 4; 2, 0, 2; 4, 2, 3}, evec2, eval2).
2096 PRINT evec2.
2097 PRINT eval2.
2098 END MATRIX.
2099 ])
2100 AT_CHECK([pspp matrix.sps], [0], [dnl
2101 evec
2102   1  0
2103   0  1
2104
2105 eval
2106   1
2107   1
2108
2109 evec2
2110   -.6666666667   .0000000000   .7453559925
2111   -.3333333333  -.8944271910  -.2981423970
2112   -.6666666667   .4472135955  -.5962847940
2113
2114 eval2
2115   8.0000000000
2116  -1.0000000000
2117  -1.0000000000
2118 ])
2119 AT_CLEANUP
2120
2121 AT_SETUP([MATRIX - CALL SVD])
2122 AT_DATA([matrix.sps], [dnl
2123 MATRIX.
2124 CALL SVD({3, 2, 2; 2, 3, -2}, u, s, v).
2125 PRINT (u * s * T(v))/FORMAT F5.1.
2126
2127 CALL SVD({2, 4; 1, 3; 0, 0; 0, 0}, u, s, v).
2128 PRINT (u*s*T(v))/FORMAT F5.1.
2129
2130 CALL SVD({-3, 1; 6, -2; 6, -2}, u, s, v).
2131 PRINT (u*s*T(v))/FORMAT F5.1.
2132 END MATRIX.
2133 ])
2134 AT_CHECK([pspp matrix.sps], [0], [dnl
2135 (u * s * T(v))
2136    3.0   2.0   2.0
2137    2.0   3.0  -2.0
2138
2139 (u*s*T(v))
2140    2.0   4.0
2141    1.0   3.0
2142     .0    .0
2143     .0    .0
2144
2145 (u*s*T(v))
2146   -3.0   1.0
2147    6.0  -2.0
2148    6.0  -2.0
2149 ])
2150 AT_CLEANUP
2151
2152 AT_SETUP([MATRIX - PRINT])
2153 AT_DATA([matrix.sps], [dnl
2154 MATRIX.
2155 PRINT/TITLE="title 1".
2156 PRINT/SPACE=2/TITLE="title 2".
2157
2158 COMPUTE m={1, 2, 3; 3, 4, 5; 6, 7, 8}.
2159 PRINT m/RLABELS=123, a b c, long name.
2160 PRINT m/RNAMES={'123', 'a b c', 'long name'}.
2161 PRINT m/CLABELS=col1, col2, long column name.
2162 PRINT m/CNAMES={'col1', 'col2', 'long column name'}.
2163 PRINT m/RLABELS=123, a b c, long name
2164        /CLABELS=col1, col2, long column name.
2165 PRINT m/RNAMES={'123', 'a b c', 'long name'}
2166        /CNAMES={'col1', 'col2', 'long column name'}.
2167 PRINT {123e10, 456e10, 500}.
2168 END MATRIX.
2169 ])
2170
2171 AT_DATA([matrix-tables.sps], [dnl
2172 SET MDISPLAY=TABLES.
2173 INCLUDE 'matrix.sps'.
2174 ])
2175
2176 AT_CHECK([pspp matrix.sps], [0], [dnl
2177 title 1
2178
2179
2180
2181 title 2
2182
2183 m
2184 123       1  2  3
2185 a b c     3  4  5
2186 long nam  6  7  8
2187
2188 m
2189 123       1  2  3
2190 a b c     3  4  5
2191 long nam  6  7  8
2192
2193 m
2194      col1     col2 long col
2195         1        2        3
2196         3        4        5
2197         6        7        8
2198
2199 m
2200      col1     col2 long col
2201         1        2        3
2202         3        4        5
2203         6        7        8
2204
2205 m
2206              col1     col2 long col
2207 123             1        2        3
2208 a b c           3        4        5
2209 long nam        6        7        8
2210
2211 m
2212              col1     col2 long col
2213 123             1        2        3
2214 a b c           3        4        5
2215 long nam        6        7        8
2216
2217 {123e10, 456e10, 500}
2218   10 ** 12   X
2219   1.2300000000  4.5600000000   .0000000005
2220 ])
2221
2222 AT_CHECK([pspp matrix-tables.sps], [0], [dnl
2223 title 1
2224
2225
2226
2227 title 2
2228
2229         m
2230 +---------+-----+
2231 |123      |1 2 3|
2232 |a b c    |3 4 5|
2233 |long name|6 7 8|
2234 +---------+-----+
2235
2236         m
2237 +--------+-----+
2238 |123     |1 2 3|
2239 |a b c   |3 4 5|
2240 |long nam|6 7 8|
2241 +--------+-----+
2242
2243               m
2244 +----+----+----------------+
2245 |col1|col2|long column name|
2246 +----+----+----------------+
2247 |   1|   2|               3|
2248 |   3|   4|               5|
2249 |   6|   7|               8|
2250 +----+----+----------------+
2251
2252           m
2253 +----+----+--------+
2254 |col1|col2|long col|
2255 +----+----+--------+
2256 |   1|   2|       3|
2257 |   3|   4|       5|
2258 |   6|   7|       8|
2259 +----+----+--------+
2260
2261                    m
2262 +---------+----+----+----------------+
2263 |         |col1|col2|long column name|
2264 +---------+----+----+----------------+
2265 |123      |   1|   2|               3|
2266 |a b c    |   3|   4|               5|
2267 |long name|   6|   7|               8|
2268 +---------+----+----+----------------+
2269
2270               m
2271 +--------+----+----+--------+
2272 |        |col1|col2|long col|
2273 +--------+----+----+--------+
2274 |123     |   1|   2|       3|
2275 |a b c   |   3|   4|       5|
2276 |long nam|   6|   7|       8|
2277 +--------+----+----+--------+
2278
2279               {123e10, 456e10, 500}
2280 +----------------------------------------------+
2281 |1.2300000000[[a]] 4.5600000000[[a]] .0000000005[[a]]|
2282 +----------------------------------------------+
2283 a. × 10**12
2284 ])
2285 AT_CLEANUP
2286
2287 AT_SETUP([MATRIX - DO IF])
2288 AT_DATA([matrix.sps], [dnl
2289 MATRIX.
2290 DO IF 1.
2291 PRINT/TITLE '1'.
2292 END IF.
2293
2294 DO IF 0.
2295 PRINT/TITLE '2'.
2296 ELSE IF 1.
2297 PRINT/TITLE '3'.
2298 END IF.
2299
2300 DO IF -1.
2301 PRINT/TITLE '4'.
2302 ELSE IF 0.
2303 PRINT/TITLE '5'.
2304 ELSE.
2305 PRINT/TITLE '6'.
2306 END IF.
2307
2308 DO IF {1, 2}.
2309 END IF.
2310
2311 DO IF 0.
2312 ELSE IF {}.
2313 END IF.
2314 END MATRIX.
2315 ])
2316 AT_CHECK([pspp matrix.sps], [1], [dnl
2317 1
2318
2319 3
2320
2321 6
2322
2323 matrix.sps:21: error: MATRIX: Expression for DO IF must evaluate to scalar, not
2324 a 1×2 matrix.
2325
2326 matrix.sps:25: error: MATRIX: Expression for ELSE IF must evaluate to scalar,
2327 not a 0×0 matrix.
2328 ])
2329 AT_CLEANUP
2330
2331 AT_SETUP([MATRIX - unbounded LOOP])
2332 AT_DATA([matrix.sps], [dnl
2333 MATRIX.
2334 * Truly unbounded loop.
2335 COMPUTE x=0.
2336 COMPUTE y={}.
2337 LOOP.
2338 COMPUTE x=x+1.
2339 COMPUTE y={y, x}.
2340 END LOOP.
2341 PRINT x.
2342 PRINT y.
2343
2344 * Unbounded loop terminates with BREAK.
2345 COMPUTE x=0.
2346 COMPUTE y={}.
2347 LOOP.
2348 COMPUTE x=x+1.
2349 COMPUTE y={y, x}.
2350 DO IF x >= 20.
2351     BREAK.
2352 END IF.
2353 END LOOP.
2354 PRINT x.
2355 PRINT y.
2356
2357 END MATRIX.
2358 ])
2359 AT_CHECK([pspp matrix.sps], [0], [dnl
2360 x
2361   40
2362
2363 y
2364    1   2   3   4   5   6   7   8   9  10  11  12  13  14  15  16  17  18  19
2365 20  21  22  23  24  25  26  27  28  29  30  31  32  33  34  35  36  37  38  39
2366 40
2367
2368 x
2369   20
2370
2371 y
2372    1   2   3   4   5   6   7   8   9  10  11  12  13  14  15  16  17  18  19
2373 20
2374 ])
2375 AT_CLEANUP
2376
2377 AT_SETUP([MATRIX - indexed or conditional LOOP])
2378 AT_DATA([matrix.sps], [dnl
2379 MATRIX.
2380 * Indexed loop terminates based on index.
2381 COMPUTE y={}.
2382 LOOP x=1 TO 20.
2383 COMPUTE y={y, x}.
2384 END LOOP.
2385 PRINT x.
2386 PRINT y.
2387
2388 * Indexed loop terminates based on MXLOOPS.
2389 COMPUTE y={}.
2390 LOOP x=1 TO 50.
2391 COMPUTE y={y, x}.
2392 END LOOP.
2393 PRINT x.
2394 PRINT y.
2395
2396 * Indexed loop terminates with BREAK.
2397 COMPUTE y={}.
2398 LOOP x=1 TO 50.
2399 COMPUTE y={y, x}.
2400 DO IF x >= 20.
2401     BREAK.
2402 END IF.
2403 END LOOP.
2404 PRINT x.
2405 PRINT y.
2406
2407 * Indexed loop terminates with top IF.
2408 COMPUTE y={}.
2409 LOOP x=1 TO 50 IF NCOL(y) < 15.
2410 COMPUTE y={y, x}.
2411 END LOOP.
2412 PRINT x.
2413 PRINT y.
2414
2415 * Indexed loop terminates with bottom IF.
2416 COMPUTE y={}.
2417 LOOP x=1 TO 50.
2418 COMPUTE y={y, x}.
2419 END LOOP IF NCOL(y) >= 22.
2420 PRINT x.
2421 PRINT y.
2422
2423 * Index behavior.
2424 COMPUTE indexing={
2425     1, 10, 1;
2426     1, 10, 2;
2427     1, 10, 3;
2428     1, 10, -1;
2429     1, 10, 0;
2430     10, 1, -1;
2431     10, 1, -2;
2432     10, 1, -3;
2433     10, 1, 1;
2434     10, 1, 0
2435 }.
2436 LOOP i=1 TO NROW(indexing).
2437     COMPUTE y={}.
2438     LOOP j=indexing(i, 1) TO indexing(i, 2) BY indexing(i, 3).
2439         COMPUTE y={y, j}.
2440     END LOOP.
2441     PRINT {indexing(i, :), y}.
2442 END LOOP.
2443
2444 LOOP i={} TO 5.
2445 END LOOP.
2446
2447 LOOP i=5 TO {}.
2448 END LOOP.
2449
2450 LOOP i=5 TO 8 BY {}.
2451 END LOOP.
2452
2453 LOOP IF {}.
2454 END LOOP.
2455
2456 LOOP.
2457 END LOOP IF {}.
2458
2459 LOOP i=1e100 to 1e200.
2460 END LOOP.
2461 END MATRIX.
2462 ])
2463 AT_CHECK([pspp matrix.sps], [1], [dnl
2464 x
2465   20
2466
2467 y
2468    1   2   3   4   5   6   7   8   9  10  11  12  13  14  15  16  17  18  19
2469 20
2470
2471 x
2472   40
2473
2474 y
2475    1   2   3   4   5   6   7   8   9  10  11  12  13  14  15  16  17  18  19
2476 20  21  22  23  24  25  26  27  28  29  30  31  32  33  34  35  36  37  38  39
2477 40
2478
2479 x
2480   20
2481
2482 y
2483    1   2   3   4   5   6   7   8   9  10  11  12  13  14  15  16  17  18  19
2484 20
2485
2486 x
2487   16
2488
2489 y
2490    1   2   3   4   5   6   7   8   9  10  11  12  13  14  15
2491
2492 x
2493   22
2494
2495 y
2496    1   2   3   4   5   6   7   8   9  10  11  12  13  14  15  16  17  18  19
2497 20  21  22
2498
2499 {indexing(i, :), y}
2500    1  10   1   1   2   3   4   5   6   7   8   9  10
2501 {indexing(i, :), y}
2502    1  10   2   1   3   5   7   9
2503 {indexing(i, :), y}
2504    1  10   3   1   4   7  10
2505 {indexing(i, :), y}
2506    1  10  -1
2507 {indexing(i, :), y}
2508    1  10   0
2509 {indexing(i, :), y}
2510   10   1  -1  10   9   8   7   6   5   4   3   2   1
2511 {indexing(i, :), y}
2512   10   1  -2  10   8   6   4   2
2513 {indexing(i, :), y}
2514   10   1  -3  10   7   4   1
2515 {indexing(i, :), y}
2516   10   1   1
2517 {indexing(i, :), y}
2518   10   1   0
2519
2520 matrix.sps:67: error: MATRIX: Expression for LOOP must evaluate to scalar, not
2521 a 0×0 matrix.
2522
2523 matrix.sps:70: error: MATRIX: Expression for TO must evaluate to scalar, not a
2524 0×0 matrix.
2525
2526 matrix.sps:73: error: MATRIX: Expression for BY must evaluate to scalar, not a
2527 0×0 matrix.
2528
2529 matrix.sps:76: error: MATRIX: Expression for LOOP IF must evaluate to scalar,
2530 not a 0×0 matrix.
2531
2532 matrix.sps:79: error: MATRIX: Expression for END LOOP IF must evaluate to
2533 scalar, not a 0×0 matrix.
2534
2535 matrix.sps:82: error: MATRIX: Expression for LOOP is outside the integer range.
2536 ])
2537 AT_CLEANUP
2538
2539 AT_SETUP([MATRIX - BREAK outside LOOP])
2540 AT_DATA([matrix.sps], [dnl
2541 MATRIX.
2542 BREAK.
2543 END MATRIX.
2544 ])
2545 AT_CHECK([pspp matrix.sps], [1], [dnl
2546 matrix.sps:2: error: BREAK: BREAK not inside LOOP.
2547 ])
2548 AT_CLEANUP
2549
2550 AT_SETUP([MATRIX - READ])
2551 AT_DATA([matrix.txt], [dnl
2552 9
2553 8
2554 7
2555 6
2556 1 2 3
2557 4 5 6
2558 7 8 9
2559 10 11 12,13
2560 14, 15 ,16 , 17
2561 18
2562 19
2563 20 21 22 23
2564     12        34
2565 5    6
2566     78        89
2567 10   11
2568 $1 $2 3
2569 4 $5 6
2570 $1   $2   $3   4
2571    $5$6      $78
2572 1% 2% 3% 4
2573   56%  7%8
2574 abcdefghijkl
2575 ABCDEFGHIJKL
2576 ])
2577 AT_DATA([matrix2.txt], [dnl
2578 2, 3, 5, 7
2579 11, 13, 17, 19
2580 23, 29, 31, 37
2581 41, 43, 47, 53
2582 ])
2583 AT_DATA([matrix3.txt], [dnl
2584 1 5
2585 3 1 2 3
2586 5 6 -1 2 5 1
2587 2 8 9
2588 3 1 3 2
2589 ])
2590 AT_DATA([matrix.sps], [dnl
2591 MATRIX.
2592 READ x/FILE='matrix.txt'/SIZE=4/FIELD=1 TO 1.
2593 PRINT x.
2594 READ x/FILE='matrix.txt'/SIZE={3,3}/FIELD=1 TO 80.
2595 PRINT x.
2596 READ x/SIZE={2,4}/FIELD=1 TO 80.
2597 PRINT x.
2598 READ x(:,2)/FILE='matrix.txt'/FIELD=1 TO 80.
2599 PRINT x.
2600 READ x(1,:)/SIZE={1,4}/FIELD=1 TO 80.
2601 PRINT x.
2602
2603 READ x/SIZE={2,6}/FIELD=1 TO 20 BY 5.
2604 PRINT x.
2605 READ x/SIZE={2,3}/FIELD=1 TO 20/FORMAT=DOLLAR.
2606 PRINT x.
2607 READ x/SIZE={2,4}/FIELD=1 TO 20/FORMAT=DOLLAR5.1.
2608 PRINT x.
2609 READ x/SIZE={2,4}/FIELD=1 TO 12/FORMAT='4PCT'.
2610 PRINT x.
2611 READ x/SIZE={2,4}/FIELD=1 TO 12/FORMAT='4A'.
2612 PRINT x/FORMAT=A3.
2613
2614 COMPUTE y={}.
2615 LOOP IF NOT EOF('matrix2.txt').
2616 READ x/FILE='matrix2.txt'/SIZE={1,4}/FIELD=1 TO 80.
2617 COMPUTE y={y; x}.
2618 END LOOP.
2619 PRINT y.
2620
2621 COMPUTE m = MAKE(5, 5, 0).
2622 LOOP i = 1 TO 5.
2623 READ count /FILE='matrix3.txt' /FIELD=1 TO 1 /SIZE=1.
2624 READ m(i, 1:count) /FIELD=3 TO 100 /REREAD.
2625 END LOOP.
2626 PRINT m.
2627 END MATRIX.
2628 ])
2629 AT_CHECK([pspp matrix.sps], [0], [dnl
2630 x
2631   9
2632   8
2633   7
2634   6
2635
2636 x
2637   1  2  3
2638   4  5  6
2639   7  8  9
2640
2641 x
2642   10  11  12  13
2643   14  15  16  17
2644
2645 x
2646   10  18  12  13
2647   14  19  16  17
2648
2649 x
2650   20  21  22  23
2651   14  19  16  17
2652
2653 x
2654    1   2   3   4   5   6
2655    7   8   8   9  10  11
2656
2657 x
2658   1  2  3
2659   4  5  6
2660
2661 x
2662   1  2  3  4
2663   5  6  7  8
2664
2665 x
2666   1  2  3  4
2667   5  6  7  8
2668
2669 x
2670  abc def ghi jkl
2671  ABC DEF GHI JKL
2672
2673 y
2674    2   3   5   7
2675   11  13  17  19
2676   23  29  31  37
2677   41  43  47  53
2678
2679 m
2680   5  0  0  0  0
2681   1  2  3  0  0
2682   6 -1  2  5  1
2683   8  9  0  0  0
2684   1  3  2  0  0
2685 ])
2686 AT_CLEANUP
2687
2688 AT_SETUP([MATRIX - READ - negative])
2689 AT_DATA([matrix.sps], [dnl
2690 MATRIX.
2691 READ !.
2692 READ x/FILE=!.
2693 READ x/ENCODING=!.
2694 READ x/FIELD=!.
2695 READ x/FIELD=1 !.
2696 READ x/FIELD=1 TO !.
2697 READ x/FIELD=1 TO 0.
2698 READ x/FIELD=1 TO 10 BY !.
2699 READ x/FIELD=1 TO 10 BY 6.
2700 READ x/SIZE=!.
2701 READ x/MODE=!.
2702 READ x/FORMAT=!.
2703 READ x/FORMAT=F8.2/FORMAT=F8.2.
2704 READ x/FORMAT='5XYZZY'.
2705 READ x/FORMAT=XYZZY.
2706 READ x/!.
2707 READ x.
2708 READ x/FIELD=1 TO 10.
2709 READ x/FIELD=1 TO 10/SIZE={1,2}.
2710 READ x/FIELD=1 TO 10/SIZE={1,2}/FILE='xyzzy.txt'/FORMAT='15F'.
2711 READ x/FIELD=1 TO 10 BY 2/SIZE={1,2}/FILE='xyzzy.txt'/FORMAT=F5.
2712 READ x/FIELD=1 TO 10 BY 2/SIZE={1,2}/FILE='xyzzy.txt'/FORMAT='2F'.
2713 READ x/FIELD=1 TO 10/SIZE={1,2;3,4}/FILE='matrix.txt'.
2714 READ x/FIELD=1 TO 10/SIZE={1,2,3}/FILE='matrix.txt'.
2715 READ x/FIELD=1 TO 10/SIZE={-1}/FILE='matrix.txt'.
2716 COMPUTE x={1,2,3}.
2717 READ x(:,:)/FIELD=1 TO 10/SIZE={2,2}/FILE='matrix.txt'.
2718 READ x/FIELD=1 TO 10/SIZE={1,3}/FILE='matrix.txt'/MODE=SYMMETRIC.
2719 READ x/FIELD=1 TO 10/SIZE=2/FILE='matrix.txt'.
2720 END MATRIX.
2721 ])
2722 AT_DATA([matrix.txt], [dnl
2723 xyzzy
2724 .
2725 ])
2726 AT_CHECK([pspp matrix.sps], [1], [dnl
2727 matrix.sps:2.6: error: READ: Syntax error at `!': expecting identifier.
2728
2729 matrix.sps:3.13: error: READ: Syntax error at `!': expecting a file name or
2730 handle name.
2731
2732 matrix.sps:4.17: error: READ: Syntax error at `!': expecting string.
2733
2734 matrix.sps:5.14: error: READ: Syntax error at `!': Expected positive integer
2735 for FIELD.
2736
2737 matrix.sps:6.16: error: READ: Syntax error at `!': expecting `TO'.
2738
2739 matrix.sps:7.19: error: READ: Syntax error at `!': Expected positive integer
2740 for TO.
2741
2742 matrix.sps:8.19: error: READ: Syntax error at `0': Expected positive integer
2743 for TO.
2744
2745 matrix.sps:9.25: error: READ: Syntax error at `!': Expected integer between 1
2746 and 10 for BY.
2747
2748 matrix.sps:10: error: READ: BY 6 does not evenly divide record width 10.
2749
2750 matrix.sps:11.13: error: READ: Syntax error at `!'.
2751
2752 matrix.sps:12.13: error: READ: Syntax error at `!': expecting RECTANGULAR or
2753 SYMMETRIC.
2754
2755 matrix.sps:13.15: error: READ: Syntax error at `!': expecting identifier.
2756
2757 matrix.sps:14: error: READ: Subcommand FORMAT may only be specified once.
2758
2759 matrix.sps:15.15-15.22: error: READ: Syntax error at `'5XYZZY'': Unknown format
2760 XYZZY.
2761
2762 matrix.sps:16: error: READ: Unknown format type `XYZZY'.
2763
2764 matrix.sps:17.8: error: READ: Syntax error at `!': expecting FILE, FIELD, MODE,
2765 REREAD, or FORMAT.
2766
2767 matrix.sps:18: error: READ: Required subcommand FIELD was not specified.
2768
2769 matrix.sps:19: error: READ: SIZE is required for reading data into a full
2770 matrix (as opposed to a submatrix).
2771
2772 matrix.sps:20: error: READ: Required subcommand FILE was not specified.
2773
2774 matrix.sps:21: error: READ: 15 repetitions cannot fit in record width 10.
2775
2776 matrix.sps:22: error: READ: FORMAT specifies field width 5 but BY specifies 2.
2777
2778 matrix.sps:23: error: READ: FORMAT specifies 2 repetitions with record width
2779 10, which implies field width 5, but BY specifies field width 2.
2780
2781 matrix.sps:24: error: MATRIX: SIZE must evaluate to a scalar or a 2-element
2782 vector, not a 2×2 matrix.
2783
2784 matrix.sps:25: error: MATRIX: SIZE must evaluate to a scalar or a 2-element
2785 vector, not a 1×3 matrix.
2786
2787 matrix.sps:26: error: MATRIX: Matrix dimensions -1×1 specified on SIZE are
2788 outside valid range.
2789
2790 matrix.sps:28: error: MATRIX: Matrix dimensions 2×2 specified on SIZE differ
2791 from submatrix dimensions 1×3.
2792
2793 matrix.sps:29: error: MATRIX: Cannot read non-square 1×3 matrix using READ with
2794 MODE=SYMMETRIC.
2795
2796 matrix.txt:1.1-1.4: warning: Error reading "xyzzy" as format F for matrix row
2797 1, column 1: Field contents are not numeric.
2798
2799 matrix.txt:2.1: warning: Error reading "." as format F for matrix row 2, column
2800 1: Matrix data may not contain missing value.
2801 ])
2802 AT_CLEANUP
2803
2804 AT_SETUP([MATRIX - WRITE])
2805 AT_DATA([matrix.sps], [dnl
2806 MATRIX.
2807 WRITE {1.5, 2; 3, 4.12345}/OUTFILE='matrix.txt'/FIELD=1 TO 80.
2808 WRITE {1.5, 2; 3, 4.12345}/OUTFILE='matrix.txt'/FIELD=1 TO 5.
2809 WRITE {1, 2; 3, 4}/OUTFILE='matrix.txt'/FIELD=1 TO 80 BY 5.
2810 WRITE {1, 2; 3, 4}/OUTFILE='matrix.txt'/FIELD=1 TO 80/FORMAT=F8.2.
2811 WRITE {1, 2; 3, 4}/OUTFILE='matrix.txt'/FIELD=1 TO 80/FORMAT=E.
2812 WRITE {1, 2; 3, 4}/OUTFILE='matrix.txt'/FIELD=1 TO 10 BY 10/FORMAT=E.
2813 WRITE "abcdefhi"/OUTFILE='matrix.txt'/FIELD=1 TO 80/FORMAT=A8.
2814 WRITE "abcdefhi"/OUTFILE='matrix.txt'/FIELD=1 TO 80/FORMAT=A4.
2815 WRITE "abcdefhi"/OUTFILE='matrix.txt'/FIELD=1 TO 80/FORMAT=AHEX12.
2816 END MATRIX.
2817 ])
2818 AT_CHECK([pspp matrix.sps])
2819 AT_CHECK([cat matrix.txt], [0], [dnl
2820  1.5 2
2821  3 4.12345
2822  1.5 2
2823  3
2824  4.12345
2825      1    2
2826      3    4
2827      1.00    2.00
2828      3.00    4.00
2829  1 2
2830  3 4
2831     1.E+000
2832     2.E+000
2833     3.E+000
2834     4.E+000
2835  abcdefhi
2836  abcd
2837  616263646566
2838 ])
2839 AT_CLEANUP
2840
2841 AT_SETUP([MATRIX - WRITE - negative])
2842 AT_DATA([matrix.sps], [dnl
2843 MATRIX.
2844 WRITE !.
2845 WRITE 1/OUTFILE=!.
2846 WRITE 1/ENCODING=!.
2847 WRITE 1/FIELD=!.
2848 WRITE 1/FIELD=1 !.
2849 WRITE 1/FIELD=1 TO 0.
2850 WRITE 1/FIELD=1 TO 10 BY 20.
2851 WRITE 1/FIELD=1 TO 10 BY 6.
2852 WRITE 1/MODE=TRAPEZOIDAL.
2853 WRITE 1/FORMAT=F5/FORMAT=F5.
2854 WRITE 1/FORMAT='5ASDF'.
2855 WRITE 1/FORMAT=ASDF5.
2856 WRITE 1/!.
2857 WRITE 1.
2858 WRITE 1/FIELD=1 TO 10.
2859 WRITE 1/FIELD=1 TO 10/OUTFILE='matrix.txt'/FORMAT='15F'.
2860 WRITE 1/FIELD=1 TO 10 BY 5/OUTFILE='matrix.txt'/FORMAT='5F'.
2861 WRITE 1/FIELD=1 TO 10 BY 5/OUTFILE='matrix.txt'/FORMAT=E.
2862 WRITE 1/FIELD=1 TO 10/OUTFILE='matrix.txt'/FORMAT=A9.
2863 WRITE {1,2}/FIELD=1 TO 10/OUTFILE='matrix.txt'/MODE=TRIANGULAR.
2864 END MATRIX.
2865 ])
2866 AT_CHECK([pspp matrix.sps], [1], [dnl
2867 matrix.sps:2.7: error: WRITE: Syntax error at `!'.
2868
2869 matrix.sps:3.17: error: WRITE: Syntax error at `!': expecting a file name or
2870 handle name.
2871
2872 matrix.sps:4.18: error: WRITE: Syntax error at `!': expecting string.
2873
2874 matrix.sps:5.15: error: WRITE: Syntax error at `!': Expected positive integer
2875 for FIELD.
2876
2877 matrix.sps:6.17: error: WRITE: Syntax error at `!': expecting `TO'.
2878
2879 matrix.sps:7.20: error: WRITE: Syntax error at `0': Expected positive integer
2880 for TO.
2881
2882 matrix.sps:8.26-8.27: error: WRITE: Syntax error at `20': Expected integer
2883 between 1 and 10 for BY.
2884
2885 matrix.sps:9: error: WRITE: BY 6 does not evenly divide record width 10.
2886
2887 matrix.sps:10.14-10.24: error: WRITE: Syntax error at `TRAPEZOIDAL': expecting
2888 RECTANGULAR or TRIANGULAR.
2889
2890 matrix.sps:11: error: WRITE: Subcommand FORMAT may only be specified once.
2891
2892 matrix.sps:12.16-12.22: error: WRITE: Syntax error at `'5ASDF'': Unknown format
2893 ASDF.
2894
2895 matrix.sps:13: error: WRITE: Unknown format type `ASDF'.
2896
2897 matrix.sps:14.9: error: WRITE: Syntax error at `!': expecting OUTFILE, FIELD,
2898 MODE, HOLD, or FORMAT.
2899
2900 matrix.sps:15: error: WRITE: Required subcommand FIELD was not specified.
2901
2902 matrix.sps:16: error: WRITE: Required subcommand OUTFILE was not specified.
2903
2904 matrix.sps:17: error: WRITE: 15 repetitions cannot fit in record width 10.
2905
2906 matrix.sps:18: error: WRITE: FORMAT specifies 5 repetitions with record width
2907 10, which implies field width 2, but BY specifies field width 5.
2908
2909 matrix.sps:19: error: WRITE: Output format E5.0 specifies width 5, but E
2910 requires a width between 6 and 40.
2911
2912 matrix.sps:20: error: WRITE: Format A9 is too wide for 8-byte matrix eleemnts.
2913
2914 matrix.sps:21: error: MATRIX: WRITE with MODE=TRIANGULAR requires a square
2915 matrix but the matrix to be written has dimensions 1×2.
2916 ])
2917 AT_CLEANUP
2918
2919 AT_SETUP([MATRIX - GET])
2920 AT_DATA([matrix.sps], [dnl
2921 DATA LIST LIST NOTABLE /a b c.
2922 MISSING VALUES a(1) b(5).
2923 BEGIN DATA.
2924 0 0 0
2925 1 2 3
2926 4 5 6
2927 7 8 .
2928 END DATA.
2929
2930 MATRIX.
2931 GET x0 /NAMES=names0.
2932 PRINT x0.
2933 PRINT names0/FORMAT=A8.
2934 END MATRIX.
2935
2936 MATRIX.
2937 GET x1 /VARIABLES=a b c /NAMES=names1 /MISSING=OMIT.
2938 PRINT x1.
2939 PRINT names1/FORMAT=A8.
2940 END MATRIX.
2941
2942 MATRIX.
2943 GET x2 /VARIABLES=a b /NAMES=names2 /MISSING=OMIT.
2944 PRINT x2.
2945 PRINT names2/FORMAT=A8.
2946 END MATRIX.
2947
2948 MATRIX.
2949 GET x3 /FILE=* /VARIABLES=a b c /NAMES=names3 /MISSING=5.
2950 PRINT x3.
2951 PRINT names3/FORMAT=A8.
2952 END MATRIX.
2953
2954 MATRIX.
2955 GET x4 /FILE=* /VARIABLES=a b /NAMES=names4 /MISSING=5.
2956 PRINT x4.
2957 PRINT names4/FORMAT=A8.
2958 END MATRIX.
2959
2960 SAVE OUTFILE='matrix.sav'.
2961 NEW FILE.
2962
2963 MATRIX.
2964 GET x5 /FILE='matrix.sav' /VARIABLES=a b c /NAMES=names5 /MISSING=ACCEPT.
2965 PRINT x5.
2966 PRINT names5/FORMAT=A8.
2967 END MATRIX.
2968
2969 MATRIX.
2970 GET x6 /FILE='matrix.sav' /VARIABLES=a b c /NAMES=names6 /MISSING=ACCEPT /SYSMIS=9.
2971 PRINT x6.
2972 PRINT names6/FORMAT=A8.
2973 END MATRIX.
2974
2975 MATRIX.
2976 GET x7 /FILE='matrix.sav' /VARIABLES=a b c /NAMES=names7 /MISSING=ACCEPT /SYSMIS=OMIT.
2977 PRINT x7.
2978 PRINT names7/FORMAT=A8.
2979 END MATRIX.
2980 ])
2981 AT_CHECK([pspp matrix.sps], [1], [dnl
2982 matrix.sps:11: error: MATRIX: GET: Variable a in case 2 has user-missing value
2983 1.
2984
2985 matrix.sps:12: error: MATRIX: Uninitialized variable x0 used in expression.
2986
2987 names0
2988  a
2989  b
2990  c
2991
2992 matrix.sps:17: error: MATRIX: GET: Variable c in case 4 is system-missing.
2993
2994 matrix.sps:18: error: MATRIX: Uninitialized variable x1 used in expression.
2995
2996 names1
2997  a
2998  b
2999  c
3000
3001 x2
3002   0  0
3003   7  8
3004
3005 names2
3006  a
3007  b
3008
3009 matrix.sps:29: error: MATRIX: GET: Variable c in case 4 is system-missing.
3010
3011 matrix.sps:30: error: MATRIX: Uninitialized variable x3 used in expression.
3012
3013 names3
3014  a
3015  b
3016  c
3017
3018 x4
3019   0  0
3020   5  2
3021   4  5
3022   7  8
3023
3024 names4
3025  a
3026  b
3027
3028 matrix.sps:44: error: MATRIX: GET: Variable c in case 4 is system-missing.
3029
3030 matrix.sps:45: error: MATRIX: Uninitialized variable x5 used in expression.
3031
3032 names5
3033  a
3034  b
3035  c
3036
3037 x6
3038   0  0  0
3039   1  2  3
3040   4  5  6
3041   7  8  9
3042
3043 names6
3044  a
3045  b
3046  c
3047
3048 x7
3049   0  0  0
3050   1  2  3
3051   4  5  6
3052
3053 names7
3054  a
3055  b
3056  c
3057 ])
3058 AT_CLEANUP
3059
3060 AT_SETUP([MATRIX - GET - negative])
3061 AT_DATA([matrix.sps], [dnl
3062 DATA LIST LIST NOTABLE /a b c * d(a1).
3063 MISSING VALUES a(1) b(5).
3064 BEGIN DATA.
3065 0 0 0 a
3066 1 2 3 b
3067 4 5 6 b
3068 7 8 . d
3069 END DATA.
3070 SAVE OUTFILE='matrix.sav'.
3071
3072 MATRIX.
3073 GET !.
3074 GET x/VARIABLES=!.
3075 GET x/FILE=!.
3076 GET x/ENCODING=!.
3077 GET x/NAMES=!.
3078 GET x/MISSING=!.
3079 GET x/SYSMIS=!.
3080 GET x/!.
3081 GET x/VARIABLES=!.
3082 GET x/VARIABLES=x TO !.
3083 GET x/VARIABLES=x.
3084 GET x/VARIABLES=c TO a.
3085 GET x/VARIABLES=d.
3086 GET x.
3087 END MATRIX.
3088
3089 NEW FILE.
3090 MATRIX.
3091 GET x/VARIABLES=a.
3092 END MATRIX.
3093 ])
3094 AT_CHECK([pspp matrix.sps], [1], [dnl
3095 matrix.sps:12.5: error: GET: Syntax error at `!': expecting identifier.
3096
3097 matrix.sps:13.17: error: GET: Syntax error at `!': expecting variable name.
3098
3099 matrix.sps:14.12: error: GET: Syntax error at `!': expecting a file name or
3100 handle name.
3101
3102 matrix.sps:15.16: error: GET: Syntax error at `!': expecting string.
3103
3104 matrix.sps:16.13: error: GET: Syntax error at `!': expecting identifier.
3105
3106 matrix.sps:17.15: error: GET: Syntax error at `!'.
3107
3108 matrix.sps:18.14: error: GET: Syntax error at `!'.
3109
3110 matrix.sps:19.7: error: GET: Syntax error at `!': expecting FILE, VARIABLES,
3111 NAMES, MISSING, or SYSMIS.
3112
3113 matrix.sps:20.17: error: GET: Syntax error at `!': expecting variable name.
3114
3115 matrix.sps:21.22: error: GET: Syntax error at `!': expecting variable name.
3116
3117 matrix.sps:22: error: MATRIX: x is not a variable name.
3118
3119 matrix.sps:23: error: MATRIX: c TO a is not valid syntax since c precedes a in
3120 the dictionary.
3121
3122 matrix.sps:24: warning: MATRIX: d is not a numeric variable.
3123
3124 matrix.sps:25: error: MATRIX: GET: Variable d is not numeric.
3125
3126 error: The GET command cannot read an empty active file.
3127 ])
3128 AT_CLEANUP
3129
3130 AT_SETUP([MATRIX - SAVE])
3131 AT_DATA([matrix.sps], [dnl
3132 MATRIX.
3133 SAVE {1,2,3; 4,5,6}/OUTFILE='matrix.sav'.
3134 SAVE {7,8,9}/VARIABLES=a b c d.
3135
3136 SAVE {1,2,3}/OUTFILE='matrix2.sav'/VARIABLES=v01 TO v03.
3137 SAVE {4,5,6}/NAMES={'x', 'y', 'z', 'w'}.
3138
3139 SAVE {1,'abcd',3}/OUTFILE='matrix3.sav'/NAMES={'a', 'b', 'c'}/STRINGS=b.
3140 SAVE {4,'xyzw',6}/STRINGS=a, b.
3141 END MATRIX.
3142 ])
3143 AT_CHECK([pspp matrix.sps])
3144 AT_CHECK([pspp-convert matrix.sav matrix.csv && cat matrix.csv], [0], [dnl
3145 COL1,COL2,COL3
3146 1,2,3
3147 4,5,6
3148 7,8,9
3149 ])
3150 AT_CHECK([pspp-convert matrix2.sav matrix2.csv && cat matrix2.csv], [0], [dnl
3151 v01,v02,v03
3152 1,2,3
3153 4,5,6
3154 ])
3155 AT_CHECK([pspp-convert matrix3.sav matrix3.csv && cat matrix3.csv], [0], [dnl
3156 a,b,c
3157 1,abcd,3
3158 4,xyzw,6
3159 ])
3160 AT_CLEANUP
3161
3162 AT_SETUP([MATRIX - SAVE - inline])
3163 AT_DATA([matrix.sps], [dnl
3164 MATRIX.
3165 SAVE {1,2,3; 4,5,6}/OUTFILE=*.
3166 SAVE {7,8,9}/VARIABLES=a b c d.
3167 END MATRIX.
3168 LIST.
3169
3170 MATRIX.
3171 SAVE {1,2,3}/OUTFILE=*/VARIABLES=v01 TO v03.
3172 SAVE {4,5,6}/NAMES={'x', 'y', 'z', 'w'}.
3173 END MATRIX.
3174 LIST.
3175
3176 MATRIX.
3177 SAVE {1,'abcd',3}/OUTFILE=*/NAMES={'a', 'b', 'c'}/STRINGS=b.
3178 SAVE {4,'xyzw',6}/STRINGS=a, b.
3179 END MATRIX.
3180 LIST.
3181 ])
3182 AT_CHECK([pspp matrix.sps -O format=csv], [0], [dnl
3183 Table: Data List
3184 COL1,COL2,COL3
3185 1.00,2.00,3.00
3186 4.00,5.00,6.00
3187 7.00,8.00,9.00
3188
3189 Table: Data List
3190 v01,v02,v03
3191 1.00,2.00,3.00
3192 4.00,5.00,6.00
3193
3194 Table: Data List
3195 a,b,c
3196 1.00,abcd,3.00
3197 4.00,xyzw,6.00
3198 ])
3199 AT_CLEANUP
3200
3201 AT_SETUP([MATRIX - SAVE - negative])
3202 AT_DATA([matrix.sps], [dnl
3203 MATRIX.
3204 SAVE !.
3205 SAVE 1/OUTFILE=!.
3206 SAVE 1/VARIABLES=!.
3207 SAVE 1/NAMES=!.
3208 SAVE 1/!.
3209 SAVE 1.
3210 SAVE 1/OUTFILE='matrix.sav'/NAMES={'a'}/VARIABLES=a.
3211 SAVE 1/OUTFILE='matrix2.sav'.
3212 SAVE {1,2}/OUTFILE='matrix2.sav'.
3213 SAVE {1,2}/OUTFILE='matrix3.sav'/NAMES={'a', 'a'}.
3214 SAVE {1,2}/OUTFILE='matrix4.sav'/STRINGS=a.
3215 SAVE {1,2}/OUTFILE='matrix5.sav'/STRINGS=a, b.
3216 END MATRIX.
3217 ])
3218 AT_CHECK([pspp matrix.sps], [1], [dnl
3219 matrix.sps:2.6: error: SAVE: Syntax error at `!'.
3220
3221 matrix.sps:3.16: error: SAVE: Syntax error at `!': expecting a file name or
3222 handle name.
3223
3224 matrix.sps:4.18: error: SAVE: Syntax error at `!': expecting variable name.
3225
3226 matrix.sps:5.14: error: SAVE: Syntax error at `!'.
3227
3228 matrix.sps:6.8: error: SAVE: Syntax error at `!': expecting OUTFILE, VARIABLES,
3229 NAMES, or STRINGS.
3230
3231 matrix.sps:7: error: SAVE: Required subcommand OUTFILE was not specified.
3232
3233 matrix.sps:8: warning: SAVE: VARIABLES and NAMES both specified; ignoring
3234 NAMES.
3235
3236 error: The first SAVE to `matrix2.sav' within this matrix program had 1
3237 columns, so a 1×2 matrix cannot be saved to it.
3238
3239 error: Duplicate variable name a in SAVE statement.
3240
3241 error: The SAVE command STRINGS subcommand specifies an unknown variable a.
3242
3243 error: The SAVE command STRINGS subcommand specifies 2 unknown variables,
3244 including a.
3245 ])
3246 AT_CLEANUP
3247
3248 AT_SETUP([MATRIX - MGET])
3249 AT_DATA([matrix.sps], [dnl
3250 MATRIX DATA
3251     VARIABLES=ROWTYPE_ var01 TO var08.
3252 BEGIN DATA.
3253 MEAN  24.3   5.4  69.7  20.1  13.4   2.7  27.9   3.7
3254 SD     5.7   1.5  23.5   5.8   2.8   4.5   5.4   1.5
3255 N       92    92    92    92    92    92    92    92
3256 CORR  1.00
3257 CORR   .18  1.00
3258 CORR  -.22  -.17  1.00
3259 CORR   .36   .31  -.14  1.00
3260 CORR   .27   .16  -.12   .22  1.00
3261 CORR   .33   .15  -.17   .24   .21  1.00
3262 CORR   .50   .29  -.20   .32   .12   .38  1.00
3263 CORR   .17   .29  -.05   .20   .27   .20   .04  1.00
3264 END DATA.
3265
3266 MATRIX.
3267 MGET.
3268 PRINT MN/FORMAT=F5.1.
3269 PRINT SD/FORMAT=F5.1.
3270 PRINT NC/FORMAT=F5.0.
3271 PRINT CR/FORMAT=F5.2.
3272 END MATRIX.
3273 ])
3274 AT_CHECK([pspp matrix.sps -O format=csv], [0], [dnl
3275 Table: Matrix Variables Created by MGET
3276 ,Dimensions,
3277 ,Rows,Columns
3278 MN,1,8
3279 SD,1,8
3280 NC,1,8
3281 CR,8,8
3282
3283 MN
3284 24.3   5.4  69.7  20.1  13.4   2.7  27.9   3.7
3285
3286 SD
3287 5.7   1.5  23.5   5.8   2.8   4.5   5.4   1.5
3288
3289 NC
3290 92    92    92    92    92    92    92    92
3291
3292 CR
3293 1.00   .18  -.22   .36   .27   .33   .50   .17
3294 .18  1.00  -.17   .31   .16   .15   .29   .29
3295 -.22  -.17  1.00  -.14  -.12  -.17  -.20  -.05
3296 .36   .31  -.14  1.00   .22   .24   .32   .20
3297 .27   .16  -.12   .22  1.00   .21   .12   .27
3298 .33   .15  -.17   .24   .21  1.00   .38   .20
3299 .50   .29  -.20   .32   .12   .38  1.00   .04
3300 .17   .29  -.05   .20   .27   .20   .04  1.00
3301 ])
3302 AT_CLEANUP
3303
3304 AT_SETUP([MATRIX - MGET with split variables])
3305 AT_DATA([matrix.sps], [dnl
3306 matrix data
3307     variables = s1 s2 rowtype_  var01 var02 var03
3308     /split=s1 s2.
3309
3310 begin data
3311 8 0   mean     21.4  5.0  72.9
3312 8 0   sd       6.5   1.6  22.8
3313 8 0   n        106   106  106
3314 8 0   corr     1
3315 8 0   corr    .41  1
3316 8 0   corr    -.16  -.22  1
3317 8 1   mean     11.4  1.0  52.9
3318 8 1   sd       9.5   8.6  12.8
3319 8 1   n        10   11  12
3320 8 1   corr     1
3321 8 1   corr    .51  1
3322 8 1   corr    .36  -.41  1
3323 end data.
3324
3325 MATRIX.
3326 MGET.
3327 PRINT MNS1/FORMAT=F5.1.
3328 PRINT SDS1/FORMAT=F5.1.
3329 PRINT NCS1/FORMAT=F5.0.
3330 PRINT CRS1/FORMAT=F5.2.
3331 PRINT MNS2/FORMAT=F5.1.
3332 PRINT SDS2/FORMAT=F5.1.
3333 PRINT NCS2/FORMAT=F5.0.
3334 PRINT CRS2/FORMAT=F5.2.
3335 END MATRIX.
3336 ])
3337 AT_CHECK([pspp -O format=csv matrix.sps], [0], [dnl
3338 Table: Matrix Variables Created by MGET
3339 ,Split Values,,Dimensions,
3340 ,s1,s2,Rows,Columns
3341 MNS1,8,0,1,3
3342 SDS1,8,0,1,3
3343 NCS1,8,0,1,3
3344 CRS1,8,0,3,3
3345 MNS2,8,1,1,3
3346 SDS2,8,1,1,3
3347 NCS2,8,1,1,3
3348 CRS2,8,1,3,3
3349
3350 MNS1
3351 21.4   5.0  72.9
3352
3353 SDS1
3354 6.5   1.6  22.8
3355
3356 NCS1
3357 106   106   106
3358
3359 CRS1
3360 1.00   .41  -.16
3361 .41  1.00  -.22
3362 -.16  -.22  1.00
3363
3364 MNS2
3365 11.4   1.0  52.9
3366
3367 SDS2
3368 9.5   8.6  12.8
3369
3370 NCS2
3371 10    11    12
3372
3373 CRS2
3374 1.00   .51   .36
3375 .51  1.00  -.41
3376 .36  -.41  1.00
3377 ])
3378 AT_CLEANUP
3379
3380 AT_SETUP([MATRIX - MGET with factor variables])
3381 AT_DATA([matrix.sps], [dnl
3382 MATRIX DATA
3383     VARIABLES=ROWTYPE_ f1 var01 TO var04
3384     /FACTOR=f1.
3385 BEGIN DATA.
3386 MEAN 0 34 35 36 37
3387 SD   0 22 11 55 66
3388 N    0 99 98 99 92
3389 MEAN 1 44 45 34 39
3390 SD   1 23 15 51 46
3391 N    1 98 34 87 23
3392 CORR .  1
3393 CORR . .9  1
3394 CORR . .8 .6  1
3395 CORR . .7 .5 .4  1
3396 END DATA.
3397 FORMATS var01 TO var04(F5.1).
3398 SAVE OUTFILE='matrix.sav'.
3399 ])
3400 AT_DATA([matrix2.sps], [dnl
3401 MATRIX.
3402 MGET FILE='matrix.sav'.
3403 PRINT MNF1/FORMAT=F2.0.
3404 PRINT SDF1/FORMAT=F2.0.
3405 PRINT NCF1/FORMAT=F2.0.
3406 PRINT MNF2/FORMAT=F2.0.
3407 PRINT SDF2/FORMAT=F2.0.
3408 PRINT NCF2/FORMAT=F2.0.
3409 PRINT CR/FORMAT=F3.1.
3410 END MATRIX.
3411 ])
3412 AT_CHECK([pspp matrix.sps])
3413 AT_CHECK([pspp -O format=csv matrix2.sps], [0], [dnl
3414 Table: Matrix Variables Created by MGET
3415 ,Factors,Dimensions,
3416 ,f1,Rows,Columns
3417 MNF1,0,1,4
3418 SDF1,0,1,4
3419 NCF1,0,1,4
3420 MNF2,1,1,4
3421 SDF2,1,1,4
3422 NCF2,1,1,4
3423 CR,.,4,4
3424
3425 MNF1
3426 34 35 36 37
3427
3428 SDF1
3429 22 11 55 66
3430
3431 NCF1
3432 99 98 99 92
3433
3434 MNF2
3435 44 45 34 39
3436
3437 SDF2
3438 23 15 51 46
3439
3440 NCF2
3441 98 34 87 23
3442
3443 CR
3444 1.0  .9  .8  .7
3445 .9 1.0  .6  .5
3446 .8  .6 1.0  .4
3447 .7  .5  .4 1.0
3448 ])
3449 AT_CLEANUP
3450
3451 AT_SETUP([MATRIX - MGET with factor and split variables])
3452 AT_DATA([matrix.sps], [dnl
3453 matrix data
3454     variables = s f rowtype_  var01 var02 var03
3455     /split=s
3456     /factor=f.
3457
3458 begin data
3459 8 0   mean     21.4  5.0  72.9
3460 8 0   sd       6.5   1.6  22.8
3461 8 0   n        106   106  106
3462 8 .   corr     1
3463 8 .   corr    .41  1
3464 8 .   corr    -.16  -.22  1
3465 9 1   mean     11.4  1.0  52.9
3466 9 1   sd       9.5   8.6  12.8
3467 9 1   n        10   11  12
3468 9 .   corr     1
3469 9 .   corr    .51  1
3470 9 .   corr    .36  -.41  1
3471 end data.
3472
3473 MATRIX.
3474 MGET.
3475 PRINT MNF1S1/FORMAT=F5.1.
3476 PRINT SDF1S1/FORMAT=F5.1.
3477 PRINT NCF1S1/FORMAT=F5.0.
3478 PRINT CRS1/FORMAT=F5.2.
3479 PRINT MNF1S2/FORMAT=F5.1.
3480 PRINT SDF1S2/FORMAT=F5.1.
3481 PRINT NCF1S2/FORMAT=F5.0.
3482 PRINT CRS2/FORMAT=F5.2.
3483 END MATRIX.
3484 ])
3485 AT_CHECK([pspp matrix.sps -O format=csv], [0], [dnl
3486 Table: Matrix Variables Created by MGET
3487 ,Split Values,Factors,Dimensions,
3488 ,s,f,Rows,Columns
3489 MNF1S1,8,0,1,3
3490 SDF1S1,8,0,1,3
3491 NCF1S1,8,0,1,3
3492 CRS1,8,.,3,3
3493 MNF1S2,9,1,1,3
3494 SDF1S2,9,1,1,3
3495 NCF1S2,9,1,1,3
3496 CRS2,9,.,3,3
3497
3498 MNF1S1
3499 21.4   5.0  72.9
3500
3501 SDF1S1
3502 6.5   1.6  22.8
3503
3504 NCF1S1
3505 106   106   106
3506
3507 CRS1
3508 1.00   .41  -.16
3509 .41  1.00  -.22
3510 -.16  -.22  1.00
3511
3512 MNF1S2
3513 11.4   1.0  52.9
3514
3515 SDF1S2
3516 9.5   8.6  12.8
3517
3518 NCF1S2
3519 10    11    12
3520
3521 CRS2
3522 1.00   .51   .36
3523 .51  1.00  -.41
3524 .36  -.41  1.00
3525 ])
3526 AT_CLEANUP
3527
3528 AT_SETUP([MATRIX - MGET with TYPE])
3529 AT_DATA([matrix.sps], [dnl
3530 MATRIX DATA
3531     VARIABLES=ROWTYPE_ f1 var01 TO var04
3532     /FACTOR=f1.
3533 BEGIN DATA.
3534 MEAN 0 34 35 36 37
3535 SD   0 22 11 55 66
3536 N    0 99 98 99 92
3537 MEAN 1 44 45 34 39
3538 SD   1 23 15 51 46
3539 N    1 98 34 87 23
3540 CORR .  1
3541 CORR . .9  1
3542 CORR . .8 .6  1
3543 CORR . .7 .5 .4  1
3544 END DATA.
3545 FORMATS var01 TO var04(F5.1).
3546 SAVE OUTFILE='matrix.sav'.
3547 ])
3548 AT_DATA([matrix2.sps], [dnl
3549 MATRIX.
3550 MGET/FILE='matrix.sav'/TYPE=CORR.
3551 PRINT CR/FORMAT=F3.1.
3552 END MATRIX.
3553 ])
3554 AT_CHECK([pspp matrix.sps])
3555 AT_CHECK([pspp -O format=csv matrix2.sps], [0], [dnl
3556 Table: Matrix Variables Created by MGET
3557 ,Factors,Dimensions,
3558 ,f1,Rows,Columns
3559 CR,.,4,4
3560
3561 CR
3562 1.0  .9  .8  .7
3563 .9 1.0  .6  .5
3564 .8  .6 1.0  .4
3565 .7  .5  .4 1.0
3566 ])
3567 AT_CLEANUP
3568
3569 AT_SETUP([MATRIX - MGET - negative - parsing])
3570 AT_DATA([matrix.sps], [dnl
3571 MATRIX.
3572 MGET !.
3573 MGET FILE=!.
3574 MGET ENCODING=!.
3575 MGET TYPE=!.
3576 MGET TYPE=CORR !.
3577 END MATRIX.
3578 ])
3579 AT_CHECK([pspp matrix.sps], [1], [dnl
3580 matrix.sps:2.6: error: MGET: Syntax error at `!': expecting FILE or TYPE.
3581
3582 matrix.sps:3.11: error: MGET: Syntax error at `!': expecting a file name or
3583 handle name.
3584
3585 matrix.sps:4.15: error: MGET: Syntax error at `!': expecting string.
3586
3587 matrix.sps:5.11: error: MGET: Syntax error at `!': expecting COV, CORR, MEAN,
3588 STDDEV, N, or COUNT.
3589
3590 matrix.sps:6.16: error: MGET: Syntax error at `!': expecting COV, CORR, MEAN,
3591 STDDEV, N, or COUNT.
3592 ])
3593 AT_CLEANUP
3594
3595 AT_SETUP([MATRIX - MGET - missing VARNAME_ and ROWTYPE_])
3596 AT_DATA([matrix.sps], [dnl
3597 DATA LIST LIST NOTABLE /x.
3598 BEGIN DATA.
3599 1
3600 END DATA.
3601
3602 MATRIX.
3603 MGET.
3604 END MATRIX.
3605 ])
3606 AT_CHECK([pspp matrix.sps], [1], [dnl
3607 matrix.sps:7: error: MATRIX: Matrix data file lacks ROWTYPE_ variable.
3608
3609 matrix.sps:7: error: MATRIX: Matrix data file lacks VARNAME_ variable.
3610 ])
3611 AT_CLEANUP
3612
3613 AT_SETUP([MATRIX - MGET - wrong format for VARNAME_ and ROWTYPE_])
3614 AT_DATA([matrix.sps], [dnl
3615 DATA LIST LIST NOTABLE /VARNAME_ * ROWTYPE_ (A7).
3616 BEGIN DATA.
3617 1 asdf
3618 END DATA.
3619
3620 MATRIX.
3621 MGET.
3622 END MATRIX.
3623 ])
3624 AT_CHECK([pspp matrix.sps], [1], [dnl
3625 matrix.sps:7: error: MATRIX: ROWTYPE_ variable in matrix data file must be 8-
3626 byte string, but it has width 7.
3627
3628 matrix.sps:7: error: MATRIX: VARNAME_ variable in matrix data file must be 8-
3629 byte string, but it has width 0.
3630 ])
3631 AT_CLEANUP
3632
3633 AT_SETUP([MATRIX - MGET - wrong order for VARNAME_ and ROWTYPE_])
3634 AT_DATA([matrix.sps], [dnl
3635 DATA LIST LIST NOTABLE /VARNAME_ ROWTYPE_ (A8).
3636 BEGIN DATA.
3637 asdf jkl;
3638 END DATA.
3639
3640 MATRIX.
3641 MGET.
3642 END MATRIX.
3643 ])
3644 AT_CHECK([pspp matrix.sps], [1], [dnl
3645 matrix.sps:7: error: MATRIX: ROWTYPE_ must precede VARNAME_ in matrix data
3646 file.
3647 ])
3648 AT_CLEANUP
3649
3650 AT_SETUP([MATRIX - MGET - no continuous variables])
3651 AT_DATA([matrix.sps], [dnl
3652 DATA LIST LIST NOTABLE /ROWTYPE_ VARNAME_ (A8).
3653 BEGIN DATA.
3654 asdf jkl;
3655 END DATA.
3656
3657 MATRIX.
3658 MGET.
3659 END MATRIX.
3660 ])
3661 AT_CHECK([pspp matrix.sps], [1], [dnl
3662 matrix.sps:7: error: MATRIX: Matrix data file contains no continuous variables.
3663 ])
3664 AT_CLEANUP
3665
3666 AT_SETUP([MATRIX - MGET - unexpected string variables])
3667 AT_DATA([matrix.sps], [dnl
3668 DATA LIST LIST NOTABLE /ROWTYPE_ VARNAME_ cvar1 (A8).
3669 BEGIN DATA.
3670 asdf jkl; zxcv
3671 END DATA.
3672
3673 MATRIX.
3674 MGET.
3675 END MATRIX.
3676 ])
3677 AT_CHECK([pspp matrix.sps], [1], [dnl
3678 matrix.sps:7: error: MATRIX: Matrix data file contains unexpected string
3679 variable cvar1.
3680 ])
3681 AT_CLEANUP
3682
3683 AT_SETUP([MATRIX - MGET - unknown ROWTYPE_])
3684 AT_DATA([matrix.sps], [dnl
3685 DATA LIST LIST NOTABLE /ROWTYPE_ VARNAME_ (A8) cvar1.
3686 BEGIN DATA.
3687 asdf jkl; 1
3688 END DATA.
3689
3690 MATRIX.
3691 MGET.
3692 END MATRIX.
3693 ])
3694 AT_CHECK([pspp matrix.sps -O format=csv], [1], [dnl
3695 "matrix.sps:7: error: MATRIX: Matrix data file contains unknown ROWTYPE_ ""asdf""."
3696 ])
3697 AT_CLEANUP
3698
3699 AT_SETUP([MATRIX - MGET - duplicate matrix variable name])
3700 AT_DATA([matrix.sps], [dnl
3701 DATA LIST LIST NOTABLE /ROWTYPE_ VARNAME_ (A8) cvar1.
3702 BEGIN DATA.
3703 corr jkl; 1
3704 END DATA.
3705
3706 MATRIX.
3707 MGET.
3708 MGET.
3709 END MATRIX.
3710 ])
3711 AT_CHECK([pspp matrix.sps -O format=csv], [0], [dnl
3712 Table: Matrix Variables Created by MGET
3713 ,Dimensions,
3714 ,Rows,Columns
3715 CR,1,1
3716
3717 matrix.sps:8: warning: MATRIX: Matrix data file contains variable with existing name CR.
3718 ])
3719 AT_CLEANUP
3720
3721 AT_SETUP([MATRIX - MGET - missing values in input])
3722 AT_DATA([matrix.sps], [dnl
3723 DATA LIST LIST NOTABLE /s1 * ROWTYPE_ VARNAME_ (A8) cvar1 cvar2.
3724 BEGIN DATA.
3725 1 n "" 1 .
3726 2 n "" . .
3727 END DATA.
3728
3729 MATRIX.
3730 MGET.
3731 PRINT ncs1/FORMAT=F5.
3732 PRINT ncs2/FORMAT=F5.
3733 END MATRIX.
3734 ])
3735 AT_CHECK([pspp matrix.sps -O format=csv], [1], [dnl
3736 "matrix.sps:8: error: MATRIX: Matrix data file variable NCS1 contains a missing value, which was treated as zero."
3737
3738 "matrix.sps:8: error: MATRIX: Matrix data file variable NCS2 contains 2 missing values, which were treated as zero."
3739
3740 Table: Matrix Variables Created by MGET
3741 ,Split Values,Dimensions,
3742 ,s1,Rows,Columns
3743 NCS1,1.00,1,2
3744 NCS2,2.00,1,2
3745
3746 ncs1
3747 1     0
3748
3749 ncs2
3750 0     0
3751 ])
3752 AT_CLEANUP
3753
3754 AT_SETUP([MATRIX - MSAVE])
3755 AT_DATA([matrix.sps], [dnl
3756 MATRIX.
3757 MSAVE {1, 2; 3, 4}/TYPE=CORR/VARIABLES=X,Y/OUTFILE='matrix.sav'.
3758 MSAVE {5, 6; 7, 8; 9, 10}/TYPE=COV/VARIABLES=X,Y.
3759 MSAVE {11, 12}/TYPE=MEAN.
3760 MSAVE {13, 14}/TYPE=STDDEV.
3761 MSAVE {15, 16}/TYPE=N.
3762 MSAVE {17, 18}/TYPE=COUNT.
3763 END MATRIX.
3764 GET 'matrix.sav'.
3765 LIST.
3766 ])
3767 AT_CHECK([pspp matrix.sps -O format=csv], [0], [dnl
3768 Table: Data List
3769 ROWTYPE_,VARNAME_,X,Y
3770 CORR,X,1.00,2.00
3771 CORR,Y,3.00,4.00
3772 COV,X,5.00,6.00
3773 COV,Y,7.00,8.00
3774 COV,,9.00,10.00
3775 MEAN,,11.00,12.00
3776 STDDEV,,13.00,14.00
3777 N,,15.00,16.00
3778 COUNT,,17.00,18.00
3779 ])
3780 AT_CLEANUP
3781
3782 AT_SETUP([MATRIX - MSAVE with factor variables])
3783 AT_DATA([matrix.sps], [dnl
3784 MATRIX.
3785 MSAVE {1, 2; 3, 4}/TYPE=CORR/FACTOR={1,1}/FNAMES=X,Y/OUTFILE='matrix.sav'.
3786 MSAVE {5, 6; 7, 8; 9, 10}/TYPE=COV.
3787 MSAVE {11, 12}/TYPE=MEAN.
3788 MSAVE {13, 14}/FACTOR={2,1}/TYPE=STDDEV.
3789 MSAVE {15, 16}/TYPE=N.
3790 MSAVE {17, 18}/FACTOR={1,2}/TYPE=COUNT.
3791 END MATRIX.
3792 GET 'matrix.sav'.
3793 LIST.
3794
3795 MATRIX.
3796 MSAVE {1, 2; 3, 4}/TYPE=CORR/FACTOR={5,6,7,8}/OUTFILE='matrix2.sav'.
3797 END MATRIX.
3798 GET 'matrix2.sav'.
3799 LIST.
3800 ])
3801 AT_CHECK([pspp matrix.sps -O format=csv], [0], [dnl
3802 Table: Data List
3803 ROWTYPE_,X,Y,VARNAME_,COL1,COL2
3804 CORR,1.00,1.00,COL1,1.00,2.00
3805 CORR,1.00,1.00,COL2,3.00,4.00
3806 COV,1.00,1.00,COL1,5.00,6.00
3807 COV,1.00,1.00,COL2,7.00,8.00
3808 COV,1.00,1.00,,9.00,10.00
3809 MEAN,1.00,1.00,,11.00,12.00
3810 STDDEV,2.00,1.00,,13.00,14.00
3811 N,2.00,1.00,,15.00,16.00
3812 COUNT,1.00,2.00,,17.00,18.00
3813
3814 Table: Data List
3815 ROWTYPE_,FAC1,FAC2,FAC3,FAC4,VARNAME_,COL1,COL2
3816 CORR,5.00,6.00,7.00,8.00,COL1,1.00,2.00
3817 CORR,5.00,6.00,7.00,8.00,COL2,3.00,4.00
3818 ])
3819 AT_CLEANUP
3820
3821 AT_SETUP([MATRIX - MSAVE with split variables])
3822 AT_DATA([matrix.sps], [dnl
3823 MATRIX.
3824 MSAVE {1, 2; 3, 4}/TYPE=CORR/SPLIT={1,1}/SNAMES=X,Y/OUTFILE='matrix.sav'.
3825 MSAVE {5, 6; 7, 8; 9, 10}/TYPE=COV.
3826 MSAVE {11, 12}/TYPE=MEAN.
3827 MSAVE {13, 14}/SPLIT={2,1}/TYPE=STDDEV.
3828 MSAVE {15, 16}/TYPE=N.
3829 MSAVE {17, 18}/SPLIT={1,2}/TYPE=COUNT.
3830 END MATRIX.
3831 GET 'matrix.sav'.
3832 LIST.
3833
3834 MATRIX.
3835 MSAVE {1, 2; 3, 4}/TYPE=CORR/SPLIT={5,6,7,8}/OUTFILE='matrix2.sav'.
3836 END MATRIX.
3837 GET 'matrix2.sav'.
3838 LIST.
3839 ])
3840 AT_CHECK([pspp matrix.sps -O format=csv], [0], [dnl
3841 Table: Data List
3842 X,Y,ROWTYPE_,VARNAME_,COL1,COL2
3843 1.00,1.00,CORR,COL1,1.00,2.00
3844 1.00,1.00,CORR,COL2,3.00,4.00
3845 1.00,1.00,COV,COL1,5.00,6.00
3846 1.00,1.00,COV,COL2,7.00,8.00
3847 1.00,1.00,COV,,9.00,10.00
3848 1.00,1.00,MEAN,,11.00,12.00
3849 2.00,1.00,STDDEV,,13.00,14.00
3850 2.00,1.00,N,,15.00,16.00
3851 1.00,2.00,COUNT,,17.00,18.00
3852
3853 Table: Data List
3854 SPL1,SPL2,SPL3,SPL4,ROWTYPE_,VARNAME_,COL1,COL2
3855 5.00,6.00,7.00,8.00,CORR,COL1,1.00,2.00
3856 5.00,6.00,7.00,8.00,CORR,COL2,3.00,4.00
3857 ])
3858 AT_CLEANUP
3859
3860 AT_SETUP([MATRIX - MSAVE with factor and split variables])
3861 AT_DATA([matrix.sps], [dnl
3862 MATRIX.
3863 MSAVE {1, 2; 3, 4}/TYPE=CORR/SPLIT=1/FACTOR=1/OUTFILE='matrix.sav'.
3864 MSAVE {5, 6; 7, 8; 9, 10}/TYPE=COV.
3865 MSAVE {11, 12}/FACTOR=2/TYPE=MEAN.
3866 MSAVE {13, 14}/FACTOR=1/SPLIT=2/TYPE=STDDEV.
3867 MSAVE {15, 16}/TYPE=N.
3868 MSAVE {17, 18}/FACTOR=2/TYPE=COUNT.
3869 END MATRIX.
3870 GET 'matrix.sav'.
3871 LIST.
3872 ])
3873 AT_CHECK([pspp matrix.sps -O format=csv], [0], [dnl
3874 Table: Data List
3875 SPL1,ROWTYPE_,FAC1,VARNAME_,COL1,COL2
3876 1.00,CORR,1.00,COL1,1.00,2.00
3877 1.00,CORR,1.00,COL2,3.00,4.00
3878 1.00,COV,1.00,COL1,5.00,6.00
3879 1.00,COV,1.00,COL2,7.00,8.00
3880 1.00,COV,1.00,,9.00,10.00
3881 1.00,MEAN,2.00,,11.00,12.00
3882 2.00,STDDEV,1.00,,13.00,14.00
3883 2.00,N,1.00,,15.00,16.00
3884 2.00,COUNT,2.00,,17.00,18.00
3885 ])
3886 AT_CLEANUP
3887
3888 AT_SETUP([MATRIX - MSAVE - negative])
3889 AT_DATA([matrix.sps], [dnl
3890 MATRIX.
3891 MSAVE !.
3892 MSAVE 1/TYPE=!.
3893 MSAVE 1/OUTFILE=!.
3894 MSAVE 1/VARIABLES=!.
3895 MSAVE 1/FNAMES=!.
3896 MSAVE 1/SNAMES=!.
3897 MSAVE 1/SPLIT=!.
3898 MSAVE 1/FACTOR=!.
3899 MSAVE 1/!.
3900 MSAVE 1.
3901 MSAVE 1/TYPE=COV/FNAMES=x.
3902 MSAVE 1/TYPE=COV/SNAMES=x.
3903 MSAVE 1/TYPE=COV.
3904
3905 MSAVE 1/TYPE=COV/OUTFILE='matrix.sav'
3906     /FACTOR=1 /FNAMES=y
3907     /SPLIT=2 /SNAMES=z
3908     /VARIABLES=w.
3909 MSAVE 1/TYPE=COV/OUTFILE='matrix2.sav'.
3910 MSAVE 1/TYPE=COV/VARIABLES=x.
3911 MSAVE 1/TYPE=COV/FNAMES=x.
3912 MSAVE 1/TYPE=COV/SNAMES=x.
3913 END MATRIX.
3914
3915 MATRIX.
3916 MSAVE 1/TYPE=COV/VARIABLES=x/OUTFILE='matrix3.sav'/FACTOR=1/SPLIT=2.
3917 MSAVE {1,2}/TYPE=COV/VARIABLES=x/OUTFILE='matrix3.sav'/FACTOR=1/SPLIT=2.
3918 MSAVE {1,2;3}/TYPE=COV.
3919 MSAVE 0/TYPE=COV/FACTOR={1,2}.
3920 MSAVE 0/TYPE=COV/FACTOR=1/SPLIT={1;2}.
3921 END MATRIX.
3922
3923 MATRIX.
3924 MSAVE 1/TYPE=COV/OUTFILE='matrix4.sav'/SNAMES=x,x/SPLIT=1.
3925 END MATRIX.
3926
3927 MATRIX.
3928 MSAVE 1/TYPE=COV/OUTFILE='matrix5.sav'/SNAMES=x/FNAMES=x/SPLIT=1/FACTOR=1.
3929 END MATRIX.
3930
3931 MATRIX.
3932 MSAVE 1/TYPE=COV/OUTFILE='matrix6.sav'/VARIABLES=x/FNAMES=x/FACTOR=1.
3933 END MATRIX.
3934
3935 MATRIX.
3936 MSAVE 1/TYPE=COV/OUTFILE='matrix6.sav'/VARIABLES=x/SNAMES=x/SPLIT=1.
3937 END MATRIX.
3938
3939 MATRIX.
3940 MSAVE 1/TYPE=COV/OUTFILE='matrix7.sav'/SNAMES=VARNAME_.
3941 MSAVE 1/TYPE=COV/OUTFILE='matrix7.sav'/SNAMES=ROWTYPE_.
3942 MSAVE 1/TYPE=COV/OUTFILE='matrix7.sav'/FNAMES=VARNAME_.
3943 MSAVE 1/TYPE=COV/OUTFILE='matrix7.sav'/FNAMES=ROWTYPE_.
3944 MSAVE 1/TYPE=COV/OUTFILE='matrix7.sav'/VARIABLES=VARNAME_.
3945 MSAVE 1/TYPE=COV/OUTFILE='matrix7.sav'/VARIABLES=ROWTYPE_.
3946 END MATRIX.
3947 ])
3948 AT_CHECK([pspp matrix.sps], [1], [dnl
3949 matrix.sps:2.7: error: MSAVE: Syntax error at `!'.
3950
3951 matrix.sps:3.14: error: MSAVE: Syntax error at `!': expecting COV, CORR, MEAN,
3952 STDDEV, N, or COUNT.
3953
3954 matrix.sps:4.17: error: MSAVE: Syntax error at `!': expecting a file name or
3955 handle name.
3956
3957 matrix.sps:5.19: error: MSAVE: Syntax error at `!': expecting variable name.
3958
3959 matrix.sps:6.16: error: MSAVE: Syntax error at `!': expecting variable name.
3960
3961 matrix.sps:7.16: error: MSAVE: Syntax error at `!': expecting variable name.
3962
3963 matrix.sps:8.15: error: MSAVE: Syntax error at `!'.
3964
3965 matrix.sps:9.16: error: MSAVE: Syntax error at `!'.
3966
3967 matrix.sps:10.9: error: MSAVE: Syntax error at `!': expecting TYPE, OUTFILE,
3968 VARIABLES, FNAMES, SNAMES, SPLIT, or FACTOR.
3969
3970 matrix.sps:11: error: MSAVE: Required subcommand TYPE was not specified.
3971
3972 matrix.sps:12: error: MSAVE: FNAMES requires FACTOR.
3973
3974 matrix.sps:13: error: MSAVE: SNAMES requires SPLIT.
3975
3976 matrix.sps:14: error: MSAVE: Required subcommand OUTFILE was not specified.
3977
3978 matrix.sps:20: error: MSAVE: OUTFILE must name the same file on each MSAVE
3979 within a single MATRIX command.
3980
3981 matrix.sps:21: error: MSAVE: VARIABLES must specify the same variables each
3982 time within a given MATRIX.
3983
3984 matrix.sps:22: error: MSAVE: FNAMES must specify the same variables each time
3985 within a given MATRIX.
3986
3987 matrix.sps:23: error: MSAVE: SNAMES must specify the same variables each time
3988 within a given MATRIX.
3989
3990 matrix.sps:28: error: MATRIX: Matrix on MSAVE has 2 columns but there are 1
3991 variables.
3992
3993 matrix.sps:29: error: MATRIX: All rows in a matrix must have the same number of
3994 columns, but this tries to stack matrices with 2 and 1 columns.
3995
3996 matrix.sps:30: error: MATRIX: There are 1 factor variables, but 2 factor values
3997 were supplied.
3998
3999 matrix.sps:31: error: MATRIX: There are 1 split variables, but 2 split values
4000 were supplied.
4001
4002 matrix.sps:35: error: MSAVE: Variable x appears twice in variable list.
4003
4004 matrix.sps:39: error: MATRIX: Duplicate or invalid FACTOR variable name x.
4005
4006 matrix.sps:43: error: MATRIX: Duplicate or invalid variable name x.
4007
4008 matrix.sps:47: error: MATRIX: Duplicate or invalid variable name x.
4009
4010 matrix.sps:51: error: MSAVE: Variable name VARNAME_ is reserved.
4011
4012 matrix.sps:52: error: MSAVE: Variable name ROWTYPE_ is reserved.
4013
4014 matrix.sps:53: error: MSAVE: Variable name VARNAME_ is reserved.
4015
4016 matrix.sps:54: error: MSAVE: Variable name ROWTYPE_ is reserved.
4017
4018 matrix.sps:55: error: MSAVE: Variable name VARNAME_ is reserved.
4019
4020 matrix.sps:56: error: MSAVE: Variable name ROWTYPE_ is reserved.
4021 ])
4022 AT_CLEANUP
4023
4024 AT_SETUP([MATRIX - DISPLAY])
4025 AT_DATA([matrix-template.sps], [dnl
4026 MATRIX.
4027 COMPUTE a={1,2,3}.
4028 COMPUTE b={1;2;3}.
4029 COMPUTE c={T(b),a}.
4030 COMPUTE d={T(a),b}.
4031 command.
4032 END MATRIX.
4033 ])
4034 for command in 'DISPLAY' 'DISPLAY DICTIONARY' 'DISPLAY STATUS'; do
4035     sed "s/command/$command/" < matrix-template.sps > matrix.sps
4036     AT_CHECK([pspp matrix.sps -O format=csv], [0], [dnl
4037 Table: Matrix Variables
4038 ,Dimension,,Size (kB)
4039 ,Rows,Columns,
4040 a,1,3,0
4041 b,3,1,0
4042 c,1,6,0
4043 d,3,2,0
4044 ])
4045 done
4046 AT_CLEANUP
4047
4048 AT_SETUP([MATRIX - DISPLAY - negative])
4049 AT_DATA([matrix.sps], [dnl
4050 MATRIX.
4051 DISPLAY !.
4052 END MATRIX.
4053 ])
4054 AT_CHECK([pspp matrix.sps], [1], [dnl
4055 matrix.sps:2.9: error: DISPLAY: Syntax error at `!': expecting DICTIONARY or
4056 STATUS.
4057 ])
4058 AT_CLEANUP
4059
4060 AT_SETUP([MATRIX - RELEASE])
4061 AT_DATA([matrix.sps], [dnl
4062 MATRIX.
4063 COMPUTE x=1.
4064 PRINT x.
4065 RELEASE X.
4066 PRINT x.
4067 END MATRIX.
4068 ])
4069 AT_CHECK([pspp matrix.sps], [1], [dnl
4070 x
4071   1
4072
4073 matrix.sps:5: error: MATRIX: Uninitialized variable x used in expression.
4074 ])
4075 AT_CLEANUP
4076
4077 AT_SETUP([MATRIX - RELEASE - negative])
4078 AT_DATA([matrix.sps], [dnl
4079 MATRIX.
4080 RELEASE !.
4081 RELEASE x.
4082 COMPUTE x=1.
4083 RELEASE x, !.
4084 COMPUTE x=1.
4085 RELEASE x y.
4086 COMPUTE x=1.
4087 RELEASE x.
4088 RELEASE x.
4089 END MATRIX.
4090 ])
4091 AT_CHECK([pspp matrix.sps], [1], [dnl
4092 matrix.sps:2.9: error: RELEASE: Syntax error at `!': expecting end of command.
4093
4094 matrix.sps:3.9: error: RELEASE: Syntax error at `x': Variable name expected.
4095
4096 matrix.sps:5.12: error: RELEASE: Syntax error at `!': expecting end of command.
4097
4098 matrix.sps:7.11: error: RELEASE: Syntax error at `y': expecting end of command.
4099 ])
4100 AT_CLEANUP