2013-01-14 30 views
8

की डायगोनल प्रविष्टियों के मूल्य को असाइन करें मुझे लूप के अंदर एक एम * एन मैट्रिक्स के एकल स्लॉट तक पहुंचने और असाइन करने की आवश्यकता है। कोड अब तक:मैट्रिक्स

rowCount <- 9 
similMatrix = matrix(nrow = rowCount - 1, ncol = rowCount) 
show(similMatrix) 
for(i in (rowCount - 1)){ 
    for (j in rowCount) 
    if (i == j){ 
     similMatrix[i == j] <- 0; 
    } 
} 
show(similMatrix) 
तो

अगर मैं = j मैट्रिक्स में एनए मूल्य की जरूरत है 0.

+0

आप नहीं कर रहे हैं वांछित आउटपुट प्राप्त करना? –

उत्तर

10

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

for(i in 1:(rowCount - 1)){ # need an expression that retruns a sequence 
    for (j in 1:rowCount)  # ditto 
    if (i == j){ 
     similMatrix[i,j] <- 0; # need to index the matrix with two element if using i,j 
    } 
} 
#---------- 
> show(similMatrix) 
    [,1] [,2] [,3] [,4] [,5] [,6] [,7] [,8] [,9] 
[1,] 0 NA NA NA NA NA NA NA NA 
[2,] NA 0 NA NA NA NA NA NA NA 
[3,] NA NA 0 NA NA NA NA NA NA 
[4,] NA NA NA 0 NA NA NA NA NA 
[5,] NA NA NA NA 0 NA NA NA NA 
[6,] NA NA NA NA NA 0 NA NA NA 
[7,] NA NA NA NA NA NA 0 NA NA 
[8,] NA NA NA NA NA NA NA 0 NA 

लेकिन आर में लूप का सहारा आम तौर पर एक अंतिम उपाय माना जाता है एक ही "लूप" आपरेशन करने का एक और अधिक कॉम्पैक्ट तरीका नहीं है और यह सामान्यीकरण करता है (कभी कभी गलत कारणों के लिए।) केवल विकर्ण सेट करने से अधिक व्यापक रूप से।

similMatrix[ row(similMatrix) == col(similMatrix) ] <- 0 
> similMatrix 
    [,1] [,2] [,3] [,4] [,5] [,6] [,7] [,8] [,9] 
[1,] 0 NA NA NA NA NA NA NA NA 
[2,] NA 0 NA NA NA NA NA NA NA 
[3,] NA NA 0 NA NA NA NA NA NA 
[4,] NA NA NA 0 NA NA NA NA NA 
[5,] NA NA NA NA 0 NA NA NA NA 
[6,] NA NA NA NA NA 0 NA NA NA 
[7,] NA NA NA NA NA NA 0 NA NA 
[8,] NA NA NA NA NA NA NA 0 NA 

आप subdiagonal शून्य पर सेट करना चाहता है तो आप सिर्फ इस्तेमाल कर सकते हैं:

similMatrix[ row(similMatrix)-1 == col(similMatrix) ] <- 0 

आप अतिरिक्त पंक्ति पैदा करने से बच सकते हैं और col मैट्रिक्स का उपयोग करते हुए इस:

mind <- min(dim(similMatrix)) 
# avoid going outside dimensions if not symmetric 
similMatrix[ cbind(seq(maxd),seq(maxd)) <- 0 
+0

यह सही है, बहुत बहुत धन्यवाद! –

+1

मुझे लगता है कि 'पंक्ति (चटाई)' और 'कॉल (चटाई)' दो मैट्रिक्स उत्पन्न करेगा, इसका मतलब यह नहीं होगा कि हम मेमोरी खपत को तीन गुना कर रहे हैं? यदि 'mat' बड़ा होने के लिए हुआ, तो मुझे लगता है कि इससे समस्याएं पैदा हो सकती हैं। – qed

+0

काफी सही। मुझे कोई चेतावनी नहीं मिली कि ये बड़ी matrices थे। मैं जिस कॉम्पैक्टनेस की पेशकश कर रहा था वह अभिव्यक्ति में था, लेकिन जैसा कि आप इंगित करते हैं कि यह स्मृति पदचिह्न में कॉम्पैक्ट नहीं हो सकता है। कोई 'सिमिलमैट्रिक्स [cbind (1: (rowCount - 1), 1: (rowCount - 1)] <- 0' का उपयोग करके कल्पना कर सकता है और मुझे लगता है कि यह स्मृति और गति दोनों के लिए एक बेहतर फैशन में प्रदर्शन करेगा। यह सोचकर कि एक कम पदचिह्न हो सकता है कि 'mat [diag (mat)] <-0' दृष्टिकोण। –

27

से बदलने की आप के प्रयोजन के लिए समारोह diag<-

m <- matrix(1:12, nrow=3) 
m 
    [,1] [,2] [,3] [,4] 
[1,] 1 4 7 10 
[2,] 2 5 8 11 
[3,] 3 6 9 12 

diag(m) <- 0 
m 
    [,1] [,2] [,3] [,4] 
[1,] 0 4 7 10 
[2,] 2 0 8 11 
[3,] 3 6 0 12 
+0

वह 'हटाएं-मेरा-उत्तर-और-अपवॉट-द-अन्य' बटन कहां है? – mnel

+0

धन्यवाद, यह काम करता है, लेकिन मैं अब एम [1, 2] कहने के लिए मूल्य कैसे आवंटित कर सकता हूं? –