Mercurial > hg > octave-nkf
diff scripts/statistics/base/studentize.m @ 11436:e151e23f73bc
Overhaul base statistics functions and documentation of same.
Add or improve input validation.
Add input validation tests.
Add functional tests.
Improve or re-write documentation strings.
author | Rik <octave@nomad.inbox5.com> |
---|---|
date | Mon, 03 Jan 2011 21:23:08 -0800 |
parents | fe3c3dfc07eb |
children | fd0a3ac60b0e |
line wrap: on
line diff
--- a/scripts/statistics/base/studentize.m +++ b/scripts/statistics/base/studentize.m @@ -18,13 +18,15 @@ ## <http://www.gnu.org/licenses/>. ## -*- texinfo -*- -## @deftypefn {Function File} {} studentize (@var{x}, @var{dim}) +## @deftypefn {Function File} {} studentize (@var{x}) +## @deftypefnx {Function File} {} studentize (@var{x}, @var{dim}) ## If @var{x} is a vector, subtract its mean and divide by its standard ## deviation. ## ## If @var{x} is a matrix, do the above along the first non-singleton -## dimension. If the optional argument @var{dim} is given then operate -## along this dimension. +## dimension. +## If the optional argument @var{dim} is given, operate along this dimension. +## @seealso{center} ## @end deftypefn ## Author: KH <Kurt.Hornik@wu-wien.ac.at> @@ -36,8 +38,12 @@ print_usage (); endif - if (!ismatrix(x) || ischar(x)) - error ("studentize: X must be a numeric matrix or vector"); + if (! isnumeric(x)) + error ("studentize: X must be a numeric vector or matrix"); + endif + + if (isinteger (x)) + x = double (x); endif nd = ndims (x); @@ -49,16 +55,35 @@ dim = 1; endif else - if (!(isscalar (dim) && dim == round (dim)) + if (!(isscalar (dim) && dim == fix (dim)) || !(1 <= dim && dim <= nd)) error ("studentize: DIM must be an integer and a valid dimension"); endif endif c = sz(dim); - idx = ones (1, nd); - idx(dim) = c; - t = x - repmat (mean (x, dim), idx); - t = t ./ repmat (max (cat (dim, std(t, [], dim), ! any (t, dim)), [], dim), idx); + if (c == 0) + t = x; + else + idx = ones (1, nd); + idx(dim) = c; + t = x - repmat (mean (x, dim), idx); + t = t ./ repmat (max (cat (dim, std(t, [], dim), ! any (t, dim)), [], dim), idx); + endif endfunction + +%!assert(studentize ([1,2,3]), [-1,0,1]) +%!assert(studentize (int8 ([1,2,3])), [-1,0,1]) +#%!assert(studentize (ones (3,2,0,2)), zeros (3,2,0,2)) +%!assert(studentize ([2,0,-2;0,2,0;-2,-2,2]), [1,0,-1;0,1,0;-1,-1,1]) + +%% Test input validation +%!error studentize () +%!error studentize (1, 2, 3) +%!error studentize ([true true]) +%!error studentize (1, ones(2,2)) +%!error studentize (1, 1.5) +%!error studentize (1, 0) +%!error studentize (1, 3) +