Как искать строку в массиве ячеек в MATLAB?

103

Допустим, у меня есть массив ячеек

strs = {'HA' 'KU' 'LA' 'MA' 'TATA'}

Что мне делать, если я хочу найти индекс 'KU'?

Бенджамин
источник
7
Обратите внимание, что текущий популярный ответ довольно устарел. Не забудьте также проверить этот ответ .
Деннис Джахеруддин

Ответы:

128

Я думаю, следующий код может помочь:

strs = {'HA' 'KU' 'LA' 'MA' 'TATA'}
ind=find(ismember(strs,'KU'))

Это возвращает

ans = 
     2
Видар
источник
11
Имейте в виду, что это универсальное решение хорошо, потому что оно работает для нескольких типов данных, но работает только для точных совпадений. Если вам нужно совпадение без учета регистра, см. Stackoverflow.com/a/9433112/44737 . Если вам нужно сопоставить что-то более сложное, например регулярное выражение или поле в структуре, см. Stackoverflow.com/a/8061808/44737
rob
ismember немного более неуклюжий и может обновляться с новыми версиями. Я чувствую себя в большей безопасности с функциями на основе str, такими как strcmpi и т. Д.
Мэдди
1
Работает и в Octave
Нино ван Хофф
90
>> strs = {'HA' 'KU' 'LA' 'MA' 'TATA'};
>> tic; ind=find(ismember(strs,'KU')); toc

Истекшее время 0,001976 секунды.

>> tic; find(strcmp('KU', strs)); toc

Прошедшее время 0,000014 секунды.

ТАК, явно strcmp('KU', strs)занимает гораздо меньше времени, чемismember(strs,'KU')

Панкадж Гупта
источник
5
Большой! Ваше решение должно быть лучшим!
Antonvh 06
1
Да, я согласен, это лучшее решение, но это просто сравнение решений от andreys и vidars. Так что на самом деле Андрей должен это понять.
Лев
1
Собственно, следует отметить, что этот метод не работает, если вы сравниваете два массива разного размера (т.е. если вместо «KU» с левой стороны у вас есть массив строк). Решение Vidar действительно работает в этом случае (довольно хорошо), поэтому оно более общее.
Nate
@pankaj: Как это соотносится с созданием карты String-> Indices, а затем получением индекса путем поиска по карте? Задавая вопросы по производительности.
Файзан 01
39

С 2011a рекомендуемый способ:

booleanIndex = strcmp('KU', strs)

Если вы хотите получить целочисленный индекс (который вам часто не нужен), вы можете использовать:

integerIndex = find(booleanIndex);

strfind устарел, поэтому постарайтесь не использовать его.

Андрей Рубштейн
источник
23

Я вижу, что все упустили самый важный недостаток в вашем коде:

strs = {'HA' 'KU' 'LA' 'MA' 'TATA'}

должно быть:

strs = {'HA' 'KU' 'NA' 'MA' 'TATA'} 

или

strs = {'HAKUNA' 'MATATA'}

Теперь, если вы будете использовать

ind=find(ismember(strs,'KU'))

Вам не о чем беспокоиться :).

Курт
источник
Я собирался отредактировать исходный вопрос, но увидел слишком много ответов :)
raggot
13

Другие ответы, вероятно, в этом случае проще, но для полноты я подумал, что добавлю использование cellfun с анонимной функцией.

indices = find(cellfun(@(x) strcmp(x,'KU'), strs))

который имеет то преимущество, что вы можете легко сделать его нечувствительным к регистру или использовать его в тех случаях, когда у вас есть массив ячеек структур:

indices = find(cellfun(@(x) strcmpi(x.stringfield,'KU'), strs))
Робинс
источник
6

Самый короткий код:

strs = {'HA' 'KU' 'LA' 'MA' 'TATA'};
[~,ind]=ismember('KU', strs)

Но возвращает только первую позицию в strs. Если элемент не найден, то ind=0.

Максим Суслов
источник
5

Функции strcmp и strcmpi - самый простой способ сделать это. Они ищут в массивах.

strs = {'HA' 'KU' 'LA' 'MA' 'TATA'}
ix = find(strcmp(strs, 'KU'))
Эндрю Янке
источник
-2

ты пробовал

indices = Find(strs, 'KU')

см. ссылку

альтернативно,

indices = strfind(strs, 'KU');

тоже должно работать, если я не ошибаюсь.

Том
источник
Я пробовал найти, но поскольку массив представляет собой массив ячеек, MATLAB возвращает мне некоторые ошибки ... Но функция strfind, похоже, работает, спасибо!
Бенджамин