2016-06-20 5 views
1

Hier ist ein Beispiel:Wie kann ich diese langsame verschachtelte Schleife in R mithilfe der (L, S) -Anwendungsfamilie optimieren?

result <- array(1, c(7,7,7)) 
for(i in 1:7){ 
    for(j in 1:7){ 
    for(k in 1:7){ 
     result[i,j,k] <- i*j*k 
    } 
    } 
} 
+2

Für dieses Beispiel verwenden könnten Sie 'äußere (äußere (1: 7, 1: 7), 1: 7) verwenden' zu erhalten "Ergebnis". Was sind Ihre tatsächlichen Berechnungen, um "Ergebnis" auszufüllen? –

+0

Sie müssen einige Daten bereitstellen, mit denen Sie arbeiten können. – gung

+0

Die tatsächlichen Werte sind in einem anderen Datenrahmen. Ich würde diesen Datenrahmen mit i, j, k als Indizes bezeichnen. –

Antwort

4

Sie %o% verwenden können, die viel schneller als die Schleife ist. Dies ist die gleiche wie outer

> 1:7 %o% 1:7 %o% 1:7 

> identical(result, 1:7 %o% 1:7 %o% 1:7) 

library("microbenchmark") 

> microbenchmark(1:7 %o% 1:7 %o% 1:7, forloop = for(i in 1:7){ 
+ for(j in 1:7){ 
+  for(k in 1:7){ 
+  result[i,j,k] <- i*j*k 
+  } 
+ } 
+ }) 
Unit: microseconds 
       expr  min  lq  mean median  uq  max neval 
1:7 %o% 1:7 %o% 1:7 19.673 21.3000 30.54441 26.030 30.4610 269.072 100 
      forloop 680.274 693.1025 730.68298 703.042 716.6775 1367.285 100 
1

Vielleicht können Sie diese verwenden

result <- array(apply(expand.grid(1:7,1:7,1:7),1,prod),c(7,7,7))