Wie suche ich in MATLAB nach einer Zeichenfolge im Zellenarray?

103

Angenommen, ich habe das Zellenarray

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

Was soll ich tun, wenn ich den Index von finden möchte 'KU'?

Benjamin
quelle
7
Beachten Sie, dass die aktuelle Top-Antwort ziemlich veraltet ist. Überprüfen Sie auch diese Antwort .
Dennis Jaheruddin

Antworten:

128

Ich denke, der folgende Code könnte den Trick machen:

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

Dies kehrt zurück

ans = 
     2
Vidar
quelle
11
Beachten Sie, dass diese generische Lösung gut ist, da sie für mehrere Datentypen funktioniert, jedoch nur für exakte Übereinstimmungen. Wenn Sie eine Übereinstimmung ohne Berücksichtigung der Groß- und Kleinschreibung benötigen, lesen Sie stackoverflow.com/a/9433112/44737 . Wenn Sie etwas Komplexeres wie einen regulären Ausdruck
rob
ismember ist etwas klobiger und kann mit neueren Versionen aktualisiert werden. Ich fühle mich sicherer mit str-basierten Funktionen wie strcmpi usw.
Maddy
1
Funktioniert auch in Octave
Nino van Hooff
90
>> strs = {'HA' 'KU' 'LA' 'MA' 'TATA'};
>> tic; ind=find(ismember(strs,'KU')); toc

Die verstrichene Zeit beträgt 0,001976 Sekunden.

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

Die verstrichene Zeit beträgt 0,000014 Sekunden.

SO, strcmp('KU', strs)dauert eindeutig viel weniger Zeit alsismember(strs,'KU')

Pankaj Gupta
quelle
5
Toll! Ihre Lösung sollte die beste sein!
Antonvh
1
Ja, ich stimme zu, dies ist die beste Lösung, aber es ist nur ein Vergleich zwischen andreys und vidars Lösungen. Also eigentlich sollte Andre es bekommen.
Leo
1
Eigentlich sollte darauf hingewiesen werden, dass diese Methode nicht funktioniert, wenn Sie zwei Arrays unterschiedlicher Größe vergleichen (dh wenn Sie anstelle von 'KU' auf der linken Seite ein Array von Strings haben). Die Lösung von Vidar funktioniert in diesem Fall (ganz gut), ist also allgemeiner.
Nate
@pankaj: Wie verhält es sich damit, eine Karte mit String-> Indizes zu erstellen und dann durch eine Kartensuche einen Index zu erhalten? Perf weise fragen.
Faizan
39

Seit 2011a wird empfohlen:

booleanIndex = strcmp('KU', strs)

Wenn Sie den Integer-Index erhalten möchten (den Sie oft nicht benötigen), können Sie Folgendes verwenden:

integerIndex = find(booleanIndex);

strfind ist veraltet, versuchen Sie es also nicht zu verwenden.

Andrey Rubshtein
quelle
23

Ich sehe, dass jeder den wichtigsten Fehler in Ihrem Code übersehen hat:

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

sollte sein:

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

oder

strs = {'HAKUNA' 'MATATA'}

Nun, wenn Sie bei der Verwendung bleiben

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

Du wirst keine Sorgen haben :).

Curt
quelle
Ich wollte gerade die ursprüngliche Frage bearbeiten, sah aber zu viele Antworten :)
Raggot
13

Andere Antworten sind in diesem Fall wahrscheinlich einfacher, aber der Vollständigkeit halber dachte ich, ich würde die Verwendung von cellfun mit einer anonymen Funktion hinzufügen

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

Dies hat den Vorteil, dass Sie die Groß- und Kleinschreibung leicht unabhängig machen oder in Fällen verwenden können, in denen Sie über ein Zellarray von Strukturen verfügen:

indices = find(cellfun(@(x) strcmpi(x.stringfield,'KU'), strs))
Robince
quelle
6

Kürzester Code:

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

Es wird aber nur die erste Position zurückgegeben strs. Wenn das Element dann nicht gefunden wird ind=0.

Maxim Suslov
quelle
5

Die Funktionen strcmp und strcmpi sind der direkteste Weg, dies zu tun. Sie durchsuchen Arrays.

strs = {'HA' 'KU' 'LA' 'MA' 'TATA'}
ix = find(strcmp(strs, 'KU'))
Andrew Janke
quelle
-2

Hast du versucht

indices = Find(strs, 'KU')

siehe Link

Alternative,

indices = strfind(strs, 'KU');

sollte auch funktionieren, wenn ich mich nicht irre.

Tom
quelle
Ich habe versucht zu finden, aber da das Array ein Zellenarray ist, gibt MATLAB mir einige Fehler zurück ... Aber die Funktion strfind scheint zu funktionieren, danke!
Benjamin