Suchen Sie nach Elementen, die eine oder mehrere Kriterien erfüllen

8

Ich versuche, die Indizes von Elementen in einem Vektor zu finden, die einem anderen Vektor entsprechen, vorzugsweise ohne Schleifen zu verwenden. Zum Beispiel könnte meine Eingabe lauten:

%Vor%

Die Ausgabe wäre hier:

%Vor%

Das schnellste, was mir bisher eingefallen ist:

%Vor%

Allerdings habe ich das Gefühl, dass dies schneller erledigt werden könnte, zumal ich dachte, dass der Befehl find ziemlich langsam ist.

Zu beachten:

  • Die Werte in DJiSet sind garantiert für alle in JiSet vorhanden
  • JiSet wird immer in aufsteigender Reihenfolge ohne wiederholte Einträge
  • sortiert
  • Der Vektor DJiSet wird nicht garantiert zusammenhängend in JiSet gefunden
Wouter Kuijsters 17.03.2015, 14:31
quelle

4 Antworten

10

Vorgehensweise # 1

Sie können find vermeiden, indem Sie die Orte von DJiSet und JiSet in ismember umkehren und dann die zweite Ausgabe verwenden, die uns die passenden Indizes gibt -

%Vor%

Vorgehensweise # 2

Loopy-Ansatz, der auf die spezifischen Bedingungen in der Frage eingeht, könnte ausprobiert werden, nicht sicher, ob dies effizienter sein wird -

%Vor%     
Divakar 17.03.2015, 14:34
quelle
5

Divakars Antwort ist der richtige Weg. Aber für den Fall, dass Sie es manuell tun möchten:

%Vor%

Dies findet das erste Vorkommen, wenn es mehr als eins gibt.

Wenn die Werte in DJiSet nicht garantiert in JiSet vorhanden sind, könnten Sie eine kleine Änderung verwenden:

%Vor%     
Luis Mendo 17.03.2015 15:59
quelle
5

Für kleine Datensätze scheint mein ursprünglicher Ansatz schneller zu sein als die von Divakar vorgeschlagene ismember -Lösung und die von qmeeeeeee vorgeschlagene intersect -Lösung, aber alle drei werden von Luis Mendos Lösung geschlagen mit guter alter bsxfun . Siehe untenstehenden Code, welcher mal bei jedem Ansatz:

%Vor%

Welche auf meinem Rechner (läuft R2014b) gibt die folgenden Zeiten zurück:

%Vor%

Dies deutet darauf hin, dass die Verwendung von find und ismember in der umgekehrten Reihenfolge der Vektoren für kleine Datenmengen tatsächlich schneller ist als die Verwendung von ismember allein. Da für alle Methoden aus der Generierung der Datensätze set , mit denen getestet wird, auch ein fixer Overhead vorliegt, scheint der Unterschied ziemlich groß zu sein. Ausführlichere Tests finden Sie in den Kommentaren unten.

    
Wouter Kuijsters 17.03.2015 16:10
quelle
4

Vielleicht könnten Sie versuchen, sich zu schneiden? Es soll viel schneller sein:

%Vor%

Die Reihenfolge spielt keine Rolle, solange das Element in beiden Listen existiert, geben die ind-Elemente den Index.

    
GameOfThrows 17.03.2015 15:41
quelle

Tags und Links