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))