Chapter 2, Building Abstractions with Data
Section - 2.2 - Hierarchical Data and the Closure Property
Exercise 2.37
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
#lang sicp
(define (accumulate op initial sequence)
(if (null? sequence)
initial
(op (car sequence)
(accumulate op initial (cdr sequence))
)
)
)
(define (accumulate-n op init seqs)
(if (null? (car seqs))
nil
(cons (accumulate op init (map car seqs))
(accumulate-n op init (map cdr seqs))
)
)
)
(define (dot-product v w)
(accumulate + 0 (map * v w))
)
(define (matrix-*-vector m v)
(map
(lambda (x)
(dot-product x v)
)
m
)
)
(define (transpose mat)
(accumulate-n cons '() mat)
)
(define (matrix-*-matrix m n)
(let (
(cols (transpose n))
)
(map
(lambda (v)
(matrix-*-vector cols v)
)
m
)
)
)
Example/Output:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
> (define zero-vector (list 0 0 0))
> (define one-vector (list 1 1 1))
> (define a (list 1 2 3))
> (display (dot-product zero-vector a))
0
> (display (dot-product one-vector a))
6
> (define b (list 10 20 30))
> (display (dot-product a b))
140
> (define one-matrix (list (list 1 1 1) (list 1 1 1) (list 1 1 1)))
> (define zero-matrix (list (list 0 0 0) (list 0 0 0) (list 0 0 0)))
> (define A (list (list 2 3 0) (list -3 4 5) (list 6 -2 1)))
> (define B (list (list 7 2 3 8) (list 9 -1 -4 4) (list 5 -3 1 0)))
> (display (matrix-*-vector A zero-vector))
(0 0 0)
> (display (matrix-*-vector A one-vector))
(5 6 5)
> (display (matrix-*-vector A a))
(8 20 5)
> (display (matrix-*-matrix A zero-matrix))
((0 0 0) (0 0 0) (0 0 0))
> (display (matrix-*-matrix A one-matrix))
((5 5 5) (6 6 6) (5 5 5))
> (display (matrix-*-matrix A B))
((41 1 -6 28) (40 -25 -20 -8) (29 11 27 40))