[Master Index]
[Index for Toolbox]
closest
(Toolbox/closest.m in BrainStorm 2.0 (Alpha))
Function Synopsis
[pt_array2,pt2i,pt_array1,pt1i,dist] = closest(array1,array2);
Help Text
CLOSEST - Find point in one array closest to point in another array
function [pt_array2,pt2i,pt_array1,pt1i,dist] = closest(array1,array2);
find point the row in array2 closest in a Euclidean sense to locations in
array1. return as pt_array2.
Optionally, pt_array1 is point in array1 closest to array2.
Each row one multidimensional location.
Optionally, return index pt2i and pt1i giving corresponding row number
of closest elements.
dist is the Euclidean distance between the two points
(Note reversal of output arguments compared with input. This reversal
makes this function compatible with earlier versions of "closest".
Can be called as closest([x y z],array), returning member in array.)
See also CLUSTER, NEIGHBOR
Cross-Reference Information
This function is called by
Listing of function C:\BrainStorm_2001\Toolbox\closest.m
function [pt_array2,pt2i,pt_array1,pt1i,dist] = closest(array1,array2);
%CLOSEST - Find point in one array closest to point in another array
% function [pt_array2,pt2i,pt_array1,pt1i,dist] = closest(array1,array2);
% find point the row in array2 closest in a Euclidean sense to locations in
% array1. return as pt_array2.
% Optionally, pt_array1 is point in array1 closest to array2.
% Each row one multidimensional location.
% Optionally, return index pt2i and pt1i giving corresponding row number
% of closest elements.
% dist is the Euclidean distance between the two points
%
% (Note reversal of output arguments compared with input. This reversal
% makes this function compatible with earlier versions of "closest".
% Can be called as closest([x y z],array), returning member in array.)
%
% See also CLUSTER, NEIGHBOR
%<autobegin> ---------------------- 26-May-2004 11:29:53 -----------------------
% --------- Automatically Generated Comments Block Using AUTO_COMMENTS ---------
%
% CATEGORY: Utility - Numeric
%
% At Check-in: $Author: Mosher $ $Revision: 14 $ $Date: 5/26/04 9:59a $
%
% This software is part of BrainStorm Toolbox Version 2.0 (Alpha) 24-May-2004
%
% Principal Investigators and Developers:
% ** Richard M. Leahy, PhD, Signal & Image Processing Institute,
% University of Southern California, Los Angeles, CA
% ** John C. Mosher, PhD, Biophysics Group,
% Los Alamos National Laboratory, Los Alamos, NM
% ** Sylvain Baillet, PhD, Cognitive Neuroscience & Brain Imaging Laboratory,
% CNRS, Hopital de la Salpetriere, Paris, France
%
% See BrainStorm website at http://neuroimage.usc.edu for further information.
%
% Copyright (c) 2004 BrainStorm by the University of Southern California
% This software distributed under the terms of the GNU General Public License
% as published by the Free Software Foundation. Further details on the GPL
% license can be found at http://www.gnu.org/copyleft/gpl.html .
%
% FOR RESEARCH PURPOSES ONLY. THE SOFTWARE IS PROVIDED "AS IS," AND THE
% UNIVERSITY OF SOUTHERN CALIFORNIA AND ITS COLLABORATORS DO NOT MAKE ANY
% WARRANTY, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO WARRANTIES OF
% MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE, NOR DO THEY ASSUME ANY
% LIABILITY OR RESPONSIBILITY FOR THE USE OF THIS SOFTWARE.
%<autoend> ------------------------ 26-May-2004 11:29:53 -----------------------
% ----------------------------- Script History ---------------------------------
% JCM 1991 Creation
% JCM 20-Jul-1993 Handle multiple points
% modified JCM 10/29/99 to use repmat function instead of kron for speed
% use sum(x,2) instead of sum(x',2);
% probably should consider shift to column vectors, but legacy code here.
% JCM 19-May-2004 Comments cleaning
% ----------------------------- Script History ---------------------------------
[m2,n2] = size(array2);
[m1,n1] = size(array1);
if(n2 ~= n1),
error(sprintf(...
'CLOSEST: Arrays are not of same column size: %.0f, %.0f',n1,n2));
end
if(0) % old code
array2 = kron(ones(m1,1),array2);
array1 = kron(array1,ones(m2,1));
else % new code 10/29/99
if(m1 > 1), % multiple rows in the first array
array2 = repmat(array2,m1,1);
array1 = repmat(array1,[1 1 m2]);
array1 = shiftdim(array1,2);
array1 = reshape(array1(:),[m1*m2 n1]); % same as above kron without the multiply
else % only a single row in array1
array1 = array1(ones(m2,1),:); % simple rep out to match array2
end
end
darray = array2 - array1; % all combinations
if(n1 > 1),
darray = sum(darray.^2,2); % squared Euclidean distance, no need for sqrt
[dist,i] = min(darray); % closest point
dist = sqrt(dist); % Euclidean distance
else
darray = abs(darray); % one dimensional vector
[dist,i] = min(darray); % closest point
end
pt_array2 = array2(i,:);
if(nargout > 1),
pt2i = rem((i-1),m2)+1; % index in orginal arrays
else
return % only wanted the row vector, not the index
end
if(nargout > 2), % also want the location in the first array
pt_array1 = array1(i,:);
pt1i = floor((i-1)/m2)+1;
end
return
Produced by color_mat2html, a customized BrainStorm 2.0 (Alpha) version of mat2html on Tue Oct 12 12:05:14 2004
Cross-Directory links are: ON