36420ab3a9f8840753bb709718e7ab0f3ef65958
[lineal.git] / src / overload / matrices.lisp
blob36420ab3a9f8840753bb709718e7ab0f3ef65958
2 (in-package :lineal.overload)
4 (defstruct mtrix
5 (dimdom 0 :type integer)
6 (dimcodom 0 :type integer)
7 (elems nil :type list))
9 (defun make-mtrix-like (a elems)
10 (make-mtrix
11 :dimdom (mtrix-dimdom a)
12 :dimcodom (mtrix-dimcodom a)
13 :elems elems))
15 (defmethod over-transpose ((u tuple))
16 (make-mtrix
17 :dimdom (tuple-dim u)
18 :dimcodom 1
19 :elems (list (tuple-elems u))))
21 ; Return the transpose of a given matrix.V
22 (defmethod over-transpose ((a mtrix))
23 (make-mtrix
24 :dimdom (mtrix-dimcodom a)
25 :dimcodom (mtrix-dimdom a)
26 :elems (mtrix-transpose (mtrix-elems a))))
28 (defmethod add2n ((a mtrix) (b mtrix))
29 (if (and (= (mtrix-dimdom a) (mtrix-dimdom b))
30 (= (mtrix-dimcodom a) (mtrix-dimcodom b)))
31 (make-mtrix-like
32 a (mtrix-addn (mtrix-elems a)
33 (mtrix-elems b)))))
35 (defmethod subtr2n ((a mtrix) (b mtrix))
36 (if (and (= (mtrix-dimdom a) (mtrix-dimdom b))
37 (= (mtrix-dimcodom a) (mtrix-dimcodom b)))
38 (make-mtrix-like
39 a (mtrix-subtrn (mtrix-elems a)
40 (mtrix-elems b)))))
42 (defmethod mult2n ((a number) (b mtrix))
43 (make-mtrix-like
44 b (scalar-mtrix-multn a (mtrix-elems b))))
46 (defmethod mult2n ((a mtrix) (b number))
47 (make-mtrix-like
48 a (scalar-mtrix-multn b (mtrix-elems a))))
50 (defmethod mult2n ((a mtrix) (b tuple))
51 (if (= (mtrix-dimdom a) (tuple-dim b))
52 (make-tuple
53 :dim (mtrix-dimcodom a) :elems
54 (mtrix-coltuple-multn
55 (mtrix-elems a) (tuple-elems b)))
56 (throw 'over-ex "Bad dimensions for matrix-vector multiplication.")))
58 (defmethod mult2n ((a tuple) (b mtrix))
59 (if (= (tuple-dim a) (mtrix-dimcodom b))
60 (make-tuple
61 :dim (mtrix-dimdom b) :elems
62 (car (mtrix-mult2n
63 (list (tuple-elems a)) (mtrix-elems b))))
64 (throw 'over-ex "Bad dimensions for vector-matrix multiplication.")))
66 (defmethod mult2n ((a mtrix) (b mtrix))
67 (if (= (mtrix-dimdom a) (mtrix-dimcodom b))
68 (make-mtrix
69 :dimdom (mtrix-dimdom b)
70 :dimcodom (mtrix-dimcodom a) :elems
71 (mtrix-mult2n (mtrix-elems a) (mtrix-elems b)))
72 (throw 'over-ex "Mismatched dimensions for matrix multiplication.")))
74 (defmethod divis2n ((a mtrix) (b number))
75 (make-mtrix-like
76 a (scalar-mtrix-multn
77 (/ b) (mtrix-elems a))))