计算移动矩阵子集内的值

时间:2017-07-24 15:56:50

标签: r matrix subset

说出以下矩阵

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))
}}

我需要能够将子集扩展到我的数据上的10x10框(> 1000x1000个单元格)。任何提示都表示赞赏!感谢

2 个答案:

答案 0 :(得分: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-1i+1行和j-1到{{}内的矩阵中元素的总和1}}列。如果值超出范围,请根据需要替换最小或最大索引。

j+1

答案 1 :(得分:1)

最简单的方法是编写一个获取邻居的函数,然后获取总和。

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进行比较,因为sum(1,1,0)与sum相同(TRUE,TRUE,FALSE)。