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:
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.
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:
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.
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%Tags und Links string comparison matlab vectorization cell-array