Сравнение строк в Matlab - PullRequest
0 голосов
/ 26 апреля 2020

У меня есть большая строка (уже отсортированная), состоящая из ячеек, подобных

batch = [{'a'},{'a'},{'a'},{'m'},{'m'},{'q'},{'q'},{'q'},{'q'}]

, и в пределах для l oop мне нужны индексы в batch, где появляется слово val = {'a'}, т.е. Я перебираю отдельные строки в пакете - {'a'}, {'m'}, {'q'} в этом случае.

Использование некоторого fcn, например ismember или strcmp или простого find, ясно работает, например, find(ismember(batch, val)) Однако это слишком медленно для моих целей. Можно ли найти начальный и последний индексы, где val появляется в batch за пределами для l oop, и тогда я могу просто назвать эти индексы в пределах для l oop? Спасибо.

1 Ответ

2 голосов
/ 26 апреля 2020

Мы можем провести небольшой временной эксперимент:

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 вместо массива ячеек.

Однако я не могу представить, что эти функции слишком медленные для вас. Но я могу себе представить, что причина, по которой вы хотите сделать это, не оптимальна ... поэтому поделитесь немного большей информацией и кодом, чтобы ускорить всю проблему, а не только эту подзадачу (но откройте новый вопрос для этого;))

...