Matlab-Index zur logischen Indizierung

8

Ich habe eine Liste von Indizes, z. i = [3 5] und ein Vektor v = 1:6 . Ich brauche eine Funktion f , die die logische Map für den Vektor v mit den Indizes i zurückgibt, z. B.:

%Vor%

Da ich diese Funktion mehrere Millionen Mal aufrufen werde, möchte ich es so schnell wie möglich machen. Gibt es eine eingebaute Funktion, die diese Aufgabe ausführt?

    
blubb 30.01.2013, 14:54
quelle

7 Antworten

8

Ich weiß, dass ich zu spät im Spiel bin, aber ich wollte wirklich eine schnellere Lösung finden, die genauso elegant ist wie ismember . Und tatsächlich gibt es einen, der die undokumentierte Funktion ismembc verwendet:

%Vor%

Benchmark

%Vor%

Folgendes habe ich bekommen:

%Vor%

Erstaunlicherweise ist ismembc tatsächlich die schnellste!

Bearbeiten:
Für sehr große Werte von N ( d. H. , wenn v ein großes Array ist) ist die schnellere Lösung tatsächlich slayton's (und HebeleHododos, für diese Angelegenheit). Sie haben eine Vielzahl von Strategien zur Auswahl, wählen Sie sorgfältig:)

Bearbeiten von H.Muster:
Hier sind Benchmark-Ergebnisse einschließlich _ismemberoneoutput :

%Vor%

Interessanterweise läuft Jonas Lösung für mich nicht, da ich einen Index exceeds matrix dimensions. Fehler erhalte ...

Bearbeiten von hoogamaphone:
Es ist erwähnenswert, dass ismembc erfordert, dass beide Eingaben numerisch, sortiert, nicht-spärlich, Nicht-NaN-Werte sind, was ein Detail ist, das im Quellendokumentation .

    
Eitan T 30.01.2013, 15:35
quelle
5

Sie können ismember

verwenden %Vor%

wird zurückgeben

%Vor%

Für eine wahrscheinlich schnellere Version können Sie versuchen

%Vor%

Beachten Sie, dass ich dies nur für Zeilenvektoren wie von Ihnen angegeben getestet habe.

    
H.Muster 30.01.2013 15:08
quelle
5

Erstellen Sie einfach einen Vektor logischer Indizes und setzen Sie die gewünschten Positionen auf true / false

%Vor%

Dies kann in eine Funktion wie folgt eingepackt werden:

%Vor%

Wenn Sie für jede Ihrer Millionen Operationen einen Indexierungsvektor der gleichen Größe benötigen, weisen Sie den Vektor einmal zu und bearbeiten ihn dann für jede Iteration:

%Vor%

Wenn Sie wirklich Leistung brauchen, können Sie eine mex-Funktion schreiben, um dies für Sie zu tun. Hier ist eine sehr grundlegende, ungeprüfte Funktion, die ich schrieb, die etwa 2x schneller ist als die anderen Methoden:

%Vor%

Es gibt verschiedene Möglichkeiten, einen Vektor in Matlab zuzuordnen. Einige sind schneller als andere, siehe diesen undokumentierten Matlab Beitrag für eine gute Zusammenfassung:

Hier sind einige schnelle Benchmarks, die die verschiedenen Methoden vergleichen. Die letzte Methode ist bei weitem die schnellste Methode, erfordert jedoch, dass Sie für jede Operation den gleichen logischen Indexierungsvektor verwenden.

%Vor%     
slayton 30.01.2013 14:58
quelle
3

Adressiere einfach eine neue Variable mit der IDX-Matrix, sie füllt die Nullen für dich aus:

%Vor%

Sie müssen weder eine Funktion noch die Länge übergeben, es sei denn, Sie möchten auch nachfolgende Nullen.

    
Dan 30.01.2013 15:03
quelle
2

Ich erwarte, dass @ slaytons Lösung am schnellsten ist. Allerdings ist hier eine One-Liner-Alternative, die Sie zumindest etwas Speicher sparen kann, wenn die Vektoren groß sind.

%Vor%     
Jonas 30.01.2013 15:13
quelle
1

Sie können eine Funktion wie folgt schreiben:

%Vor%

Wenn Sie die Funktion aufrufen:

%Vor%

Die Ausgabe ist:

%Vor%     
HebeleHododo 30.01.2013 15:00
quelle
0

Können Sie einfach v (i) = 1?

zum Beispiel, wenn Sie sagen x = Nullen (1,10); und a = [1 3 4];

x (a) = 1 wird 1 zurückgeben      0      1      1      0      0      0      0      0      0

    
QuantumLicht 23.04.2014 03:06
quelle