% Returns the closest value from a list
%
% Syntax
%
%  c      = closest(a,b); returns the closest c value in a for each value in b
% [c,i]   = closest(a,b); returns the index i of the closest value in a for each value in b
% [c,i,d] = closest(a,b); returns the difference d of the closest value in a for each value in b
%
% Example
%
% [cvalue, cindex cdiff] = closest([-8 2 5.5 12 45 20 100],[-15 2.3 10 50])
% 
% cvalue =
% 
%     -8     2    12    45
% 
% 
% cindex =
% 
%      1     2     4     5
% 
% 
% cdiff =
% 
%     7.0000    0.3000    2.0000    5.0000
%
%
% Author: Javier Lopez-Calderon
% Davis, CA, March, 2011
function [cvalue, cindex, cdiff] = closest(data, target)

error(nargchk(1,2,nargin))
error(nargoutchk(0,3,nargout))
if nargin<2; target = [];end
ntarget = length(target);
[cvalue, cindex, cdiff]   = deal(zeros(1, ntarget));
for i=1:ntarget
      if isnan(target(i)) || isinf(target(i))
            [cvalue(i), cindex(i), cdiff(i)] = deal(NaN);
      else
            [cdiff(i), cindex(i)] = min(abs(data-target(i)));
            cvalue(i) = data(cindex(i));
      end
end