# 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.
    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 Lesser General Public License as published by
    0027 %   the Free Software Foundation; either version 3 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 Lesser General Public License for more details.
    0034 %
    0035 %   You can obtain a copy of the GNU Lesser General Public License from
    0036 %   https://www.gnu.org/licenses/ .
    0037 %
    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