Blob


1 (define (test-case actual expected)
2 (newline)
3 (display "Actual: ")
4 (display actual)
5 (newline)
6 (display "Expected: ")
7 (display expected)
8 (newline))
10 (define (accumulate op initial sequence)
11 (if (null? sequence)
12 initial
13 (op (car sequence)
14 (accumulate op initial (cdr sequence)))))
16 (define (accumulate-n op init seqs)
17 (if (null? (car seqs))
18 '()
19 (cons (accumulate op init (map car seqs))
20 (accumulate-n op init (map cdr seqs)))))
22 (define (dot-product v w)
23 (accumulate + 0 (map * v w)))
25 (define (matrix-*-vector m v)
26 (map (lambda (row)
27 (dot-product row v))
28 m))
30 (define (transpose mat)
31 (accumulate-n cons '() mat))
33 (define (matrix-*-matrix m n)
34 (let ((cols (transpose n)))
35 (map (lambda (m-row)
36 (matrix-*-vector cols m-row))
37 m)))
39 (define m1 '((1 2 3) (4 5 6) (7 8 9)))
40 (define m2 '((3 1 9) (3 -2 -4) (7 0 5)))
41 (define m3 '((30 36 42) (66 81 96) (102 126 150)))
42 (define m4 '((3 1 9 -5 -2 1)
43 (3 -2 -4 0 4 8)
44 (7 0 5 2 3 6)))
45 (define m5 '((1 5 4)
46 (2 -1 -3)
47 (0 5 0)
48 (-4 0 8)
49 (5 -1 -2)
50 (-3 -2 6)))
51 (define m6 '((12 59 -21)
52 (-5 -23 58)
53 (-4 45 74)))
54 (define m7 '((1 2 0 -4 5 -3)
55 (5 -1 5 0 -1 -2)
56 (4 -3 0 8 -2 6)))
57 (define m8 '((3 3 7)
58 (1 -2 0)
59 (9 -4 5)
60 (-5 0 2)
61 (-2 4 3)
62 (1 8 6)))
63 (define v1 '(1 2 3))
64 (define v2 '(14 32 50))
65 (define v3 '(2 -1 4))
66 (define v4 '(41 -8 34))
68 (test-case (matrix-*-vector m1 v1) v2)
69 (test-case (matrix-*-vector m2 v3) v4)
72 (test-case (transpose m5) m7)
73 (test-case (transpose m4) m8)
75 (test-case (matrix-*-matrix m1 m1) m3)
76 (test-case (matrix-*-matrix m4 m5) m6)