# v_nearnonz

## PURPOSE

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

## SYNOPSIS

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

## DESCRIPTION

```V_NEARNONZ replace each zero element with the nearest non-zero element [V,Y,W]=v_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]=v_nearnonz(x,d)
0002 %V_NEARNONZ replace each zero element with the nearest non-zero element [V,Y,W]=v_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: v_nearnonz.m 10865 2018-09-21 17:22:45Z dmb \$
0020 %
0021 %   VOICEBOX is a MATLAB toolbox for speech processing.
0023 %
0024 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
0025 %   This program is free software; you can redistribute it and/or modify
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```