next up previous
Next: 3 集合の表現 Up: 2 例題:行列表現と演算 Previous: 2.2 リスト行列の転置

2.3 リスト行列の掛け算

行列の掛け算を行う関数m*は,

(defun m* (a b)
  (transpose
   (apply 
    #'mapcar
    #'(lambda (&rest l)
        (mapcar
         #'(lambda (x) (v. x l))
         a)
        )
    b))
  )

(defun v. (a b)
  (apply #'+ (mapcar #'* a b)))
v. は次のようにリストで表現されたベクトルの内積を求めます.

> (v. '(1 2) '(1 2))
5
> (v. '(1 2 3) '(1 2 3))
14
行列の計算を行ってみると,

> (setq a '((1 2) (3 4)))
((1 2) (3 4))
> (transpose a)
((1 3) (2 4))
> (m* a (transpose a))
((5 11) (11 25))
> (m* (transpose a) a)
((10 14) (14 20))
となります.この定義は,行列の大きさに依存しません.

> (setq b '((1 2 3) (4 5 6) (7 8 9)))
((1 2 3) (4 5 6) (7 8 9))
> (transpose b)
((1 4 7) (2 5 8) (3 6 9))
> (m* b b)
((30 36 42) (66 81 96) (102 126 150))
> (m* b (transpose b))
((14 32 50) (32 77 122) (50 122 194))
> (m* (transpose b) b)
((66 78 90) (78 93 108) (90 108 126))


generated through LaTeX2HTML. M.Inaba 平成18年5月6日