std2.m 1.46 KB
 Simone Liuzzo committed Nov 09, 2018 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 ``````function [y,ok] = std2(varargin) %STD2 Standard deviation, ignoring NaN values. % For vectors, Y = STD2(X) returns the standard deviation. For matrices, % Y is a row vector containing the standard deviation of each column. For % N-D arrays, STD operates along the first non-singleton dimension of X. % % STD2 normalizes Y by N, where N is the sample size. It produces the square % root of the second moment of the sample about its mean. % STD2(X,1) is the same as STD(X). % % Y = STD2(X,0) normalizes by N-1. This is the sqrt of an unbiased estimator % of the variance of the population from which X is drawn, as long as X % consists of independent, identically distributed samples. % % Y = STD2(X,FLAG,DIM) takes the standard deviation along the dimension % DIM of X. Pass in FLAG==1 to use the default normalization by N, or % 0 to use N-1. % % Example: If X = [4 -2 1 % 9 5 7] % then std2(X,0,1) is [3.5355 4.9497 4.2426] and std2(X,0,2) is [3.0 % 2.0] % See also MEAN2. if nargin > 3 x=varargin{1}; w=varargin{2}; dim=varargin{3}; ok=isfinite(x); tile = ones(1,max(ndims(x),dim)); tile(dim) = size(x,dim); threshold=varargin{4}; while true y=sqrt(var2(x,w,dim)); overs=abs(x-repmat(mean2(x,dim),tile)) > repmat(threshold*y,tile); if ~any(overs(:)), break; end ok(overs)=false; x(overs)=NaN; end else y=sqrt(var2(varargin{:})); end``````