2017-06-05 2 views
0

Ich habe vier VektorenR: Optimieren Index weise Vergleiche, die auf anderen Vektoren abhängen

x, y, z, w 
length(x) = length(y) = length(z) = length(w) = 5000 

und ich möchte folgendes tun:

Nehmen Sie den Vektor ‚w‘ und durch jeden Index laufen ' i 'von 1 bis 5000. Suchen Sie für jeden Index' i 'den Index' j 'in' x ', der y [i] am nächsten ist. Dann nimm den Index 'j' und vergleiche, ob w [i]> z [j] für alle i und j (i) .... mit j (i), ich meine, dass j von i abhängt.

Ich möchte nur wissen, ob das stimmt oder nicht, ich möchte nicht die entsprechenden Is und Js berechnen.

Ich habe diese Prozedur mit einer for-Schleife angepasst, und ich benutze which.min, um den Index 'j' zu finden. Das ist sehr langsam. Wie zu optimieren?


Beispiel:

z <- c(1,2,3,4,5) 
w <- c(2,3,2,5,5) 
x <- c(200,300,400,500,600) 
y <- c(300,300,200,500,600) 

So, basierend auf oben, haben wir die folgenden 5 Vergleiche:

w[1] > z[2] (because y[1] is closest to x[2]) 
w[2] > z[2] (because y[2] is closest to x[2]) 
w[3] < z[1] (because y[3] is closest to x[1]) 

Beachten Sie, dass wir jetzt schon wissen, w [i] nicht größer ist streng als z [j], damit wir hier aufhören können. Ausgabe sollte dann

"FALSE" 

Antwort

1

Meine Lösung die Js nicht berechnen und macht alle Vergleiche.

all(w > z[apply(abs(outer(x, y, `-`)), 2, which.min)]) 

hängt davon ab, was Sie für schnell brauchen. Auf meinem Rechner dauerte dies knapp eine Sekunde, um ein Beispiel mit 5000 x Werten zu durchlaufen.

system.time(
    all(w > z[apply(abs(outer(x, y, `-`)), 2, which.min)])) 
      user   system   elapsed 
0.77000000000000 0.20000000000000 0.97000000000116 
Verwandte Themen