wolffd@0: function [me, st, md, no] = nanstats(D) wolffd@0: wolffd@0: %NANSTATS Statistical operations that ignore NaNs and Infs. wolffd@0: % wolffd@0: % [mean, std, median, nans] = nanstats(D) wolffd@0: % wolffd@0: % Input and output arguments: wolffd@0: % D (struct) data or map struct wolffd@0: % (matrix) size dlen x dim wolffd@0: % wolffd@0: % me (double) columnwise mean wolffd@0: % st (double) columnwise standard deviation wolffd@0: % md (double) columnwise median wolffd@0: % no (vector) columnwise number of samples (finite, not-NaN) wolffd@0: wolffd@0: % Contributed to SOM Toolbox vs2, February 2nd, 2000 by Juha Vesanto wolffd@0: % http://www.cis.hut.fi/projects/somtoolbox/ wolffd@0: wolffd@0: % Version 2.0beta juuso 300798 200900 wolffd@0: wolffd@0: %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% wolffd@0: %% check arguments wolffd@0: wolffd@0: (nargchk(1, 1, nargin)); % check no. of input args is correct wolffd@0: wolffd@0: if isstruct(D), wolffd@0: if strcmp(D.type,'som_map'), D = D.codebook; wolffd@0: else D = D.data; wolffd@0: end wolffd@0: end wolffd@0: [dlen dim] = size(D); wolffd@0: me = zeros(dim,1)+NaN; wolffd@0: md = me; wolffd@0: st = me; wolffd@0: no = me; wolffd@0: wolffd@0: %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% wolffd@0: %% computation wolffd@0: wolffd@0: for i = 1:dim, wolffd@0: ind = find(isfinite(D(:, i))); % indices of non-NaN/Inf elements wolffd@0: n = length(ind); % no of non-NaN/Inf elements wolffd@0: wolffd@0: me(i) = sum(D(ind, i)); % compute average wolffd@0: if n == 0, me(i) = NaN; else me(i) = me(i) / n; end wolffd@0: wolffd@0: if nargout>1, wolffd@0: md(i) = median(D(ind, i)); % compute median wolffd@0: wolffd@0: if nargout>2, wolffd@0: st(i) = sum((me(i) - D(ind, i)).^2); % compute standard deviation wolffd@0: if n == 0, st(i) = NaN; wolffd@0: elseif n == 1, st(i) = 0; wolffd@0: else st(i) = sqrt(st(i) / (n - 1)); wolffd@0: end wolffd@0: wolffd@0: if nargout>3, wolffd@0: no(i) = n; % number of samples (finite, not-NaN) wolffd@0: end wolffd@0: end wolffd@0: end wolffd@0: end wolffd@0: wolffd@0: %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% wolffd@0: