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

93

Скажем, у меня есть массив ячеек

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

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

  • 7
    Обратите внимание, что текущий топ-ответ довольно устарел. Не забудьте также проверить этот ответ .
Теги:
string
cell-array

8 ответов

111
Лучший ответ

Я думаю, следующий код мог бы сделать трюк:

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

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

ans = 
     2
  • 1
    Оно работает! Спасибо!
  • 10
    Имейте в виду, что это общее решение хорошо, потому что оно работает для нескольких типов данных, но оно работает только для точных совпадений. Если вам нужно сопоставление без учета регистра, см. Stackoverflow.com/a/9433112/44737 . Если вам нужно сопоставить что-то более сложное, например, регулярное выражение или поле в структуре, см. Stackoverflow.com/a/8061808/44737
Показать ещё 2 комментария
81
>> strs = {'HA' 'KU' 'LA' 'MA' 'TATA'};
>> tic; ind=find(ismember(strs,'KU')); toc

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

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

Истекшее время составляет 0,000014 секунд.

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

  • 5
    Большой! Ваше решение должно быть лучшим!
  • 1
    Да, я согласен, это лучшее решение, однако это просто сравнение между решениями andreys и vidars. Так что на самом деле Андрей должен получить это.
Показать ещё 2 комментария
36

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

booleanIndex = strcmp('KU', strs)

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

integerIndex = find(booleanIndex);

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

19

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

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

должен быть:

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

или

strs = {'HAKUNA' 'MATATA'}

Теперь, если вы придерживаетесь использования

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

У вас будет не стоит беспокоиться:).

  • 0
    Страшная ошибка :)
  • 0
    Я собирался редактировать оригинальный вопрос, но видел слишком много ответов :)
12

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

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

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

indices = find(cellfun(@(x) strcmpi(x.stringfield,'KU'), strs))
5

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

strs = {'HA' 'KU' 'LA' 'MA' 'TATA'}
ix = find(strcmp(strs, 'KU'))
4

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

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

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

-1

Вы пробовали

indices = Find(strs, 'KU')

см. ссылка

indices = strfind(strs, 'KU');

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

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

Ещё вопросы

Сообщество Overcoder
Наверх
Меню