% 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