smooth2a

PURPOSE ^

Smooths 2D array data. Ignores NaN's.

SYNOPSIS ^

function matrixOut = smooth2a(matrixIn,Nr,Nc)

DESCRIPTION ^

 Smooths 2D array data.  Ignores NaN's.

function matrixOut = smooth2a(matrixIn,Nr,Nc)
 
 This function smooths the data in matrixIn using a mean filter over a
 rectangle of size (2*Nr+1)-by-(2*Nc+1).  Basically, you end up replacing
 element "i" by the mean of the rectange centered on "i".  Any NaN
 elements are ignored in the averaging.  If element "i" is a NaN, then it
 will be preserved as NaN in the output.  At the edges of the matrix,
 where you cannot build a full rectangle, as much of the rectangle that
 fits on your matrix is used (similar to the default on Matlab's builtin
 function "smooth").
 
 "matrixIn": original matrix
 "Nr": number of points used to smooth rows
 "Nc": number of points to smooth columns.  If not specified, Nc = Nr.
 
 "matrixOut": smoothed version of original matrix
 
 
     Written by Greg Reeves, March 2009.
     Division of Biology
     Caltech
 
     Inspired by "smooth2", written by Kelly Hilands, October 2004
     Applied Research Laboratory
     Penn State University
 
     Developed from code written by Olof Liungman, 1997
     Dept. of Oceanography, Earth Sciences Centre
     G�teborg University, Sweden
     E-mail: olof.liungman@oce.gu.se

CROSS-REFERENCE INFORMATION ^

This function calls: This function is called by:

SOURCE CODE ^

0001 function matrixOut = smooth2a(matrixIn,Nr,Nc)
0002 % Smooths 2D array data.  Ignores NaN's.
0003 %
0004 %function matrixOut = smooth2a(matrixIn,Nr,Nc)
0005 %
0006 % This function smooths the data in matrixIn using a mean filter over a
0007 % rectangle of size (2*Nr+1)-by-(2*Nc+1).  Basically, you end up replacing
0008 % element "i" by the mean of the rectange centered on "i".  Any NaN
0009 % elements are ignored in the averaging.  If element "i" is a NaN, then it
0010 % will be preserved as NaN in the output.  At the edges of the matrix,
0011 % where you cannot build a full rectangle, as much of the rectangle that
0012 % fits on your matrix is used (similar to the default on Matlab's builtin
0013 % function "smooth").
0014 %
0015 % "matrixIn": original matrix
0016 % "Nr": number of points used to smooth rows
0017 % "Nc": number of points to smooth columns.  If not specified, Nc = Nr.
0018 %
0019 % "matrixOut": smoothed version of original matrix
0020 %
0021 %
0022 %     Written by Greg Reeves, March 2009.
0023 %     Division of Biology
0024 %     Caltech
0025 %
0026 %     Inspired by "smooth2", written by Kelly Hilands, October 2004
0027 %     Applied Research Laboratory
0028 %     Penn State University
0029 %
0030 %     Developed from code written by Olof Liungman, 1997
0031 %     Dept. of Oceanography, Earth Sciences Centre
0032 %     G�teborg University, Sweden
0033 %     E-mail: olof.liungman@oce.gu.se
0034 
0035 %
0036 % Initial error statements and definitions
0037 %
0038 if nargin < 2, error('Not enough input arguments!'), end
0039 
0040 N(1) = Nr; 
0041 if nargin < 3, N(2) = N(1); else N(2) = Nc; end
0042 
0043 if length(N(1)) ~= 1, error('Nr must be a scalar!'), end
0044 if length(N(2)) ~= 1, error('Nc must be a scalar!'), end
0045 
0046 %
0047 % Building matrices that will compute running sums.  The left-matrix, eL,
0048 % smooths along the rows.  The right-matrix, eR, smooths along the
0049 % columns.  You end up replacing element "i" by the mean of a (2*Nr+1)-by-
0050 % (2*Nc+1) rectangle centered on element "i".
0051 %
0052 [row,col] = size(matrixIn);
0053 eL = spdiags(ones(row,2*N(1)+1),(-N(1):N(1)),row,row);
0054 eR = spdiags(ones(col,2*N(2)+1),(-N(2):N(2)),col,col);
0055 
0056 %
0057 % Setting all "NaN" elements of "matrixIn" to zero so that these will not
0058 % affect the summation.  (If this isn't done, any sum that includes a NaN
0059 % will also become NaN.)
0060 %
0061 A = isnan(matrixIn);
0062 matrixIn(A) = 0;
0063 
0064 %
0065 % For each element, we have to count how many non-NaN elements went into
0066 % the sums.  This is so we can divide by that number to get a mean.  We use
0067 % the same matrices to do this (ie, "eL" and "eR").
0068 %
0069 nrmlize = eL*(~A)*eR;
0070 nrmlize(A) = NaN;
0071 
0072 %
0073 % Actually taking the mean.
0074 %
0075 matrixOut = eL*matrixIn*eR;
0076 matrixOut = matrixOut./nrmlize;
0077 
0078 
0079 
0080 
0081 
0082 
0083 
0084 
0085 
0086 
0087 
0088

Generated on Thu 21-Aug-2014 10:40:31 by m2html © 2005