2016-11-29 12 views
6

से छुटकारा पा रहा है मैं अपनी गणना तेज करना चाहता हूं और फ़ंक्शन m में लूप का उपयोग किए बिना परिणाम प्राप्त करना चाहता हूं। प्रतिलिपि प्रस्तुत करने योग्य उदाहरण:आर: लूप और तेज़ कोड

N <- 2500 
n <- 500 
r <- replicate(1000, sample(N, n)) 

m <- function(r, N) { 
    ic <- matrix(0, nrow = N, ncol = N) 
    for (i in 1:ncol(r)) { 
    p <- r[, i] 
    ic[p, p] <- ic[p, p] + 1 
    } 
    ic 
} 

system.time(ic <- m(r, N)) 
# user system elapsed 
# 6.25 0.51 6.76 
isSymmetric(ic) 
# [1] TRUE 

for पाश हम मैट्रिक्स वेक्टर नहीं साथ काम कर रहे के हर यात्रा में, तो यह कैसे vectorized जा सकता है?

@ joel.wilson इस फ़ंक्शन का उद्देश्य तत्वों की जोड़ी आवृत्तियों की गणना करना है। तो बाद में हम pairwise समावेश संभावनाओं का अनुमान लगा सकते हैं।

@ खशा और @alexis_laz के लिए धन्यवाद। मानक:

> require(rbenchmark) 
> benchmark(m(r, N), 
+   m1(r, N), 
+   mvec(r, N), 
+   alexis(r, N), 
+   replications = 10, order = "elapsed") 
      test replications elapsed relative user.self sys.self user.child sys.child 
4 alexis(r, N)   10 4.73 1.000  4.63  0.11   NA  NA 
3 mvec(r, N)   10 5.36 1.133  5.18  0.18   NA  NA 
2  m1(r, N)   10 5.48 1.159  5.29  0.19   NA  NA 
1  m(r, N)   10 61.41 12.983  60.43  0.90   NA  NA 
+1

vectorized जा सकती है, मूल है क्या समारोह का उद्देश्य? क्या आप इसे समझा सकते हैं! –

+0

एक मैट्रिक्स आयाम वाले वेक्टर है। – Tensibai

+0

यदि गति आपकी चिंता है, तो आपको लागू कार्यों का उपयोग करने पर विचार करना चाहिए। – Ansjovis86

उत्तर

6

यह काफी तेजी से किया जाना चाहिए के रूप में यह डबल अनुक्रमण पर कार्रवाई से बचा जाता है

m1 <- function(r, N) { 
    ic <- matrix(0, nrow = N, ncol=ncol(r)) 
    for (i in 1:ncol(r)) { 
    p <- r[, i] 
    ic[, i][p] <- 1 
    } 
    tcrossprod(ic) 
} 

system.time(ic1 <- m1(r, N)) 
# user system elapsed 
# 0.53 0.01 0.55 

all.equal(ic, ic1) 
# [1] TRUE 

सरल "गिनती/जोड़ने" प्रक्रिया के लगभग हमेशा

mvec <- function(r, N) { 
    ic <- matrix(0, nrow = N, ncol=ncol(r)) 
    i <- rep(1:ncol(r), each=nrow(r)) 
    ic[cbind(as.vector(r), i)] <- 1 
    tcrossprod(ic) 
} 
+0

ग्रेट, 10x तेज तो अधिक! धन्यवाद। लेकिन मुझे अभी भी आश्चर्य है, क्या हम बिना लूप के ऐसा कर सकते हैं? – minem

+0

हां, हम लूप के बिना ऐसा कर सकते हैं। अद्यतन – Khashaa

+0

देखें धन्यवाद! क्या आप गधे का जवाब देने के लिए अपना पहला फ़ंक्शन (लूप के साथ) जोड़ सकते हैं, इसलिए मैं सभी 3 कार्यों के लिए कुछ मानक जोड़ सकता हूं। – minem

संबंधित मुद्दे