r7861: add histogram function
authorKevin M. Rosenberg <kevin@rosenberg.net>
Mon, 15 Sep 2003 10:10:26 +0000 (10:10 +0000)
committerKevin M. Rosenberg <kevin@rosenberg.net>
Mon, 15 Sep 2003 10:10:26 +0000 (10:10 +0000)
math.lisp
package.lisp

index be89825d27890bc0e6268a751fe363832662ad18..0197d52d5652a9fcdf28f117a309766fc7f9dc12 100644 (file)
--- a/math.lisp
+++ b/math.lisp
   `(if (stringp ,obj)
       (parse-integer ,obj)
      ,obj))
+
+(defun histogram (v n-bins &key min max)
+  (declare (fixnum n-bins))
+  (when (listp v)
+    (setq v (coerce v 'vector)))
+  (when (zerop (length v))
+    (return-from histogram (values nil nil nil)) )
+  (let ((n (length v))
+       (bins (make-array n-bins :element-type 'integer :initial-element 0))
+       found-min found-max)
+    (declare (fixnum n))
+    (unless (and min max)
+      (setq found-min (aref v 0)
+           found-max (aref v 0))
+      (loop for i fixnum from 1 to (1- n)
+         do
+           (let ((x (aref v i)))
+             (cond
+              ((> x found-max)
+               (setq found-max x))
+              ((< x found-min)
+               (setq found-min x)))))
+      (unless min
+       (setq min found-min))
+      (unless max
+       (setq max found-max)))
+    (let ((width (/ (- max min) n-bins)))
+      (setq width (+ width (* double-float-epsilon width)))
+      (dotimes (i n)
+       (let ((bin (nth-value 0 (truncate (- (aref v i) min) width))))
+         (declare (fixnum bin))
+         (when (and (not (minusp bin))
+                    (< bin n-bins))
+           (incf (aref bins bin))))))
+    (values bins min max)))
+             
index fb555be72e8ca721a8f7c50e06163928eaf905cb..803dc120129513310530598a40eb0444d138b716 100644 (file)
    
    ;; math.lisp
    #:ensure-integer
+   #:histogram
    
    ;; macros.lisp
    #:time-iterations