diff scripts/statistics/base/skewness.m @ 12656:6b2f14af2360

Overhaul functions in statistics/base directory. Widen input validation to accept logicals. Return correct class of output, e.g., 'single' depending on class of input. Correct or add tests for above. * center.m, cov.m, kendall.m, mean.m, meansq.m, median.m, mode.m, prctile.m, quantile.m, ranks.m, run_count.m, runlength.m, spearman.m, statistics.m, std.m, var.m, logistic_inv.m: Overhaul as described above * corrcoef.m: Overhaul + remove input validation already done by cov(). * cor.m, logit.m, ppplot.m, table.m: Only align test blocks. * gls.m, ols.m: Only correct class of output, no logical inputs for regression. * histc.m: Only change spacing of code to be uniform. * iqr.m: Overhaul + 2X speedup by calling empirical_inv just once. * kurtosis.m: Overhaul + replace repmat instances with center(). * mahalanobis.m: Overhaul + use bsxfun for centering data. * moment.m: Overhaul + replace repmat instances with center(). * probit.m, range.m: Redo input validation and add tests. * skewness.m: Overhaul + replace repmat instances with center(). * zscore.m: Overhaul + replace repmat instances with center() + use bsxfun.
author Rik <octave@nomad.inbox5.com>
date Sat, 07 May 2011 14:52:08 -0700
parents d0b799dafede
children 984359717d71
line wrap: on
line diff
--- a/scripts/statistics/base/skewness.m	Sat May 07 14:30:20 2011 -0700
+++ b/scripts/statistics/base/skewness.m	Sat May 07 14:52:08 2011 -0700
@@ -51,7 +51,7 @@
     print_usage ();
   endif
 
-  if (!isnumeric(x))
+  if (! (isnumeric (x) || islogical (x)))
     error ("skewness: X must be a numeric vector or matrix");
   endif
 
@@ -59,10 +59,7 @@
   sz = size (x);
   if (nargin != 2)
     ## Find the first non-singleton dimension.
-    dim = find (sz > 1, 1);
-    if (isempty (dim))
-      dim = 1;
-    endif
+    (dim = find (sz > 1, 1)) || (dim = 1);
   else
     if (!(isscalar (dim) && dim == round (dim))
         || !(1 <= dim && dim <= nd))
@@ -70,19 +67,18 @@
     endif
   endif
 
-  c = sz(dim);
-  idx = ones (1, nd);
-  idx(dim) = c;
-  x = x - repmat (mean (x, dim), idx);
+  n = sz(dim);
   sz(dim) = 1;
+  x = center (x, dim);  # center also promotes integer to double for next line
   retval = zeros (sz, class (x));
   s = std (x, [], dim);
-  ind = find (s > 0);
+  idx = find (s > 0);
   x = sum (x .^ 3, dim);
-  retval(ind) = x(ind) ./ (c * s(ind) .^ 3);
+  retval(idx) = x(idx) ./ (n * s(idx) .^ 3);
 
 endfunction
 
+
 %!assert(skewness ([-1,0,1]), 0);
 %!assert(skewness ([-2,0,1]) < 0);
 %!assert(skewness ([-1,0,2]) > 0);
@@ -92,10 +88,12 @@
 %! y = [x, 2*x];
 %! assert(all (abs (skewness (y) - [0.75, 0.75]) < sqrt (eps)));
 
+%!assert (skewness (single(1)), single(0));
+
 %% Test input validation
 %!error skewness ()
 %!error skewness (1, 2, 3)
-%!error skewness ([true true])
+%!error skewness (['A'; 'B'])
 %!error skewness (1, ones(2,2))
 %!error skewness (1, 1.5)
 %!error skewness (1, 0)