2 ;;; macros, functions and methods for matrix element access
4 ;;; Copyright (c) 2004-2006 Cyrus Harmon (ch-lisp@bobobeach.com)
5 ;;; All rights reserved.
7 ;;; Redistribution and use in source and binary forms, with or without
8 ;;; modification, are permitted provided that the following conditions
11 ;;; * Redistributions of source code must retain the above copyright
12 ;;; notice, this list of conditions and the following disclaimer.
14 ;;; * Redistributions in binary form must reproduce the above
15 ;;; copyright notice, this list of conditions and the following
16 ;;; disclaimer in the documentation and/or other materials
17 ;;; provided with the distribution.
19 ;;; THIS SOFTWARE IS PROVIDED BY THE AUTHOR 'AS IS' AND ANY EXPRESSED
20 ;;; OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
21 ;;; WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
22 ;;; ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY
23 ;;; DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
24 ;;; DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE
25 ;;; GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
26 ;;; INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
27 ;;; WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
28 ;;; NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
29 ;;; SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
34 ;;; slow fallback methods
36 (defmethod sum ((m matrix
))
37 (destructuring-bind (mr mc
) (dim m
)
38 (sum-range m
0 (- mr
1) 0 (- mc
1))))
40 (defmethod sum-cols ((m matrix
) &key
(matrix-class (class-of m
)))
41 (let ((mr (rows m
)) (mc (cols m
)))
42 (let ((n (make-instance matrix-class
:rows
1 :cols mc
)))
45 (incf (mref n
0 j
) (mref m i j
))))
48 (defmethod sum-rows ((m matrix
) &key
(matrix-class (class-of m
)))
49 (let ((mr (rows m
)) (mc (cols m
)))
50 (let ((n (make-instance matrix-class
:rows mr
:cols
1)))
53 (incf (mref n i
0) (mref m i j
))))
56 (defmethod sum-square-range ((m matrix
) (startr fixnum
) (endr fixnum
) (startc fixnum
) (endc fixnum
))
57 (declare (dynamic-extent startr endr startc endc
)
58 (fixnum startr endr startc endc
))
60 (map-range m startr endr startc endc
62 (declare (ignore i j
))
66 (defmethod sum-square ((m matrix
))
67 (destructuring-bind (mr mc
) (dim m
)
68 (sum-square-range m
0 (- mr
1) 0 (- mc
1))))
70 (defmethod sum-range ((m matrix
) (startr fixnum
) (endr fixnum
) (startc fixnum
) (endc fixnum
))
71 (declare (dynamic-extent startr endr startc endc
)
72 (fixnum startr endr startc endc
))
74 (map-range m startr endr startc endc
76 (declare (ignore i j
))
80 (defmethod mean-range ((m matrix
) startr endr startc endc
)
81 (double-float-divide (sum-range m startr endr startc endc
)
82 (count-range startr endr startc endc
)))
84 (defmethod mean ((m matrix
))
85 (destructuring-bind (mr mc
) (dim m
)
86 (mean-range m
0 (- mr
1) 0 (- mc
1))))
88 (defmethod variance-range ((m matrix
) startr endr startc endc
)
89 (declare (dynamic-extent startr endr startc endc
)
90 (fixnum startr endr startc endc
))
91 (let ((mu (mean-range m startr endr startc endc
)))
92 (let ((musq (* mu mu
)))
93 (let ((ssr (sum-square-range m startr endr startc endc
)))
94 (let ((cr (count-range startr endr startc endc
)))
96 (- (double-float-divide ssr cr
)
99 (defmethod variance ((m matrix
))
100 (destructuring-bind (mr mc
) (dim m
)
101 (variance-range m
0 (- mr
1) 0 (- mc
1))))
103 (defmethod sample-variance-range ((m matrix
) startr endr startc endc
)
105 (mu (mean-range m startr endr startc endc
))
107 (map-range m startr endr startc endc
109 (declare (ignore i j
))
110 (incf acc
(- (* v v
) musq
))))
111 (double-float-divide acc
(1- (count-range startr endr startc endc
)))))
113 (defmethod sample-variance ((m matrix
))
114 (destructuring-bind (mr mc
) (dim m
)
115 (sample-variance-range m
0 (- mr
1) 0 (- mc
1))))
117 ;;; faster type-specific methods
119 (defmacro %%sum-range
(m startr endr startc endc element-type accumulator-type
)
120 `(let ((acc (coerce 0 ',accumulator-type
))
121 (a (matrix-vals ,m
)))
122 (declare (type ,accumulator-type acc
)
123 (type (simple-array ,element-type
*) a
))
124 (do ((i ,startr
(1+ i
)))
126 (declare (dynamic-extent i
) (type fixnum i
))
127 (do ((j ,startc
(1+ j
)))
129 (declare (dynamic-extent j
) (type fixnum j
))
130 (setf acc
(+ acc
(aref a i j
)))))
134 ((frob-sum-range (matrix-type accumulator-type
)
135 (let ((element-type (element-type (find-class matrix-type
))))
136 `(defmethod sum-range ((m ,matrix-type
)
137 (startr fixnum
) (endr fixnum
)
138 (startc fixnum
) (endc fixnum
))
139 (%%sum-range m startr endr startc endc
140 ,element-type
,accumulator-type
)))))
141 (frob-sum-range double-float-matrix double-float
)
142 (frob-sum-range single-float-matrix single-float
)
144 (frob-sum-range ub8-matrix
(unsigned-byte 32))
145 (frob-sum-range ub16-matrix
(unsigned-byte 32))
146 (frob-sum-range ub32-matrix
(unsigned-byte 32))
148 (frob-sum-range sb8-matrix
(signed-byte 32))
149 (frob-sum-range sb16-matrix
(signed-byte 32))
150 (frob-sum-range sb32-matrix
(signed-byte 32))
152 (frob-sum-range fixnum-matrix
(signed-byte 32))
153 (frob-sum-range bit-matrix
(signed-byte 32)))
157 ((frob-sum-square-range (matrix-type accumulator-type
)
158 (let ((element-type (element-type (find-class matrix-type
))))
159 `(defmethod sum-square-range ((m ,matrix-type
) (startr fixnum
) (endr fixnum
) (startc fixnum
) (endc fixnum
))
160 (let ((acc (coerce 0 ',accumulator-type
))
162 (declare (type ,accumulator-type acc
)
163 (type (simple-array ,element-type
*) a
))
164 (do ((i startr
(1+ i
)))
166 (declare (dynamic-extent i
) (type fixnum i
))
167 (do ((j startc
(1+ j
)))
169 (declare (dynamic-extent j
) (type fixnum j
))
170 (incf acc
(* (aref a i j
) (aref a i j
)))))
173 (frob-sum-square-range double-float-matrix double-float
)
174 (frob-sum-square-range single-float-matrix single-float
)
176 (frob-sum-square-range ub8-matrix
(unsigned-byte 32))
177 (frob-sum-square-range ub16-matrix
(unsigned-byte 32))
178 (frob-sum-square-range ub32-matrix
(unsigned-byte 32))
180 (frob-sum-square-range sb8-matrix
(signed-byte 32))
181 (frob-sum-square-range sb16-matrix
(signed-byte 32))
182 (frob-sum-square-range sb32-matrix
(signed-byte 32))
184 (frob-sum-square-range fixnum-matrix
(signed-byte 32))
185 (frob-sum-square-range bit-matrix
(signed-byte 32)))