2009-11-16 9 views
31

मैं एक वर्ग मैट्रिक्स बनाने के लिए आर कोड लिख रहा हूँ। तो मेरी दृष्टिकोण है:आर, न्यूल बनाम एनए में मैट्रिक्स आवंटित करने का सबसे अच्छा तरीका?

  1. मेरी मैट्रिक्स के प्रत्येक तत्व के माध्यम से सही आकार
  2. लूप के एक मैट्रिक्स का आवंटन और एक उचित मूल्य

मेरा प्रश्न के साथ इसे भरने है वास्तव में सरल: क्या है इस मैट्रिक्स को पूर्व-आवंटित करने का सबसे अच्छा तरीका? इस प्रकार अब तक, मैं दो तरीके हैं:

> x <- matrix(data=NA,nrow=3,ncol=3) 
> x 
    [,1] [,2] [,3] 
[1,] NA NA NA 
[2,] NA NA NA 
[3,] NA NA NA 

या

> x <- list() 
> length(x) <- 3^2 
> dim(x) <- c(3,3) 
> x 
    [,1] [,2] [,3] 
[1,] NULL NULL NULL 
[2,] NULL NULL NULL 
[3,] NULL NULL NULL 

जहां तक ​​मैं देख सकता हूँ, पूर्व उत्तरार्द्ध की तुलना में एक अधिक संक्षिप्त तरीका है। इसके अलावा, पूर्व एनएएस के साथ मैट्रिक्स भरता है, जबकि बाद में एनयूएलएल से भरा होता है।

ऐसा करने के लिए "बेहतर" तरीका कौन सा है? इस मामले में, मैं "बेहतर" को "बेहतर प्रदर्शन" के रूप में परिभाषित कर रहा हूं, क्योंकि यह सांख्यिकीय कंप्यूटिंग है और यह ऑपरेशन बड़े डेटासेट के साथ होगा।

जबकि पूर्व अधिक संक्षिप्त है, यह समझने में आसान नहीं है, इसलिए मुझे लगता है कि यह किसी भी तरह से जा सकता है।

इसके अलावा, आर में एनए और न्यूल के बीच क्या अंतर है? ? NA और? NULL मुझे बताओ कि "एनए" की लंबाई "1" है जबकि न्यूल की लंबाई "0" है - लेकिन क्या यहां और कुछ है? या एक सर्वोत्तम अभ्यास? यह मेरी मैट्रिक्स बनाने के लिए उपयोग की जाने वाली विधि को प्रभावित करेगा।

+1

नहीं पूछा गया है, आप अपने मैट्रिक्स के तत्वों पर * लूप * क्यों चाहते हैं? क्या यह संभव है कि आप इसके बजाय वेक्टरकृत ऑपरेशन का उपयोग कर सकें? यह आपका अगला प्रश्न होना चाहिए! :) – Harlan

+0

@ हर्लान जो मूल रूप से मुझे यहां इस प्रश्न में मिल रहा है: http://stackoverflow.com/questions/1719447/outer-equivalent-for-non-vector-lists-in-r। यदि आपके पास कोई सुझाव है, तो मुझे यह सुनना अच्छा लगेगा! – poundifdef

उत्तर

44

संदेह में, स्वयं का परीक्षण करें। पहला दृष्टिकोण दोनों आसान और तेज़ है।

> create.matrix <- function(size) { 
+ x <- matrix() 
+ length(x) <- size^2 
+ dim(x) <- c(size,size) 
+ x 
+ } 
> 
> system.time(x <- matrix(data=NA,nrow=10000,ncol=10000)) 
    user system elapsed 
    4.59 0.23 4.84 
> system.time(y <- create.matrix(size=10000)) 
    user system elapsed 
    0.59 0.97 15.81 
> identical(x,y) 
[1] TRUE 

एनए और शून्य के बीच अंतर के बारे में:

वास्तव में चार विशेष स्थिरांक हैं।

इसके अतिरिक्त, चार विशेष स्थिरांक, न्यूल, एनए, इंफ और नाएन हैं।

एनयूएलएल का उपयोग खाली वस्तु को इंगित करने के लिए किया जाता है। एनए अनुपस्थित ("उपलब्ध नहीं") डेटा मानों के लिए उपयोग किया जाता है। इंफ इंफिनिटी को इंगित करता है और आईईईई फ्लोटिंग पॉइंट कैलकुस (उदाहरण के लिए क्रमशः 1/0 और 0/0 ऑपरेशन के परिणाम) में ना-एन-नंबर नहीं है।

आप the R manual on language definition में और अधिक पढ़ सकते हैं।

+0

हू, सिस्टम.टाइम के बारे में भी नहीं पता था। आपको बहुत - बहुत धन्यवाद! – poundifdef

+0

यदि आप विधियों की तुलना करने जा रहे हैं तो क्या आपको किसी फ़ंक्शन में दोनों विधियों को लपेटना नहीं चाहिए? फ़ंक्शन कॉल के साथ ओवरहेड जोड़ा गया है। – Dason

+0

@Dason अभ्यास में, यदि कोई अक्सर लंबी विधि का उपयोग करना चाहता था, तो शायद यह किसी फ़ंक्शन में लपेटा नहीं जाएगा? जबकि 'मैट्रिक्स' जैसा ही रहेगा। – Gregor

3

this article के अनुसार हम के साथ NA_real_ के साथ प्रीलोकेट करके बेहतर प्रदर्शन कर सकते हैं। लेख से:

जैसे ही आप 'x' में किसी भी कक्ष में संख्यात्मक मान आवंटित करते हैं, तो मैट्रिक्स को पहले एक नया मान असाइन किए जाने पर संख्यात्मक को मजबूर होना होगा। मूल रूप से आवंटित लॉजिकल मैट्रिक्स व्यर्थ में आवंटित किया गया था और कचरा कलेक्टर के लिए केवल एक अनावश्यक स्मृति पदचिह्न और अतिरिक्त काम जोड़ता है। बजाय (पूर्णांकों के लिए या NA_integer_) NA_real_ का उपयोग कर

के रूप में सिफारिश की है कि यह आवंटन: चलो यह परीक्षण करते हैं।

testfloat = function(mat){ 
    n=nrow(mat) 
    for(i in 1:n){ 
    mat[i,] = 1.2 
    } 
} 

>system.time(testfloat(matrix(data=NA,nrow=1e4,ncol=1e4))) 
user system elapsed 
3.08 0.24 3.32 
> system.time(testfloat(matrix(data=NA_real_,nrow=1e4,ncol=1e4))) 
user system elapsed 
2.91 0.23 3.14 

और पूर्णांकों के लिए:

testint = function(mat){ 
    n=nrow(mat) 
    for(i in 1:n){ 
    mat[i,] = 3 
    } 
} 

> system.time(testint(matrix(data=NA,nrow=1e4,ncol=1e4))) 
user system elapsed 
2.96 0.29 3.31 
> system.time(testint(matrix(data=NA_integer_,nrow=1e4,ncol=1e4))) 
user system elapsed 
2.92 0.35 3.28 

अंतर अपने परीक्षण मामलों में छोटा है, लेकिन यह नहीं है।

+1

'3' कक्षा 'संख्यात्मक' है, जिसका आप शायद 3 एल मतलब था। फिर भी मुझे केवल एनए का उपयोग करने का कोई मापनीय प्रदर्शन प्रभाव नहीं दिख रहा है (भले ही 20 एस प्रत्येक के लिए माप हो और यह सुनिश्चित कर लें कि जीसी अपना काम करता है) –

0
rows<-3 
cols<-3  
x<-rep(NA, rows*cols) 
x1 <- matrix(x,nrow=rows,ncol=cols) 
संबंधित मुद्दे