interplin3.m (1484B)
1 function ydata=interplin3(x,missval,NotStartEnd) 2 3 % interplin3 4 % 5 % Simple linear interpolation -- replaces NaNs (or missval) 6 % 7 % x=initial vector/matrix (will interpolate each column) 8 % missval = (optional) denotes "missing value", default is NaN 9 % Column by column 10 % 11 % If "NotStartEnd" is absent or zero, missing values at beginning or end 12 % will be replaced with first/last value. 13 % 14 % If NotStartEnd==1, then leaves missing values alone at beginning and end 15 16 if exist('NotStartEnd')==0; 17 NotStartEnd=0; 18 end; 19 20 if exist('missval')==1; % If some number other than NaN denotes missing value 21 x(x==missval)=NaN; % replace it with NaN 22 end; 23 24 [T K]=size(x); 25 if T==1; x=x'; T=length(x); end; % row vector ==> column vector 26 27 xdata=x; 28 29 for c=1:K; % column by column 30 x=xdata(:,c); 31 if ~all(isnan(x)); % Skip column if all values are missing 32 y=x; 33 i0=find(~isnan(x)); 34 iT=i0(length(i0)); % The last valid position 35 i0=i0(1); % The first valid entry 36 37 for i=i0:(iT-1); % position in x 38 if isnan(y(i)); 39 notnan=find(~isnan(x((i+1):iT))); % Next non NaN 40 notnan=notnan(1)+i; 41 points=notnan-i; 42 slope=x(notnan)-x(i-1); 43 dx=slope/(points+1); 44 dx=(1:points)'*dx; 45 y(i:(notnan-1))=dx+x(i-1); 46 end; 47 end; 48 49 ydata(:,c)=y; 50 if ~NotStartEnd; 51 ydata(1:(i0-1),c)=y(i0); % Missing at beginning 52 ydata((iT+1):end,c)=y(iT); % Missing at beginning 53 end; 54 end; 55 end;