Exercise 2.37

matrix algebraてなんだ……線形代数
テライミフw シグマとかやめてよもー
というわけで問題で何をさせたいかよーわからん(なんとなくはわかるが)
ので問題意図だけチート。


http:/www.csus4.net/hiki/SICPReading/?FujimotoHisa#l38
よりテストケースを引用。

 (define (test-2.37)
   (use gauche.test)
   (test* "dot-product" (+ 2 6 12 20)
          (dot-product '(1 2 3 4) '(2 3 4 5)))
   (test* "matrix-*-vector" (list (+ 1 2 6)
                                  (+ 2 4 9)
                                  (+ 3 6 12)
                                  (+ 4 8 15))
          (matrix-*-vector  '((1 1 2)
                              (2 2 3)
                              (3 3 4)
                              (4 4 5)) '(1 2 3)))
   (test* "matrix-*-vector" '(6 7)
          (matrix-*-vector '((1 1 2) (1 2 2)) '(1 1 2)))
   (test* "transpose" '((1 2 3 4)
                        (1 2 3 4)
                        (2 3 4 5))
          (transpose '((1 1 2)
                       (2 2 3)
                       (3 3 4)
                       (4 4 5))))
   (test* "matrix-*-matrix" 
          (list (list (+ 1 2 6)  (+ 1 2 6)  (+ 1 2 6)  (+ 2 3 8))
                (list (+ 2 4 9)  (+ 2 4 9)  (+ 2 4 9)  (+ 4 6 12))
                (list (+ 3 6 12) (+ 3 6 12) (+ 3 6 12) (+ 6 9 16))
                (list (+ 4 8 15) (+ 4 8 15) (+ 4 8 15) (+ 8 12 20)))
          (matrix-*-matrix  '((1 1 2)
                              (2 2 3)
                              (3 3 4)
                              (4 4 5))
                            '((1 1 1 2)
                              (2 2 2 3)
                              (3 3 3 4)))))

それぞれのtestの上が予想結果、下は呼び出しですね。

dot-productは

(dot-product '(1 2 3 4) '(2 3 4 5))
(+ (* 1 2) (* 2 3) (* 3 4) (* 4 5))
(+ 2 6 12 20)
40

になればおkてことね。ついでにproductは積って意味!
他も大体似たような感じ。ではやってみよう。

(define (matrix-*-vector m v)
  (map (lambda(x)(dot-product v x)) m))

(define (transpose mat)
  (accumulate-n cons '() mat))

(define (matrix-*-matrix m n)
  (let ((cols (transpose n)))
    (map (lambda(x)(matrix-*-vector cols x)) m)))

と思考の跡を書くはずだったがあっさりおわてしまた
(いあここに至るまでしょうもない文法ミス繰り返して結構長時間かかったけど)
てゆか大分関数型の思考に慣れてきた気がする。この例題が簡単なだけですかそーですか