SICP問題2.37
ベクトルv*ベクトルw (ドット積(内積))の定義(教科書で定義済)
(define (dot-product v w) (accumulate + 0 (map * v w)))
行列m*ベクトルvの定義
(define (matrix-*-vector m v) (map (lambda (x) (dot-product x v)) m))
置換行列
(define (transpose mat) (accumulate-n cons () mat))
行列m*行列n
(define (matrix-*-matrix m n) (let ((cols (transpose n))) (map (lambda (v) (matrix-*-vector cols v)) m)))
テスト
(define m (list (list 1 2 3) (list 4 5 6) (list 7 8 9))) ; ((1 2 3) (4 5 6) (7 8 9)) (matrix-*-vector m (list 2 5 7)) ; 答えは以下のようになるはず ; (list (+ (* 1 2) (* 2 5) (* 3 7)) ; (+ (* 4 2) (* 5 5) (* 6 7)) ; (+ (* 7 2) (* 8 5) (* 9 7))) ; (33 75 117) (transpose m) ; ((1 4 7) (2 5 8) (3 6 9)) (define n (list (list 10 11) (list 12 13) (list 14 15))) (matrix-*-matrix m n) ; 答えは以下のリストと同じ ; (list (list (+ (* 1 10) (* 2 12) (* 3 14)) (+ (* 1 11) (* 2 13) (* 3 15))) ; (list (+ (* 4 10) (* 5 12) (* 6 14)) (+ (* 4 11) (* 5 13) (* 6 15))) ; (list (+ (* 7 10) (* 8 12) (* 9 14)) (+ (* 7 11) (* 8 13) (* 9 15)))) ; ((76 82) (184 199) (292 316))