R 移动矩阵子集内的计数值
说下面的矩阵R 移动矩阵子集内的计数值,r,matrix,subset,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
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”数。
e、 g
我已经尝试了下面的循环,但是它没有给出我需要的
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个单元格)。任何提示都将不胜感激!谢谢
#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
对于i
行和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
最简单的方法是编写一个函数来获取邻域,然后求和
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])
}
set.seed(42)
mat=圆形(矩阵(runif(100),ncol=5))
材料和=矩阵(nrow=20,ncol=5)
适用于(x英寸序列(nrow(mat))){
对于(序列中的y(ncol(mat))){
材料和[x,y]谢谢d.b,但我没有得到与您相同的表:-/a确实没有!我忘记了runif每次都会提供一个随机数据集;-)它工作得很好!谢谢,我理解您的建议。唯一的问题是当单元格位于边上时。子集不完整,并且使用矩阵另一侧的值来完成。现在看到了吗这不是我想要的行为——我只看了右上角,没有看到它们不应该环绕,因为底部有很多零。现在修正我的答案。
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])
}