Home > voicebox > nearnonz.m

nearnonz

PURPOSE ^

NEARNONZ replace each zero element with the nearest non-zero element [V,Y,W]=nearnonz(X,D)

SYNOPSIS ^

function [v,y,w]=nearnonz(x,d)

DESCRIPTION ^

NEARNONZ replace each zero element with the nearest non-zero element [V,Y,W]=nearnonz(X,D)

  Inputs:  x         input vector, matrix or larger array
           d         dimension to apply filter along [default 1st non-singleton]

 Outputs:  v         v is the same size as x but with each zero entry replaced by
                     the nearest non-zero value along dimension d
                     elements equidistant from two non-zero entries will be taken
                     from the higher index
           y         y is the same size as x and gives the index along dimension d
                     from which the corresponding entry in v was taken
                     If there are no non-zero entries, then the corresponding
                     elements of y will be zero.
           w         w is the same size as x and gives the distance (+ or -) to the
                     nearest non-zero entry in x

CROSS-REFERENCE INFORMATION ^

This function calls: This function is called by:

SOURCE CODE ^

0001 function [v,y,w]=nearnonz(x,d)
0002 %NEARNONZ replace each zero element with the nearest non-zero element [V,Y,W]=nearnonz(X,D)
0003 %
0004 %  Inputs:  x         input vector, matrix or larger array
0005 %           d         dimension to apply filter along [default 1st non-singleton]
0006 %
0007 % Outputs:  v         v is the same size as x but with each zero entry replaced by
0008 %                     the nearest non-zero value along dimension d
0009 %                     elements equidistant from two non-zero entries will be taken
0010 %                     from the higher index
0011 %           y         y is the same size as x and gives the index along dimension d
0012 %                     from which the corresponding entry in v was taken
0013 %                     If there are no non-zero entries, then the corresponding
0014 %                     elements of y will be zero.
0015 %           w         w is the same size as x and gives the distance (+ or -) to the
0016 %                     nearest non-zero entry in x
0017 
0018 %      Copyright (C) Mike Brookes 1997
0019 %      Version: $Id: nearnonz.m 713 2011-10-16 14:45:43Z dmb $
0020 %
0021 %   VOICEBOX is a MATLAB toolbox for speech processing.
0022 %   Home page: http://www.ee.ic.ac.uk/hp/staff/dmb/voicebox/voicebox.html
0023 %
0024 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
0025 %   This program is free software; you can redistribute it and/or modify
0026 %   it under the terms of the GNU General Public License as published by
0027 %   the Free Software Foundation; either version 2 of the License, or
0028 %   (at your option) any later version.
0029 %
0030 %   This program is distributed in the hope that it will be useful,
0031 %   but WITHOUT ANY WARRANTY; without even the implied warranty of
0032 %   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
0033 %   GNU General Public License for more details.
0034 %
0035 %   You can obtain a copy of the GNU General Public License from
0036 %   http://www.gnu.org/copyleft/gpl.html or by writing to
0037 %   Free Software Foundation, Inc.,675 Mass Ave, Cambridge, MA 02139, USA.
0038 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
0039 e=size(x);
0040 p=prod(e);
0041 if nargin<2             % if no dimension given, find the first non-singleton
0042     d=find(e>1,1);
0043     if ~numel(d)
0044         d=1;
0045     end
0046 end
0047 k=e(d);                 % size of active dimension
0048 q=p/k;                  % size of remainder
0049 if d==1
0050     z=reshape(x,k,q);
0051 else
0052     z=shiftdim(x,d-1);
0053     r=size(z);
0054     z=reshape(z,k,q);
0055 end
0056 xx=z~=0;
0057 cx=cumsum(xx);
0058 [i,j]=find(z);
0059 qq=cx(xx);
0060 pos=full(sparse(qq,j,i,k,q)); % list the positions of non-zero elements in each column
0061 mp=ceil((pos(1:end-1,:)+pos(2:end,:))*0.5); % find the mid point between consecutive non-zero elements
0062 [i2,j2]=find(pos(2:end,:)>0);
0063 zz=1+cumsum(full(sparse(mp(pos(2:end,:)>0),j2,1,k,q)));
0064 y=pos(zz+repmat((0:q-1)*k,k,1));
0065 v=z(max(y,1)+repmat((0:q-1)*k,k,1));
0066 w=y-repmat((1:k)',1,q);
0067 w(y==0)=0;
0068 if d==1
0069     y=reshape(y,e);
0070     v=reshape(v,e);
0071     w=reshape(w,e);
0072 else
0073     y=shiftdim(reshape(y,r),length(e)+1-d);
0074     v=shiftdim(reshape(v,r),length(e)+1-d);
0075     w=shiftdim(reshape(w,r),length(e)+1-d);
0076 end

Generated on Fri 22-Sep-2017 19:37:38 by m2html © 2003