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'?


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

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')


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.


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 :).


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))

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.


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'))

-2

Hast du versucht

indices = Find(strs, 'KU')

siehe Link

Alternative,

indices = strfind(strs, 'KU');

sollte auch funktionieren, wenn ich mich nicht irre.


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
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.