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.:
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?
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:
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
:
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 .
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%Sie können eine Funktion wie folgt schreiben:
%Vor%Wenn Sie die Funktion aufrufen:
%Vor%Die Ausgabe ist:
%Vor%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
Tags und Links matlab logical-operators matrix-indexing