]> git.rkrishnan.org Git - sicp.git/blob - src/sicp/ex2_37.clj
Solutions to 4.27, 4.28 and 4.29.
[sicp.git] / src / sicp / ex2_37.clj
1 (ns sicp.ex2_37
2   (:use [clojure.test]
3         [sicp [ch2-2 :only (accumulate)]
4               [ex2_36 :only (accumulate-n)]]))
5
6 ;; (define (dot-product v w)
7 ;;  (accumulate + 0 (map * v w)))
8 (defn dot-product [v w]
9   (accumulate + 0 (map * v w)))
10
11 (deftest test-dot-prod
12   (let [v '(1 2 3)
13         w '(10 20 30)]
14     (is [= (dot-product v w)
15            140])))
16
17 ;; (define (matrix-*-vector m v)
18 ;;   (map <??> m))
19 (defn matrix-*-vector [m v]
20   (map (fn [r] (dot-product r v)) m))
21
22 (deftest test-matrix*-vector
23   (let [m '((1 2 3) (4 5 6) (7 8 9))
24         v '(1 1 1)]
25     (is [= (matrix-*-vector m v)
26            '(6 15 24)])))
27
28 ;; (define (transpose mat)
29 ;;   (accumulate-n <??> <??> mat))
30 (defn transpose [mat]
31   (accumulate-n cons nil mat))
32
33 (deftest test-transpose
34   (let [s '((1 2 3) (4 5 6) (7 8 9))]
35     (is [= (transpose s)
36            '((1 4 7) (2 5 8) (3 6 9))])))
37
38 ;; (define (matrix-*-matrix m n)
39 ;;   (let ((cols (transpose n)))
40 ;;     (map <??> m)))
41 (defn matrix-*-matrix [m n]
42   (let [cols (transpose n)]
43     (map (fn [v]
44            (matrix-*-vector cols v))
45          m)))
46
47 (deftest test-matrix-*-matrix
48   (are [x y] [= x y]
49        (matrix-*-matrix '((8 9) (5 -1)) '((-2 3) (4 0))) '((20 24) (-14 15))
50        (matrix-*-matrix '((0 -1 2) (4 11 2)) '((3 -1) (1 2) (6 1))) '((11 0) (35 20))))