Ich habe die folgende Funktion (Funtest) zu testen, ob ein bestimmter Vektor in einer Matrix existiert. Der Vektor wird immer die Länge 2 haben und die Matrix wird immer zwei Spalten haben. Die Funktion funktioniert gut, ich möchte sie nur schneller machen (idealerweise viel schneller), weil meine Matrizen Hunderte bis Tausende von Zeilen haben können. Dies istMaking-Funktion, die überprüft, ob Vektor schneller in Matrix existiert
x = c(1,2)
set.seed(100)
m <- matrix(sample(c(1,-2,3,4), 500*2, replace=TRUE), ncol=2)
funtest(m,x)
[1] TRUE
, wie schnell es zur Zeit ist
library(microbenchmark)
microbenchmark(funtest(m, x), times=100)
Unit: milliseconds
expr min lq mean median uq max
funtest(m, x) 1.501247 1.536157 1.674668 1.567826 1.708293 2.900046
neval
100
Dies ist die Funktion
funtest = function(m, x) {
out = any(apply(m,1,function(n,x) all(n==x),x=x))
return(out)
}
Ich bin kein R-Benutzer an sich, aber dies sieht wie ein stark vektorisierter Ausdruck aus, so dass Sie Prüfungen ohne Verzweigung durchführen. Dies ist im Allgemeinen einfacher auf dem Prozessor zu parallelisieren, ist aber manchmal langsamer als ein eher domänenbasierter Ansatz. Vielleicht wäre es besser, zuerst alle Zeilenindizes zu sammeln, wobei das erste Element gleich dem gegebenen Wert ist. Dann überprüfe nur die bereits gefilterte zweite Spalte (nur Vergleich mit den positiven Indizes aus Schritt 1; wie Kurzschluss in boolschen Auswertungen). Die Beschleunigung sollte jedoch um einen Faktor von ~ 2 begrenzt sein. – sascha
Sie sollten zuerst den Ansatz von Zheyuan Li ausprobieren, da es mehr Beschleunigungspotential hat und sich in einer vektorisierten Sprache natürlicher anfühlen kann. (Aber leider läuft alles auf die Interna von R hinaus; was im Vergleich zur erwähnten Alternative gilt). Natürlich können auch Datenstatistiken mit auf Verzweigungen basierenden Ansätzen eine Rolle spielen. – sascha
Ich dachte an vielleicht eine Art Hash-Alternative, um in konstanter Zeit zu suchen? – user3067923