Mercurial > hg > octave-lyh
diff scripts/statistics/base/std.m @ 4844:9f7ef92b50b0
[project @ 2004-04-02 17:26:53 by jwe]
author | jwe |
---|---|
date | Fri, 02 Apr 2004 17:26:54 +0000 |
parents | f8dde1807dee |
children | c08cb1098afc |
line wrap: on
line diff
--- a/scripts/statistics/base/std.m +++ b/scripts/statistics/base/std.m @@ -19,6 +19,8 @@ ## -*- texinfo -*- ## @deftypefn {Function File} {} std (@var{x}) +## @deftypefnx {Function File} {} std (@var{x}, @var{opt}) +## @deftypefnx {Function File} {} std (@var{x}, @var{opt}, @var{dim}) ## If @var{x} is a vector, compute the standard deviation of the elements ## of @var{x}. ## @iftex @@ -38,26 +40,50 @@ ## @end ifinfo ## If @var{x} is a matrix, compute the standard deviation for ## each column and return them in a row vector. +## +## The argument @var{opt} determines the type of normalization to use. Valid values +## are +## +## @table @asis +## @item 0: +## normalizes with N-1, provides the square root of best unbiased estimator of +## the variance [default] +## @item 1: +## normalizes with N, this provides the square root of the second moment around +## the mean +## @end table +## +## The third argument @var{dim} determines the dimension along which the standard +## deviation is calculated. ## @end deftypefn ## @seealso{mean and median} ## Author: jwe -function retval = std (a) +function retval = std (a, opt, dim) - if (nargin != 1) - usage ("std (a)"); + if (nargin < 1 || nargin > 3) + usage ("std (a, opt, dim)"); + endif + if nargin < 3 + dim = min(find(size(a)>1)); + if isempty(dim), dim=1; endif; + endif + if ((nargin < 2) || isempty(opt)) + opt = 0; endif - nr = rows (a); - nc = columns (a); - if (nc == 1 && nr == 1) - retval = 0; - elseif (nc == 1 || nr == 1) - n = length (a); - retval = sqrt (sumsq (a - mean (a)) / (n - 1)); - elseif (nr > 1 && nc > 0) - retval = sqrt (sumsq (a - ones (nr, 1) * mean (a)) / (nr - 1)); + sz = size(a); + if (sz (dim) == 1) + retval = zeros(sz); + elseif (numel (a) > 0) + rng = ones (1, length (sz)); + rng (dim) = sz (dim); + if (opt == 0) + retval = sqrt (sumsq (a - repmat(mean (a, dim), rng), dim) / (sz(dim) - 1)); + else + retval = sqrt (sumsq (a - repmat(mean (a, dim), rng), dim) / sz(dim)); + endif else error ("std: invalid matrix argument"); endif