changeset 7566:b3acdf1c41a5

hist: avoid temps; allow matrix args when number of bins > 30
author John W. Eaton <jwe@octave.org>
date Thu, 06 Mar 2008 13:42:08 -0500
parents 1e6443ff960f
children 6b07c15eb8e1
files scripts/ChangeLog scripts/plot/hist.m
diffstat 2 files changed, 12 insertions(+), 6 deletions(-) [+]
line wrap: on
line diff
--- a/scripts/ChangeLog	Thu Mar 06 13:28:02 2008 -0500
+++ b/scripts/ChangeLog	Thu Mar 06 13:42:08 2008 -0500
@@ -1,5 +1,9 @@
 2008-03-06  John W. Eaton  <jwe@octave.org>
 
+	* plot/hist.m: Avoid temporaries.
+	Allow matrix arguments when number of bins > 30.
+	From Robert S. Mahurin <mahurin@fiver.phys.utk.edu>.
+
 	* plot/ChangeLog: Handle axes linewidth property.
 
 	* plot/__go_draw_axes__.m: Adjust markersize by a factor of 1/6.
--- a/scripts/plot/hist.m	Thu Mar 06 13:28:02 2008 -0500
+++ b/scripts/plot/hist.m	Thu Mar 06 13:42:08 2008 -0500
@@ -97,9 +97,10 @@
 
   cutoff = (x(1:end-1,:) + x(2:end,:)) / 2;
   n = rows (x);
+  y_nc = columns (y);
   if (n < 30 && columns (x) == 1)
     ## The following algorithm works fastest for n less than about 30.
-    chist = zeros (n+1, columns (y));
+    chist = zeros (n+1, y_nc);
     for i = 1:n-1
       chist(i+1,:) = sum (y <= cutoff(i));
     endfor
@@ -108,13 +109,12 @@
     ## The following algorithm works fastest for n greater than about 30.
     ## Put cutoff elements between boundaries, integrate over all
     ## elements, keep totals at boundaries.
-    [s, idx] = sort ([y; cutoff]);
+    [s, idx] = sort ([y; repmat(cutoff, 1, y_nc)]);
     len = rows (y);
     chist = cumsum (idx <= len);
-    t1 = zeros (1, columns (y));
-    t2 = reshape (chist(idx > len), size (cutoff));
-    t3 = chist(end,:) - sum (isnan (y));
-    chist = [t1; t2; t3];
+    chist = [(zeros (1, y_nc));
+	     (reshape (chist(idx > len), rows (cutoff), y_nc));
+	     (chist(end,:) - sum (isnan (y)))];
   endif
 
   freq = diff (chist);
@@ -166,3 +166,5 @@
 %!    assert( sum(hist([1:n], 29)), n);
 %!    assert( sum(hist([1:n], 30)), n);
 %!  endfor
+%!test
+%!  assert (size (hist(randn(750,240), 200)), [200,240]);