MATLAB: Vergleich der Zellenarrays von String

8

Ich habe zwei Zellen-Arrays von Strings, und ich möchte prüfen, ob sie die gleichen Strings enthalten (sie müssen nicht in der gleichen Reihenfolge sein, noch wissen wir, ob sie die gleiche Länge haben).

>

Zum Beispiel:

%Vor%

oder

%Vor%

Zuerst dachte ich an strcmp , aber es würde erfordern, dass man den Inhalt einer Zelle wiederholt und mit dem anderen vergleicht. Ich habe auch ismember mit etwas wie:

betrachtet %Vor%

aber dann wissen wir nicht im Voraus, dass sie gleich lang sind (offensichtlicher Fall von Ungleichheit). Wie würden Sie diesen Vergleich am effizientesten durchführen, ohne zu viele Fälle von if / else zu schreiben.

    
Dave 12.07.2010, 19:28
quelle

3 Antworten

17

Sie können die Funktion SETXOR verwenden, die die Werte zurückgibt sind nicht im Schnittpunkt der beiden Zellenarrays. Wenn es ein leeres Array zurückgibt, enthalten die zwei Zellenarrays dieselben Werte:

%Vor%


BEARBEITEN: Einige Leistungsmessungen ...

Da Sie auf Leistungsmessungen neugierig waren, dachte ich, ich würde die Geschwindigkeit meiner Lösung anhand der beiden Lösungen testen, die in Amro (die ISMEMBER und STRCMP / CELLFUN ). Ich habe zuerst zwei große Zellen-Arrays erstellt:

%Vor%

Als nächstes habe ich jede Lösung 100 Mal durchlaufen, um eine mittlere Ausführungszeit zu erhalten. Dann tauschte ich a und b und wiederholte es. Hier sind die Ergebnisse:

%Vor%

Beachten Sie, dass die SETXOR -Lösung ein konstant schnelles Timing aufweist. Die Lösung von ISMEMBER wird sogar etwas schneller ausgeführt, wenn a über Elemente verfügt, die das sind nicht in b . Dies ist auf den Kurzschluss && zurückzuführen, der die zweite Hälfte überspringt der Berechnung (weil wir bereits wissen, dass a und b nicht dieselben Werte enthalten). Wenn jedoch alle Werte in a ebenfalls in b enthalten sind, wird ISMEMBER verwendet Lösung ist deutlich langsamer.

    
gnovice 12.07.2010, 19:42
quelle
5

Sie können die ISMEMBER-Funktion weiterhin wie bei einer kleinen Änderung verwenden:

%Vor%

Sie können die Schleifenversion auch mit STRCMP als eine Zeile schreiben:

%Vor%

BEARBEITEN: Ich füge eine dritte Lösung hinzu, die von einem anderen SO Frage :

%Vor%

Im gleichen Sinne führte Im den Zeitvergleich durch (unter Verwendung der Funktion TEITEIT ):

%Vor%

und die Ergebnisse in der gleichen Reihenfolge der Funktionen (niedriger ist besser):

%Vor%     
Amro 12.07.2010 20:06
quelle
2

Sehen Sie sich die Funktion intersect

an

Was MATLAB Help sagt:

  

[c, ia, ib] = intersect(a, b) auch   gibt die Spaltenindexvektoren ia und ib zurück   so dass c = a(ia) und b(ib) (oder c =    a(ia,:) und b(ib,:)).

    
Mikhail 12.07.2010 19:33
quelle