निम्नलिखित मैट्रिक्स कहो

mat = round(matrix(runif(100), ncol = 5))
mat
      [,1] [,2] [,3] [,4] [,5]
 [1,]    0    1    0    1    0
 [2,]    0    0    1    1    1
 [3,]    1    1    1    1    1
 [4,]    1    0    1    0    1
 [5,]    1    0    0    1    1
 [6,]    1    0    0    1    1
 [7,]    1    0    1    1    1
 [8,]    1    1    1    0    1
 [9,]    0    0    0    1    0
[10,]    0    0    0    1    1
[11,]    0    0    0    0    0
[12,]    1    1    0    0    1
[13,]    1    1    0    1    0
[14,]    1    0    1    0    1
[15,]    0    1    1    0    0
[16,]    1    1    0    1    1
[17,]    1    1    1    0    1
[18,]    1    1    1    1    1
[19,]    0    1    0    0    1
[20,]    1    1    0    0    0

मैं एक नया मैट्रिक्स उत्पन्न करना चाहता हूं जो मूल मैट्रिक्स के प्रत्येक सेल के चारों ओर 3x3 वर्ग सबसेट के भीतर "1" की संख्या होगी। जैसे

mat_sum
           [,1] [,2] [,3] [,4] [,5]
    [1,]    1    2    4    4    3
    [2,]    3    5    6    7    5
    [3,]    3    6    6    8    5
    etc.

मैंने निम्नलिखित लूप के साथ प्रयास किया है, लेकिन यह वह नहीं देता जो मुझे चाहिए

for(x in 1:(nrow(mat)-3)){
    for (y in 1:(ncol(mat)-3)){
        mat2[x,y] = sum(mat[c(x:x+2), c(y:y+2)] == 1))
}}

मुझे अपने डेटा (> 1000x1000 कोशिकाओं) पर सबसेट को 10x10 बॉक्स में विस्तारित करने में सक्षम होना चाहिए। किसी भी संकेत की सराहना की जाती है! धन्यवाद

1
Gabriel123 24 जुलाई 2017, 18:56

2 जवाब

सबसे बढ़िया उत्तर
#DATA
set.seed(42)
mat = round(matrix(runif(20), ncol = 5))
mat
#     [,1] [,2] [,3] [,4] [,5]
#[1,]    1    1    1    1    1
#[2,]    1    1    1    0    0
#[3,]    0    1    0    0    0
#[4,]    1    0    1    1    1

ith पंक्ति और jth कॉलम में प्रत्येक तत्व के लिए, i-1 से i+1 पंक्ति और j-1 से j+1 के भीतर मैट्रिक्स में तत्वों का योग प्राप्त करें। स्तंभ। यदि मान सीमा से बाहर हैं, तो आवश्यकतानुसार न्यूनतम या अधिकतम सूचकांक से बदलें।

t(sapply(1:NROW(mat), function(i)
    sapply(1:NCOL(mat), function(j)
        sum(mat[max(1, i-1):min(NROW(mat), i+1), max(1, j-1):min(NCOL(mat), j + 1)]))))
#     [,1] [,2] [,3] [,4] [,5]
#[1,]    4    6    5    4    2
#[2,]    5    7    6    4    2
#[3,]    4    6    5    4    2
#[4,]    2    3    3    3    2
2
d.b 24 जुलाई 2017, 19:08

ऐसा करने का सबसे आसान तरीका एक ऐसा फ़ंक्शन लिखना है जो पड़ोसियों को मिल जाए, और फिर योग लें।

set.seed(42)

mat = round(matrix(runif(100), ncol = 5))
mat_sum = matrix(nrow=20, ncol=5)

for(x in seq_len(nrow(mat))) {
  for (y in seq_len(ncol(mat))) {
    mat_sum[x,y] <- sum(getNeighbors(x, y, mat))
  }
}

getNeighbors <- function(x, y, mat) {
  unlist(mat[((x-2):(x)) %% nrow(mat) + 1, ((y-2):(y)) %% ncol(mat) + 1])
}

आपको 1 से तुलना करने की आवश्यकता नहीं है, क्योंकि योग(1, 1, 0) योग (सत्य, सत्य, असत्य) के समान है।

1
Julian Zucker 24 जुलाई 2017, 19:08