में एक बड़े मैट्रिक्स केंद्र मैं केंद्र के लिए एक बड़े मैट्रिक्स है कि मैं करना चाहते हैं:कुशलतापूर्वक आर
X <- matrix(sample(1:10, 5e+08, replace=TRUE), ncol=10000)
ढूँढना साधन त्वरित और colMeans साथ कुशल है:
means <- colMeans(X)
लेकिन क्या एक प्रत्येक कॉलम से संबंधित माध्य घटाने के लिए अच्छा (तेज़ और मेमोरी कुशल) तरीका? यह काम करता है, लेकिन यह सही नहीं लगता:
for (i in 1:length(means)){
X[,i] <- X[,i]-means[i]
}
क्या कोई बेहतर तरीका है?
/संपादन: यहाँ एक संशोधन विभिन्न मानक DWin लिखा है, एक बड़ा मैट्रिक्स पर, सुझाव अन्य तैनात सहित:
require(rbenchmark)
X <- matrix(sample(1:10, 5e+07, replace=TRUE), ncol=10000)
frlp.c <- compiler:::cmpfun(function(mat){
means <- colMeans(mat)
for (i in 1:length(means)){
mat[,i] <- mat[,i]-means[i]
}
return(mat)
})
mat.c <- compiler:::cmpfun(function(mat){
t(t(X) - colMeans(X))
})
swp.c <- compiler:::cmpfun(function(mat){
sweep(mat, 2, colMeans(mat), FUN='-')
})
scl.c <- compiler:::cmpfun(function(mat){
scale(mat, scale=FALSE)
})
matmult.c <- compiler:::cmpfun(function(mat){
mat-rep(1, nrow(mat)) %*% t(colMeans(mat))
})
benchmark(
frlp.c=frlp.c(X),
mat=mat.c(X),
swp=swp.c(X),
scl=scl.c(X),
matmult=matmult.c(X),
replications=10,
order=c('replications', 'elapsed'))
matmult समारोह नया विजेता हो रहा है! मैं वास्तव में इन्हें 5e + 08 तत्व मैट्रिक्स पर आज़माकर देखना चाहता हूं, लेकिन मैं रैम से बाहर चल रहा हूं।
test replications elapsed relative user.self sys.self user.child sys.child
5 matmult 10 11.98 1.000 7.47 4.47 NA NA
1 frlp.c 10 35.05 2.926 31.66 3.32 NA NA
2 mat 10 50.56 4.220 44.52 5.67 NA NA
4 scl 10 58.86 4.913 50.26 8.42 NA NA
3 swp 10 61.25 5.113 51.98 8.64 NA NA
शायद 'स्केल' मज़ेदार आपकी मदद कर सकता है। 'स्केल' देखें। एक और उपयोगी काम 'स्वीप' हो सकता है। –
@Jiber: स्केल फ़ंक्शन ऊपर लूप के मुकाबले बहुत धीमा है। हालांकि, काम करना चाहिए, धन्यवाद! – Zach
'वूबर' कौन है? 'बेंचमार्क' समारोह Wacek Kusnierczyk द्वारा लिखा गया था। –