说出以下矩阵
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个单元格)。任何提示都表示赞赏!感谢
答案 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-1
到i+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)。