Як шукати рядок у масиві комірок у 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
граб

ismember трохи кумедніший і може оновлюватись новішими версіями. Я відчуваю себе функції більш безпечним з вул , засновані , як strcmpi і т.д.
Медді

1
Працює і в Октаві
Ніно ван Гоф

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
Чудово! Ваше рішення має бути першим!
Антонх

1
Так, я погоджуюся, це найкраще рішення, проте це лише порівняння між рішеннями andreys і vidars. Тому насправді Андрій повинен це отримати.
Лев

1
Власне, слід зазначити, що цей метод не працює, якщо ви порівнюєте два масиви різної величини (тобто якщо замість 'KU' зліва, у вас є масив рядків). Рішення Відара в цьому випадку працює (досить непогано), тому є загальнішим.
Нейт

@pankaj: Як це порівнюється із створенням карти рядків-> індексів, а потім отримання індексу шляхом пошуку карти? Запитуючи парфуму.
фаян

39

Починаючи з 2011а, рекомендований спосіб:

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, здається, працює, дякую!
Бенджамін
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.