395c57879544ea893aa5c2bb2a1bfc2095fb6f60
[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], [0], [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 LN(0)
1484  -In
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 matrix.sps:13: error: MATRIX: Argument to SQRT must be nonnegative.
1845 ])
1846 AT_CLEANUP
1847
1848 AT_SETUP([MATRIX - SSCP SVAL SWEEP TRACE TRANSPOS TRUNC])
1849 AT_DATA([matrix.sps], [dnl
1850 MATRIX.
1851 COMPUTE m={1, 2, 3; 4, 5, 6}
1852 COMPUTE sscp1=SSCP(m).
1853 COMPUTE sscp2=T(m)*m.
1854 PRINT sscp1.
1855 PRINT (sscp1 <> sscp2).
1856
1857 PRINT SVAL({1, 1; 0, 0})/FORMAT F5.2.
1858 PRINT SVAL({1, 0, 1; 0, 1, 1; 0, 0, 0})/FORMAT F5.2.
1859 PRINT SVAL({1, 0, 0, 0, 2; 0, 0, 3, 0, 0; 0, 0, 0, 0, 0; 0, 2, 0, 0, 0})
1860     /FORMAT F5.2.
1861 PRINT SVAL({2, 4; 1, 3; 0, 0; 0, 0})/FORMAT F5.2.
1862
1863 COMPUTE s0 = {6, 12, 0, 12; 12, 28, 0, 25; 0, 0, 6, 2; 12, 25, 2, 28}.
1864 PRINT SWEEP(s0, 1)/FORMAT F5.2.
1865 PRINT SWEEP(SWEEP(s0, 1), 2)/FORMAT F5.2.
1866 PRINT SWEEP(SWEEP(SWEEP(s0, 1), 2), 3)/FORMAT F5.2.
1867
1868 COMPUTE s1 = {6, 12, 0, 12; 12, 0, 0, 25; 0, 0, 6, 2; 12, 25, 2, 28}.
1869 PRINT SWEEP(s1, 2).
1870
1871 COMPUTE s2 = {0, 1, 2; 3, 4, 5; 6, 7, 8}.
1872 PRINT SWEEP(s2, 1).
1873 PRINT SWEEP(s2, 2).
1874 PRINT SWEEP(s2, 3).
1875
1876 PRINT TRACE(s0).
1877
1878 PRINT T(s0).
1879 PRINT TRANSPOS(s0).
1880 PRINT ALL(T(T(s0)) = s0).
1881
1882 PRINT TRUNC(SVAL({2, 4; 1, 3; 0, 0; 0, 0})).
1883 PRINT TRUNC(-SVAL({2, 4; 1, 3; 0, 0; 0, 0})).
1884 END MATRIX.
1885 ])
1886 AT_CHECK([pspp matrix.sps], [0], [dnl
1887 sscp1
1888   17  22  27
1889   22  29  36
1890   27  36  45
1891
1892 (sscp1 <> sscp2)
1893  0 0 0
1894  0 0 0
1895  0 0 0
1896
1897 SVAL({1, 1; 0, 0})
1898   1.41
1899    .00
1900
1901 SVAL({1, 0, 1; 0, 1, 1; 0, 0, 0})
1902   1.73
1903   1.00
1904    .00
1905
1906 SVAL({1, 0, 0, 0, 2; 0, 0, 3, 0, 0; 0, 0, 0, 0, 0; 0, 2, 0, 0, 0})
1907   3.00
1908   2.24
1909   2.00
1910    .00
1911
1912 SVAL({2, 4; 1, 3; 0, 0; 0, 0})
1913   5.46
1914    .37
1915
1916 SWEEP(s0, 1)
1917    .17  2.00   .00  2.00
1918  -2.00  4.00   .00  1.00
1919    .00   .00  6.00  2.00
1920  -2.00  1.00  2.00  4.00
1921
1922 SWEEP(SWEEP(s0, 1), 2)
1923   1.17  -.50   .00  1.50
1924   -.50   .25   .00   .25
1925    .00   .00  6.00  2.00
1926  -1.50  -.25  2.00  3.75
1927
1928 SWEEP(SWEEP(SWEEP(s0, 1), 2), 3)
1929   1.17  -.50   .00  1.50
1930   -.50   .25   .00   .25
1931    .00   .00   .17   .33
1932  -1.50  -.25  -.33  3.08
1933
1934 SWEEP(s1, 2)
1935    6   0   0  12
1936    0   0   0   0
1937    0   0   6   2
1938   12   0   2  28
1939
1940 SWEEP(s2, 1)
1941   0  0  0
1942   0  4  5
1943   0  7  8
1944
1945 SWEEP(s2, 2)
1946   -.7500000000  -.2500000000   .7500000000
1947    .7500000000   .2500000000  1.2500000000
1948    .7500000000 -1.7500000000  -.7500000000
1949
1950 SWEEP(s2, 3)
1951  -1.5000000000  -.7500000000  -.2500000000
1952   -.7500000000  -.3750000000  -.6250000000
1953    .7500000000   .8750000000   .1250000000
1954
1955 TRACE(s0)
1956   68
1957
1958 T(s0)
1959    6  12   0  12
1960   12  28   0  25
1961    0   0   6   2
1962   12  25   2  28
1963
1964 TRANSPOS(s0)
1965    6  12   0  12
1966   12  28   0  25
1967    0   0   6   2
1968   12  25   2  28
1969
1970 ALL(T(T(s0)) = s0)
1971   1
1972
1973 TRUNC(SVAL({2, 4; 1, 3; 0, 0; 0, 0}))
1974   5
1975   0
1976
1977 TRUNC(-SVAL({2, 4; 1, 3; 0, 0; 0, 0}))
1978  -5
1979   0
1980 ])
1981 AT_CLEANUP
1982
1983 AT_SETUP([MATRIX - UNIFORM])
1984 AT_DATA([matrix.sps], [dnl
1985 SET SEED=10.
1986 MATRIX.
1987 PRINT (UNIFORM(4, 5)*10)/FORMAT F5.2.
1988 END MATRIX.
1989 ])
1990 AT_CHECK([pspp matrix.sps], [0], [dnl
1991 (UNIFORM(4, 5)*10)
1992   7.71  2.99   .21  4.95  6.34
1993   4.43  7.49  8.32  4.99  5.83
1994   2.25   .25  1.98  7.09  7.61
1995   2.66  1.69  2.64   .88  1.50
1996 ])
1997 AT_CLEANUP
1998
1999 AT_SETUP([MATRIX - CALL SETDIAG])
2000 AT_DATA([matrix.sps], [dnl
2001 MATRIX.
2002 COMPUTE x={1, 2, 3; 4, 5, 6; 7, 8, 9}.
2003
2004 COMPUTE x1=x.
2005 CALL SETDIAG(x1, 10).
2006 PRINT x1.
2007
2008 COMPUTE x2=x.
2009 CALL SETDIAG(x2, {10, 11}).
2010 PRINT x2.
2011
2012 COMPUTE x3=x.
2013 CALL SETDIAG(x3, {10, 11, 12}).
2014 PRINT x3.
2015
2016 COMPUTE x4=x.
2017 CALL SETDIAG(x4, {10, 11, 12, 13}).
2018 PRINT x4.
2019
2020 COMPUTE x5=x.
2021 CALL SETDIAG(x5, {10, 11; 12, 13}).
2022 PRINT x5.
2023
2024 END MATRIX.
2025 ])
2026 AT_CHECK([pspp matrix.sps], [1], [dnl
2027 x1
2028   10   2   3
2029    4  10   6
2030    7   8  10
2031
2032 x2
2033   10   2   3
2034    4  11   6
2035    7   8   9
2036
2037 x3
2038   10   2   3
2039    4  11   6
2040    7   8  12
2041
2042 x4
2043   10   2   3
2044    4  11   6
2045    7   8  12
2046
2047 matrix.sps:21: error: MATRIX: SETDIAG argument 2 must be a scalar or a vector,
2048 not a 2×2 matrix.
2049
2050 x5
2051   1  2  3
2052   4  5  6
2053   7  8  9
2054 ])
2055 AT_CLEANUP
2056
2057 dnl I have some doubts about the correctness of the results below.
2058 AT_SETUP([MATRIX - CALL EIGEN])
2059 AT_DATA([matrix.sps], [dnl
2060 MATRIX.
2061 CALL EIGEN({1, 0; 0, 1}, evec, eval).
2062 PRINT evec.
2063 PRINT eval.
2064
2065 CALL EIGEN({3, 2, 4; 2, 0, 2; 4, 2, 3}, evec2, eval2).
2066 PRINT evec2.
2067 PRINT eval2.
2068 END MATRIX.
2069 ])
2070 AT_CHECK([pspp matrix.sps], [0], [dnl
2071 evec
2072   1  0
2073   0  1
2074
2075 eval
2076   1
2077   1
2078
2079 evec2
2080   -.6666666667   .0000000000   .7453559925
2081   -.3333333333  -.8944271910  -.2981423970
2082   -.6666666667   .4472135955  -.5962847940
2083
2084 eval2
2085   8.0000000000
2086  -1.0000000000
2087  -1.0000000000
2088 ])
2089 AT_CLEANUP
2090
2091 AT_SETUP([MATRIX - CALL SVD])
2092 AT_DATA([matrix.sps], [dnl
2093 MATRIX.
2094 CALL SVD({3, 2, 2; 2, 3, -2}, u, s, v).
2095 PRINT (u * s * T(v))/FORMAT F5.1.
2096
2097 CALL SVD({2, 4; 1, 3; 0, 0; 0, 0}, u, s, v).
2098 PRINT (u*s*T(v))/FORMAT F5.1.
2099
2100 CALL SVD({-3, 1; 6, -2; 6, -2}, u, s, v).
2101 PRINT (u*s*T(v))/FORMAT F5.1.
2102 END MATRIX.
2103 ])
2104 AT_CHECK([pspp matrix.sps], [0], [dnl
2105 (u * s * T(v))
2106    3.0   2.0   2.0
2107    2.0   3.0  -2.0
2108
2109 (u*s*T(v))
2110    2.0   4.0
2111    1.0   3.0
2112     .0    .0
2113     .0    .0
2114
2115 (u*s*T(v))
2116   -3.0   1.0
2117    6.0  -2.0
2118    6.0  -2.0
2119 ])
2120 AT_CLEANUP
2121
2122 AT_SETUP([MATRIX - PRINT])
2123 AT_DATA([matrix.sps], [dnl
2124 MATRIX.
2125 PRINT/TITLE="title 1".
2126 PRINT/SPACE=2/TITLE="title 2".
2127
2128 COMPUTE m={1, 2, 3; 3, 4, 5; 6, 7, 8}.
2129 PRINT m/RLABELS=123, a b c, long name.
2130 PRINT m/RNAMES={'123', 'a b c', 'long name'}.
2131 PRINT m/CLABELS=col1, col2, long column name.
2132 PRINT m/CNAMES={'col1', 'col2', 'long column name'}.
2133 PRINT m/RLABELS=123, a b c, long name
2134        /CLABELS=col1, col2, long column name.
2135 PRINT m/RNAMES={'123', 'a b c', 'long name'}
2136        /CNAMES={'col1', 'col2', 'long column name'}.
2137 PRINT {123e10, 456e10, 500}.
2138 END MATRIX.
2139 ])
2140
2141 AT_DATA([matrix-tables.sps], [dnl
2142 SET MDISPLAY=TABLES.
2143 INCLUDE 'matrix.sps'.
2144 ])
2145
2146 AT_CHECK([pspp matrix.sps], [0], [dnl
2147 title 1
2148
2149
2150
2151 title 2
2152
2153 m
2154 123       1  2  3
2155 a b c     3  4  5
2156 long nam  6  7  8
2157
2158 m
2159 123       1  2  3
2160 a b c     3  4  5
2161 long nam  6  7  8
2162
2163 m
2164      col1     col2 long col
2165         1        2        3
2166         3        4        5
2167         6        7        8
2168
2169 m
2170      col1     col2 long col
2171         1        2        3
2172         3        4        5
2173         6        7        8
2174
2175 m
2176              col1     col2 long col
2177 123             1        2        3
2178 a b c           3        4        5
2179 long nam        6        7        8
2180
2181 m
2182              col1     col2 long col
2183 123             1        2        3
2184 a b c           3        4        5
2185 long nam        6        7        8
2186
2187 {123e10, 456e10, 500}
2188   10 ** 12   X
2189   1.2300000000  4.5600000000   .0000000005
2190 ])
2191
2192 AT_CHECK([pspp matrix-tables.sps], [0], [dnl
2193 title 1
2194
2195
2196
2197 title 2
2198
2199         m
2200 +---------+-----+
2201 |123      |1 2 3|
2202 |a b c    |3 4 5|
2203 |long name|6 7 8|
2204 +---------+-----+
2205
2206         m
2207 +--------+-----+
2208 |123     |1 2 3|
2209 |a b c   |3 4 5|
2210 |long nam|6 7 8|
2211 +--------+-----+
2212
2213               m
2214 +----+----+----------------+
2215 |col1|col2|long column name|
2216 +----+----+----------------+
2217 |   1|   2|               3|
2218 |   3|   4|               5|
2219 |   6|   7|               8|
2220 +----+----+----------------+
2221
2222           m
2223 +----+----+--------+
2224 |col1|col2|long col|
2225 +----+----+--------+
2226 |   1|   2|       3|
2227 |   3|   4|       5|
2228 |   6|   7|       8|
2229 +----+----+--------+
2230
2231                    m
2232 +---------+----+----+----------------+
2233 |         |col1|col2|long column name|
2234 +---------+----+----+----------------+
2235 |123      |   1|   2|               3|
2236 |a b c    |   3|   4|               5|
2237 |long name|   6|   7|               8|
2238 +---------+----+----+----------------+
2239
2240               m
2241 +--------+----+----+--------+
2242 |        |col1|col2|long col|
2243 +--------+----+----+--------+
2244 |123     |   1|   2|       3|
2245 |a b c   |   3|   4|       5|
2246 |long nam|   6|   7|       8|
2247 +--------+----+----+--------+
2248
2249               {123e10, 456e10, 500}
2250 +----------------------------------------------+
2251 |1.2300000000[[a]] 4.5600000000[[a]] .0000000005[[a]]|
2252 +----------------------------------------------+
2253 a. × 10**12
2254 ])
2255 AT_CLEANUP
2256
2257 AT_SETUP([MATRIX - DO IF])
2258 AT_DATA([matrix.sps], [dnl
2259 MATRIX.
2260 DO IF 1.
2261 PRINT/TITLE '1'.
2262 END IF.
2263
2264 DO IF 0.
2265 PRINT/TITLE '2'.
2266 ELSE IF 1.
2267 PRINT/TITLE '3'.
2268 END IF.
2269
2270 DO IF -1.
2271 PRINT/TITLE '4'.
2272 ELSE IF 0.
2273 PRINT/TITLE '5'.
2274 ELSE.
2275 PRINT/TITLE '6'.
2276 END IF.
2277
2278 DO IF {1, 2}.
2279 END IF.
2280
2281 DO IF 0.
2282 ELSE IF {}.
2283 END IF.
2284 END MATRIX.
2285 ])
2286 AT_CHECK([pspp matrix.sps], [1], [dnl
2287 1
2288
2289 3
2290
2291 6
2292
2293 matrix.sps:21: error: MATRIX: Expression for DO IF must evaluate to scalar, not
2294 a 1×2 matrix.
2295
2296 matrix.sps:25: error: MATRIX: Expression for ELSE IF must evaluate to scalar,
2297 not a 0×0 matrix.
2298 ])
2299 AT_CLEANUP
2300
2301 AT_SETUP([MATRIX - unbounded LOOP])
2302 AT_DATA([matrix.sps], [dnl
2303 MATRIX.
2304 * Truly unbounded loop.
2305 COMPUTE x=0.
2306 COMPUTE y={}.
2307 LOOP.
2308 COMPUTE x=x+1.
2309 COMPUTE y={y, x}.
2310 END LOOP.
2311 PRINT x.
2312 PRINT y.
2313
2314 * Unbounded loop terminates with BREAK.
2315 COMPUTE x=0.
2316 COMPUTE y={}.
2317 LOOP.
2318 COMPUTE x=x+1.
2319 COMPUTE y={y, x}.
2320 DO IF x >= 20.
2321     BREAK.
2322 END IF.
2323 END LOOP.
2324 PRINT x.
2325 PRINT y.
2326
2327 END MATRIX.
2328 ])
2329 AT_CHECK([pspp matrix.sps], [0], [dnl
2330 x
2331   40
2332
2333 y
2334    1   2   3   4   5   6   7   8   9  10  11  12  13  14  15  16  17  18  19
2335 20  21  22  23  24  25  26  27  28  29  30  31  32  33  34  35  36  37  38  39
2336 40
2337
2338 x
2339   20
2340
2341 y
2342    1   2   3   4   5   6   7   8   9  10  11  12  13  14  15  16  17  18  19
2343 20
2344 ])
2345 AT_CLEANUP
2346
2347 AT_SETUP([MATRIX - indexed or conditional LOOP])
2348 AT_DATA([matrix.sps], [dnl
2349 MATRIX.
2350 * Indexed loop terminates based on index.
2351 COMPUTE y={}.
2352 LOOP x=1 TO 20.
2353 COMPUTE y={y, x}.
2354 END LOOP.
2355 PRINT x.
2356 PRINT y.
2357
2358 * Indexed loop terminates based on MXLOOPS.
2359 COMPUTE y={}.
2360 LOOP x=1 TO 50.
2361 COMPUTE y={y, x}.
2362 END LOOP.
2363 PRINT x.
2364 PRINT y.
2365
2366 * Indexed loop terminates with BREAK.
2367 COMPUTE y={}.
2368 LOOP x=1 TO 50.
2369 COMPUTE y={y, x}.
2370 DO IF x >= 20.
2371     BREAK.
2372 END IF.
2373 END LOOP.
2374 PRINT x.
2375 PRINT y.
2376
2377 * Indexed loop terminates with top IF.
2378 COMPUTE y={}.
2379 LOOP x=1 TO 50 IF NCOL(y) < 15.
2380 COMPUTE y={y, x}.
2381 END LOOP.
2382 PRINT x.
2383 PRINT y.
2384
2385 * Indexed loop terminates with bottom IF.
2386 COMPUTE y={}.
2387 LOOP x=1 TO 50.
2388 COMPUTE y={y, x}.
2389 END LOOP IF NCOL(y) >= 22.
2390 PRINT x.
2391 PRINT y.
2392
2393 * Index behavior.
2394 COMPUTE indexing={
2395     1, 10, 1;
2396     1, 10, 2;
2397     1, 10, 3;
2398     1, 10, -1;
2399     1, 10, 0;
2400     10, 1, -1;
2401     10, 1, -2;
2402     10, 1, -3;
2403     10, 1, 1;
2404     10, 1, 0
2405 }.
2406 LOOP i=1 TO NROW(indexing).
2407     COMPUTE y={}.
2408     LOOP j=indexing(i, 1) TO indexing(i, 2) BY indexing(i, 3).
2409         COMPUTE y={y, j}.
2410     END LOOP.
2411     PRINT {indexing(i, :), y}.
2412 END LOOP.
2413
2414 LOOP i={} TO 5.
2415 END LOOP.
2416         
2417 LOOP i=5 TO {}.
2418 END LOOP.
2419
2420 LOOP i=5 TO 8 BY {}.
2421 END LOOP.
2422
2423 LOOP IF {}.
2424 END LOOP.
2425
2426 LOOP.
2427 END LOOP IF {}.
2428
2429 LOOP i=1e100 to 1e200.
2430 END LOOP.
2431 END MATRIX.
2432 ])
2433 AT_CHECK([pspp matrix.sps], [1], [dnl
2434 x
2435   20
2436
2437 y
2438    1   2   3   4   5   6   7   8   9  10  11  12  13  14  15  16  17  18  19
2439 20
2440
2441 x
2442   40
2443
2444 y
2445    1   2   3   4   5   6   7   8   9  10  11  12  13  14  15  16  17  18  19
2446 20  21  22  23  24  25  26  27  28  29  30  31  32  33  34  35  36  37  38  39
2447 40
2448
2449 x
2450   20
2451
2452 y
2453    1   2   3   4   5   6   7   8   9  10  11  12  13  14  15  16  17  18  19
2454 20
2455
2456 x
2457   16
2458
2459 y
2460    1   2   3   4   5   6   7   8   9  10  11  12  13  14  15
2461
2462 x
2463   22
2464
2465 y
2466    1   2   3   4   5   6   7   8   9  10  11  12  13  14  15  16  17  18  19
2467 20  21  22
2468
2469 {indexing(i, :), y}
2470    1  10   1   1   2   3   4   5   6   7   8   9  10
2471 {indexing(i, :), y}
2472    1  10   2   1   3   5   7   9
2473 {indexing(i, :), y}
2474    1  10   3   1   4   7  10
2475 {indexing(i, :), y}
2476    1  10  -1
2477 {indexing(i, :), y}
2478    1  10   0
2479 {indexing(i, :), y}
2480   10   1  -1  10   9   8   7   6   5   4   3   2   1
2481 {indexing(i, :), y}
2482   10   1  -2  10   8   6   4   2
2483 {indexing(i, :), y}
2484   10   1  -3  10   7   4   1
2485 {indexing(i, :), y}
2486   10   1   1
2487 {indexing(i, :), y}
2488   10   1   0
2489
2490 matrix.sps:67: error: MATRIX: Expression for LOOP must evaluate to scalar, not
2491 a 0×0 matrix.
2492
2493 matrix.sps:70: error: MATRIX: Expression for TO must evaluate to scalar, not a
2494 0×0 matrix.
2495
2496 matrix.sps:73: error: MATRIX: Expression for BY must evaluate to scalar, not a
2497 0×0 matrix.
2498
2499 matrix.sps:76: error: MATRIX: Expression for LOOP IF must evaluate to scalar,
2500 not a 0×0 matrix.
2501
2502 matrix.sps:79: error: MATRIX: Expression for END LOOP IF must evaluate to
2503 scalar, not a 0×0 matrix.
2504
2505 matrix.sps:82: error: MATRIX: Expression for LOOP is outside the integer range.
2506 ])
2507 AT_CLEANUP
2508
2509 AT_SETUP([MATRIX - BREAK outside LOOP])
2510 AT_DATA([matrix.sps], [dnl
2511 MATRIX.
2512 BREAK.
2513 END MATRIX.
2514 ])
2515 AT_CHECK([pspp matrix.sps], [1], [dnl
2516 matrix.sps:2: error: BREAK: BREAK not inside LOOP.
2517 ])
2518 AT_CLEANUP
2519
2520 AT_SETUP([MATRIX - READ])
2521 AT_DATA([matrix.txt], [dnl
2522 9
2523 8
2524 7
2525 6
2526 1 2 3
2527 4 5 6
2528 7 8 9
2529 10 11 12,13
2530 14, 15 ,16 , 17
2531 18
2532 19
2533 20 21 22 23
2534     12        34
2535 5    6
2536     78        89
2537 10   11
2538 $1 $2 3
2539 4 $5 6
2540 $1   $2   $3   4
2541    $5$6      $78
2542 1% 2% 3% 4
2543   56%  7%8
2544 abcdefghijkl
2545 ABCDEFGHIJKL
2546 ])
2547 AT_DATA([matrix2.txt], [dnl
2548 2, 3, 5, 7
2549 11, 13, 17, 19
2550 23, 29, 31, 37
2551 41, 43, 47, 53
2552 ])
2553 AT_DATA([matrix3.txt], [dnl
2554 1 5
2555 3 1 2 3
2556 5 6 -1 2 5 1
2557 2 8 9
2558 3 1 3 2
2559 ])
2560 AT_DATA([matrix.sps], [dnl
2561 MATRIX.
2562 READ x/FILE='matrix.txt'/SIZE=4/FIELD=1 TO 1.
2563 PRINT x.
2564 READ x/FILE='matrix.txt'/SIZE={3,3}/FIELD=1 TO 80.
2565 PRINT x.
2566 READ x/SIZE={2,4}/FIELD=1 TO 80.
2567 PRINT x.
2568 READ x(:,2)/FILE='matrix.txt'/FIELD=1 TO 80.
2569 PRINT x.
2570 READ x(1,:)/SIZE={1,4}/FIELD=1 TO 80.
2571 PRINT x.
2572
2573 READ x/SIZE={2,6}/FIELD=1 TO 20 BY 5.
2574 PRINT x.
2575 READ x/SIZE={2,3}/FIELD=1 TO 20/FORMAT=DOLLAR.
2576 PRINT x.
2577 READ x/SIZE={2,4}/FIELD=1 TO 20/FORMAT=DOLLAR5.1.
2578 PRINT x.
2579 READ x/SIZE={2,4}/FIELD=1 TO 12/FORMAT='4PCT'.
2580 PRINT x.
2581 READ x/SIZE={2,4}/FIELD=1 TO 12/FORMAT='4A'.
2582 PRINT x/FORMAT=A3.
2583
2584 COMPUTE y={}.
2585 LOOP IF NOT EOF('matrix2.txt').
2586 READ x/FILE='matrix2.txt'/SIZE={1,4}/FIELD=1 TO 80.
2587 COMPUTE y={y; x}.
2588 END LOOP.
2589 PRINT y.
2590
2591 COMPUTE m = MAKE(5, 5, 0).
2592 LOOP i = 1 TO 5.
2593 READ count /FILE='matrix3.txt' /FIELD=1 TO 1 /SIZE=1.
2594 READ m(i, 1:count) /FIELD=3 TO 100 /REREAD.
2595 END LOOP.
2596 PRINT m.
2597 END MATRIX.
2598 ])
2599 AT_CHECK([pspp matrix.sps], [0], [dnl
2600 x
2601   9
2602   8
2603   7
2604   6
2605
2606 x
2607   1  2  3
2608   4  5  6
2609   7  8  9
2610
2611 x
2612   10  11  12  13
2613   14  15  16  17
2614
2615 x
2616   10  18  12  13
2617   14  19  16  17
2618
2619 x
2620   20  21  22  23
2621   14  19  16  17
2622
2623 x
2624    1   2   3   4   5   6
2625    7   8   8   9  10  11
2626
2627 x
2628   1  2  3
2629   4  5  6
2630
2631 x
2632   1  2  3  4
2633   5  6  7  8
2634
2635 x
2636   1  2  3  4
2637   5  6  7  8
2638
2639 x
2640  abc def ghi jkl
2641  ABC DEF GHI JKL
2642
2643 y
2644    2   3   5   7
2645   11  13  17  19
2646   23  29  31  37
2647   41  43  47  53
2648
2649 m
2650   5  0  0  0  0
2651   1  2  3  0  0
2652   6 -1  2  5  1
2653   8  9  0  0  0
2654   1  3  2  0  0
2655 ])
2656 AT_CLEANUP
2657
2658 AT_SETUP([MATRIX - READ - negative])
2659 AT_DATA([matrix.sps], [dnl
2660 MATRIX.
2661 READ !.
2662 READ x/FILE=!.
2663 READ x/ENCODING=!.
2664 READ x/FIELD=!.
2665 READ x/FIELD=1 !.
2666 READ x/FIELD=1 TO !.
2667 READ x/FIELD=1 TO 0.
2668 READ x/FIELD=1 TO 10 BY !.
2669 READ x/FIELD=1 TO 10 BY 6.
2670 READ x/SIZE=!.
2671 READ x/MODE=!.
2672 READ x/FORMAT=!.
2673 READ x/FORMAT=F8.2/FORMAT=F8.2.
2674 READ x/FORMAT='5XYZZY'.
2675 READ x/FORMAT=XYZZY.
2676 READ x/!.
2677 READ x.
2678 READ x/FIELD=1 TO 10.
2679 READ x/FIELD=1 TO 10/SIZE={1,2}.
2680 READ x/FIELD=1 TO 10/SIZE={1,2}/FILE='xyzzy.txt'/FORMAT='15F'.
2681 READ x/FIELD=1 TO 10 BY 2/SIZE={1,2}/FILE='xyzzy.txt'/FORMAT=F5.
2682 READ x/FIELD=1 TO 10 BY 2/SIZE={1,2}/FILE='xyzzy.txt'/FORMAT='2F'.
2683 READ x/FIELD=1 TO 10/SIZE={1,2;3,4}/FILE='matrix.txt'.
2684 READ x/FIELD=1 TO 10/SIZE={1,2,3}/FILE='matrix.txt'.
2685 READ x/FIELD=1 TO 10/SIZE={-1}/FILE='matrix.txt'.
2686 COMPUTE x={1,2,3}.
2687 READ x(:,:)/FIELD=1 TO 10/SIZE={2,2}/FILE='matrix.txt'.
2688 READ x/FIELD=1 TO 10/SIZE={1,3}/FILE='matrix.txt'/MODE=SYMMETRIC.
2689 READ x/FIELD=1 TO 10/SIZE=2/FILE='matrix.txt'.
2690 END MATRIX.
2691 ])
2692 AT_DATA([matrix.txt], [dnl
2693 xyzzy
2694 .
2695 ])
2696 AT_CHECK([pspp matrix.sps], [1], [dnl
2697 matrix.sps:2.6: error: READ: Syntax error at `!': expecting identifier.
2698
2699 matrix.sps:3.13: error: READ: Syntax error at `!': expecting a file name or
2700 handle name.
2701
2702 matrix.sps:4.17: error: READ: Syntax error at `!': expecting string.
2703
2704 matrix.sps:5.14: error: READ: Syntax error at `!': Expected positive integer
2705 for FIELD.
2706
2707 matrix.sps:6.16: error: READ: Syntax error at `!': expecting `TO'.
2708
2709 matrix.sps:7.19: error: READ: Syntax error at `!': Expected positive integer
2710 for TO.
2711
2712 matrix.sps:8.19: error: READ: Syntax error at `0': Expected positive integer
2713 for TO.
2714
2715 matrix.sps:9.25: error: READ: Syntax error at `!': Expected integer between 1
2716 and 10 for BY.
2717
2718 matrix.sps:10: error: READ: BY 6 does not evenly divide record width 10.
2719
2720 matrix.sps:11.13: error: READ: Syntax error at `!'.
2721
2722 matrix.sps:12.13: error: READ: Syntax error at `!': expecting RECTANGULAR or
2723 SYMMETRIC.
2724
2725 matrix.sps:13.15: error: READ: Syntax error at `!': expecting identifier.
2726
2727 matrix.sps:14: error: READ: Subcommand FORMAT may only be specified once.
2728
2729 matrix.sps:15.15-15.22: error: READ: Syntax error at `'5XYZZY'': Unknown format
2730 XYZZY.
2731
2732 matrix.sps:16: error: READ: Unknown format type `XYZZY'.
2733
2734 matrix.sps:17.8: error: READ: Syntax error at `!': expecting FILE, FIELD, MODE,
2735 REREAD, or FORMAT.
2736
2737 matrix.sps:18: error: READ: Required subcommand FIELD was not specified.
2738
2739 matrix.sps:19: error: READ: SIZE is required for reading data into a full
2740 matrix (as opposed to a submatrix).
2741
2742 matrix.sps:20: error: READ: Required subcommand FILE was not specified.
2743
2744 matrix.sps:21: error: READ: 15 repetitions cannot fit in record width 10.
2745
2746 matrix.sps:22: error: READ: FORMAT specifies field width 5 but BY specifies 2.
2747
2748 matrix.sps:23: error: READ: FORMAT specifies 2 repetitions with record width
2749 10, which implies field width 5, but BY specifies field width 2.
2750
2751 matrix.sps:24: error: MATRIX: SIZE must evaluate to a scalar or a 2-element
2752 vector, not a 2×2 matrix.
2753
2754 matrix.sps:25: error: MATRIX: SIZE must evaluate to a scalar or a 2-element
2755 vector, not a 1×3 matrix.
2756
2757 matrix.sps:26: error: MATRIX: Matrix dimensions -1×1 specified on SIZE are
2758 outside valid range.
2759
2760 matrix.sps:28: error: MATRIX: Matrix dimensions 2×2 specified on SIZE differ
2761 from submatrix dimensions 1×3.
2762
2763 matrix.sps:29: error: MATRIX: Cannot read non-square 1×3 matrix using READ with
2764 MODE=SYMMETRIC.
2765
2766 matrix.txt:1.1-1.4: warning: Error reading "xyzzy" as format F for matrix row
2767 1, column 1: Field contents are not numeric.
2768
2769 matrix.txt:2.1: warning: Error reading "." as format F for matrix row 2, column
2770 1: Matrix data may not contain missing value.
2771 ])
2772 AT_CLEANUP
2773
2774 AT_SETUP([MATRIX - WRITE])
2775 AT_DATA([matrix.sps], [dnl
2776 MATRIX.
2777 WRITE {1.5, 2; 3, 4.12345}/OUTFILE='matrix.txt'/FIELD=1 TO 80.
2778 WRITE {1.5, 2; 3, 4.12345}/OUTFILE='matrix.txt'/FIELD=1 TO 5.
2779 WRITE {1, 2; 3, 4}/OUTFILE='matrix.txt'/FIELD=1 TO 80 BY 5.
2780 WRITE {1, 2; 3, 4}/OUTFILE='matrix.txt'/FIELD=1 TO 80/FORMAT=F8.2.
2781 WRITE {1, 2; 3, 4}/OUTFILE='matrix.txt'/FIELD=1 TO 80/FORMAT=E.
2782 WRITE {1, 2; 3, 4}/OUTFILE='matrix.txt'/FIELD=1 TO 10 BY 10/FORMAT=E.
2783 WRITE "abcdefhi"/OUTFILE='matrix.txt'/FIELD=1 TO 80/FORMAT=A8.
2784 WRITE "abcdefhi"/OUTFILE='matrix.txt'/FIELD=1 TO 80/FORMAT=A4.
2785 WRITE "abcdefhi"/OUTFILE='matrix.txt'/FIELD=1 TO 80/FORMAT=AHEX12.
2786 END MATRIX.
2787 ])
2788 AT_CHECK([pspp matrix.sps])
2789 AT_CHECK([cat matrix.txt], [0], [dnl
2790  1.5 2
2791  3 4.12345
2792  1.5 2
2793  3
2794  4.12345
2795      1    2
2796      3    4
2797      1.00    2.00
2798      3.00    4.00
2799  1 2
2800  3 4
2801     1.E+000
2802     2.E+000
2803     3.E+000
2804     4.E+000
2805  abcdefhi
2806  abcd
2807  616263646566
2808 ])
2809 AT_CLEANUP
2810
2811 AT_SETUP([MATRIX - WRITE - negative])
2812 AT_DATA([matrix.sps], [dnl
2813 MATRIX.
2814 WRITE !.
2815 WRITE 1/OUTFILE=!.
2816 WRITE 1/ENCODING=!.
2817 WRITE 1/FIELD=!.
2818 WRITE 1/FIELD=1 !.
2819 WRITE 1/FIELD=1 TO 0.
2820 WRITE 1/FIELD=1 TO 10 BY 20.
2821 WRITE 1/FIELD=1 TO 10 BY 6.
2822 WRITE 1/MODE=TRAPEZOIDAL.
2823 WRITE 1/FORMAT=F5/FORMAT=F5.
2824 WRITE 1/FORMAT='5ASDF'.
2825 WRITE 1/FORMAT=ASDF5.
2826 WRITE 1/!.
2827 WRITE 1.
2828 WRITE 1/FIELD=1 TO 10.
2829 WRITE 1/FIELD=1 TO 10/OUTFILE='matrix.txt'/FORMAT='15F'.
2830 WRITE 1/FIELD=1 TO 10 BY 5/OUTFILE='matrix.txt'/FORMAT='5F'.
2831 WRITE 1/FIELD=1 TO 10 BY 5/OUTFILE='matrix.txt'/FORMAT=E.
2832 WRITE 1/FIELD=1 TO 10/OUTFILE='matrix.txt'/FORMAT=A9.
2833 WRITE {1,2}/FIELD=1 TO 10/OUTFILE='matrix.txt'/MODE=TRIANGULAR.
2834 END MATRIX.
2835 ])
2836 AT_CHECK([pspp matrix.sps], [1], [dnl
2837 matrix.sps:2.7: error: WRITE: Syntax error at `!'.
2838
2839 matrix.sps:3.17: error: WRITE: Syntax error at `!': expecting a file name or
2840 handle name.
2841
2842 matrix.sps:4.18: error: WRITE: Syntax error at `!': expecting string.
2843
2844 matrix.sps:5.15: error: WRITE: Syntax error at `!': Expected positive integer
2845 for FIELD.
2846
2847 matrix.sps:6.17: error: WRITE: Syntax error at `!': expecting `TO'.
2848
2849 matrix.sps:7.20: error: WRITE: Syntax error at `0': Expected positive integer
2850 for TO.
2851
2852 matrix.sps:8.26-8.27: error: WRITE: Syntax error at `20': Expected integer
2853 between 1 and 10 for BY.
2854
2855 matrix.sps:9: error: WRITE: BY 6 does not evenly divide record width 10.
2856
2857 matrix.sps:10.14-10.24: error: WRITE: Syntax error at `TRAPEZOIDAL': expecting
2858 RECTANGULAR or TRIANGULAR.
2859
2860 matrix.sps:11: error: WRITE: Subcommand FORMAT may only be specified once.
2861
2862 matrix.sps:12.16-12.22: error: WRITE: Syntax error at `'5ASDF'': Unknown format
2863 ASDF.
2864
2865 matrix.sps:13: error: WRITE: Unknown format type `ASDF'.
2866
2867 matrix.sps:14.9: error: WRITE: Syntax error at `!': expecting OUTFILE, FIELD,
2868 MODE, HOLD, or FORMAT.
2869
2870 matrix.sps:15: error: WRITE: Required subcommand FIELD was not specified.
2871
2872 matrix.sps:16: error: WRITE: Required subcommand OUTFILE was not specified.
2873
2874 matrix.sps:17: error: WRITE: 15 repetitions cannot fit in record width 10.
2875
2876 matrix.sps:18: error: WRITE: FORMAT specifies 5 repetitions with record width
2877 10, which implies field width 2, but BY specifies field width 5.
2878
2879 matrix.sps:19: error: WRITE: Output format E5.0 specifies width 5, but E
2880 requires a width between 6 and 40.
2881
2882 matrix.sps:20: error: WRITE: Format A9 is too wide for 8-byte matrix eleemnts.
2883
2884 matrix.sps:21: error: MATRIX: WRITE with MODE=TRIANGULAR requires a square
2885 matrix but the matrix to be written has dimensions 1×2.
2886 ])
2887 AT_CLEANUP