2011-11-02 19 views
6

में विकर्ण तत्वों को प्रतिस्थापित करें क्या किसी को मैट्रिक्स के लिए diag(x) <- value के उपयोग के समान सरणी में विकर्ण तत्वों को प्रतिस्थापित करने के लिए एक साफ/कुशल तरीका पता है? इस तरह दूसरे शब्दों कुछ में:एक सरणी

> m<-array(1:27,c(3,3,3)) 
> for(k in 1:3){ 
+ diag(m[,,k])<-5 
+ } 
> m 
, , 1 

    [,1] [,2] [,3] 
[1,] 5 4 7 
[2,] 2 5 8 
[3,] 3 6 5 

, , 2 

[,1] [,2] [,3] 
[1,] 5 13 16 
[2,] 11 5 17 
[3,] 12 15 5 

, , 3 

    [,1] [,2] [,3] 
[1,] 5 22 25 
[2,] 20 5 26 
[3,] 21 24 5 

लेकिन पाश के लिए एक का उपयोग किए बिना (मेरी सरणियों बहुत बड़े हैं और इस हेरफेर पहले से ही एक पाश के भीतर हो जाएगा)।

बहुत धन्यवाद।

उत्तर

6

इस प्रयास करें:

with(expand.grid(a = 1:3, b = 1:3), replace(m, cbind(a, a, b), 5)) 

संपादित करें:

प्रश्न के लिए स्वच्छ/कुशल लेकिन, ज़ाहिर है, उन एक ही बात नहीं कर रहे हैं के लिए कहा। यहां एक लाइनर कॉम्पैक्ट और लूप-फ्री है लेकिन यदि आप गति की तलाश में हैं तो मुझे लगता है कि आप पाएंगे कि प्रश्न में लूप वास्तव में सभी उत्तरों का सबसे तेज़ है।

+0

+1 बहुत अच्छा है। यह मेरे फ़ंक्शन कोड से तेज़ है। –

+0

अच्छा काम, चीयर्स! – gjabel

5

आप इसके लिए निम्न फ़ंक्शन का उपयोग कर सकते हैं, बशर्ते आपके सरणी में केवल 3 आयाम हों। आप इस कोड के आधार पर अधिक आयामों को सामान्यीकरण कर सकते हैं, लेकिन मैं भी है कि आप ;-) के लिए

`arraydiag<-` <- function(x,value){ 
    dims <- dim(x) 
    id <- seq_len(dims[1]) + 
     dims[2]*(seq_len(dims[2])-1) 
    id <- outer(id,(seq_len(dims[3])-1)*prod(dims[1:2]),`+`) 
    x[id] <- value 
    dim(x) <- dims 
    x 
} 

इस तरह काम करता है करने के लिए आलसी हूँ:

m<-array(1:36,c(3,3,4)) 
arraydiag(m)<-NA 
m 

ध्यान दें कि, निदान के विपरीत() फ़ंक्शन, यह फ़ंक्शन उन मैट्रिक्स से निपट नहीं सकता जो वर्ग नहीं हैं। इस कोड को अनुकूलित करने के तरीके को जानने के लिए आप डायग() के स्रोत कोड को देख सकते हैं।

+0

भयानक, एक इलाज करता है! – gjabel

3
diagArr <- 
function (dim) 
{ 
    n <- dim[2] 
    if(dim[1] != n) stop("expecting first two dimensions to be equal") 
    d <- seq(1, n*n, by=n+1) 
    as.vector(outer(d, seq(0, by=n*n, length=prod(dim[-1:-2])), "+")) 
} 

m[diagArr(dim(m))] <- 5 

यह इरादा है कि यह 3 की तुलना में अधिक आयामों के लिए काम करता है लेकिन मुझे लगता है कि मामले में यह परीक्षण नहीं किया साथ लिखा है। हालांकि ठीक होना चाहिए।

+0

यह dims> पर एक विकर्ण मैट्रिक्स नहीं बनाता है। यह एकाधिक एन एक्स एन विकर्ण मैट्रिक्स बनाता है। – papirrin