Мы можем провести небольшой временной эксперимент:
batch = [{'a'},{'a'},{'a'},{'m'},{'m'},{'q'},{'q'},{'q'},{'q'}];
val = {'a'}
% make the array to be searched in longer for relevant timing
Str = repmat(batch,1,1000000);
% ismember
tic
idx = find(ismember(Str,val));
toc
% strcmp
tic
idx = find(strcmp(Str,val));
toc
% contains
tic
idx = find(contains(Str,val));
toc
% cellfun/isequal
tic
idx = find(cellfun(@(x)isequal(x,val),Str));
toc
% looping
tic
idx = NaN(round(length(Str)/4),1);
k = 1;
for i = 1:length(Str)
lg = Str{i} == val{1};
if lg
idx(k) = i;
k = k+1;
end
end
idx = idx(1:k-1);
toc
, в результате на моей машине
- Прошедшее время составляет 0,266673 секунды. % ismember
- Прошедшее время составляет 0,225149 секунд. % strcmp
- Истекшее время составляет 0,144104 секунды. % содержит
- Прошедшее время составляет 50,683212 секунд. % cellfun + isequal
- Прошедшее время составляет 1.689111 секунды. % loopint + isequal
Даже хуже, если вы используете массив sting вместо массива ячеек.
Однако я не могу представить, что эти функции слишком медленные для вас. Но я могу себе представить, что причина, по которой вы хотите сделать это, не оптимальна ... поэтому поделитесь немного большей информацией и кодом, чтобы ускорить всю проблему, а не только эту подзадачу (но откройте новый вопрос для этого;))