1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556 |
- function [sel1, sel2] = spm_match_str(a, b)
- % MATCH_STR looks for matching labels in two listst of strings
- % and returns the indices into both the 1st and 2nd list of the matches.
- % They will be ordered according to the first input argument.
- %
- % [sel1, sel2] = match_str(strlist1, strlist2)
- %
- % The strings can be stored as a char matrix or as an vertical array of
- % cells, the matching is done for each row.
- %_______________________________________________________________________
- % Copyright (C) 2000, Robert Oostenveld
- % Robert Oostenveld
- % $Id: spm_match_str.m 3589 2009-11-20 17:17:41Z guillaume $
- % ensure that both are cell-arrays
- if isempty(a)
- a = {};
- elseif ~iscell(a)
- a = cellstr(a);
- end
- if isempty(b)
- b = {};
- elseif ~iscell(b)
- b = cellstr(b);
- end
- % ensure that both are column vectors
- a = a(:);
- b = b(:);
- % regardless of what optimizations are implemented, the code should remain
- % functionally compatible to the original, which is
- % for i=1:length(a)
- % for j=1:length(b)
- % if strcmp(a(i),b(j))
- % sel1 = [sel1; i];
- % sel2 = [sel2; j];
- % end
- % end
- % end
- % replace all unique strings by a unique number and use the fact that
- % numeric comparisons are much faster than string comparisons
- [dum1, dum2, c] = unique([a; b]);
- a = c(1:length(a));
- b = c((length(a)+1):end);
- sel1 = [];
- sel2 = [];
- for i=1:length(a)
- % s = find(strcmp(a(i), b)); % for string comparison
- s = find(a(i)==b); % for numeric comparison
- sel1 = [sel1; repmat(i, size(s))];
- sel2 = [sel2; s];
- end
|