Betrachten Sie den folgenden Befehl ein:Wie mache ich Modulo und logische Indizierung schneller?
c(c>A | c<1) = mod(c(c>A | c<1),A);
wo c
ein Spaltenvektor ist, und A
ist ein Skalar.
In Kürze: Gibt es eine Möglichkeit, diese Arbeit schneller zu machen?
Erläuterung:
c(i)
stellt eine Spaltennummer in einer A
-by- A
Matrix. Es kann jedoch Werte größer als A
oder kleiner als 1 haben, und dieser Befehl sollte es in einer Art "PAC-MAN" Art und Weise beheben. Wenn c(i)
größer als A
ist, dann, wenn Sie A
erreichen, fangen Sie an, von 1 zurück zu zählen, wenn Sie wieder A
erreichen, beginnen Sie wieder von 1, und so weiter, bis Sie den Wert von c(i)
zählen. Dies sollte für c(i)<1
genauso funktionieren, also wird die Zählung umgekehrt.
Beispiele:
Wenn
A = 10
undc(i) = 17
, dannc(i)
nach diesem Befehl sollen 7.Wenn
A = 10
undc(i) = -8
sein soll, dannc(i)
nach diesem Befehl sein 2.Wenn
A = 10
undc(i) = 213
, dannc(i)
nach diesem Befehl sollte 3.
Die Motivation sein: Dieser Befehl ein Teil eines Simulationsmodells ist, ich habe, und zur Zeit ist es das langsamste daran teil. Diese spezifische Reihe wird in jeder Realisierung des Modells Millionen (!) Von Zeiten genannt, und es gibt eine Menge, so dass jede Verbesserung hilfreich sein wird. BTW, die typische Größe von c
ist ungefähr 10K-by-1.
p.s .: Wenn Sie einen besseren Vorschlag für den Titel haben, werde ich glücklich sein, es zu ändern, ich konnte keinen guten finden.
Das war brilliant! Danke vielmals. Ich kann nicht glauben, dass ich diese Option verpasst habe ... jetzt beende ich meine Doktorarbeit etwas früher;) – EBH
Können Sie der Antwort eine vierte Option hinzufügen, wobei 'c1 = mod (c, A)' (Zuweisung zu einem anderen) Variable)? In meiner Maschine ist der schnellste. – EBH
@EBH Haben Sie das tatsächlich mit dem Benchmark-Code getestet? Es sollte keinen wirklichen Unterschied zu "c = mod (c, A)" geben, wenn man es richtig profiliert (mit 'timeit') – Suever