矩阵中的移动平均线 - window 超出范围
moving averages in a matrix - window out of bounds
我有一个简单的矩阵:
x <- seq (1:100)
matrix_A = matrix(x, ncol = 10)
matrix_A
我想用大小为 3 x 3
的 运行 window 计算所有值的平均值
执行此操作的简单函数:
running_window_v1 <- function(mat.temp){
#Create an empty matrix to store calculations in it
mat.temp1=matrix(NA,ncol = ncol(mat.temp), nrow = nrow(mat.temp))
for (i in (1 : (nrow(mat.temp)))){
for (j in (1 : (ncol(mat.temp)))){
mat.temp1[i,j] = mean (mat.temp[i - 1, j - 1],
mat.temp[i - 1, j],
mat.temp[i- 1, j + 1],
mat.temp[i, j - 1],
mat.temp[i, j],
mat.temp[i, j + 1],
mat.temp[i + 1, j - 1],
mat.temp[i + 1, j],
mat.temp[i +1, j + 1])
}
}
return(mat.temp1)
}
running_window_v1(matrix_A)
这个脚本的问题很明显,我得到了错误,因为当(例如)i = 1
、j = 1
时,我正在调用矩阵 matrix_A[- 1, - 1]
中不存在的值。因此,只有当我按以下方式更改它时,函数才会起作用:
running_window_v2 <- function(mat.temp){
#Create an empty matrix to store calculations in it
mat.temp1=matrix(NA,ncol = ncol(mat.temp), nrow = nrow(mat.temp))
for (i in (2 : (nrow(mat.temp)-1))){
for (j in (2 : (ncol(mat.temp)-1))){
mat.temp1[i,j] = mean (mat.temp[i - 1, j - 1],
mat.temp[i - 1, j],
mat.temp[i- 1, j + 1],
mat.temp[i, j - 1],
mat.temp[i, j],
mat.temp[i, j + 1],
mat.temp[i + 1, j - 1],
mat.temp[i + 1, j],
mat.temp[i +1, j + 1])
}
}
return(mat.temp1)
}
> running_window_v2(matrix_A)
[,1] [,2] [,3] [,4] [,5] [,6] [,7] [,8] [,9] [,10]
[1,] NA NA NA NA NA NA NA NA NA NA
[2,] NA 1 11 21 31 41 51 61 71 NA
[3,] NA 2 12 22 32 42 52 62 72 NA
[4,] NA 3 13 23 33 43 53 63 73 NA
[5,] NA 4 14 24 34 44 54 64 74 NA
[6,] NA 5 15 25 35 45 55 65 75 NA
[7,] NA 6 16 26 36 46 56 66 76 NA
[8,] NA 7 17 27 37 47 57 67 77 NA
[9,] NA 8 18 28 38 48 58 68 78 NA
[10,] NA NA NA NA NA NA NA NA NA NA
对于我的工作,不丢失信息非常重要,我还需要对边缘进行平均(当然,使用较少的数字)。您有什么建议吗?如何修改函数 running_window_v1
使其适合我?
我知道我可以为每个可能的边缘编写额外的条件,但我正在寻找更优雅的条件。
您可以在每个循环中执行类似以下操作(而不是单独列出所有元素,在此处使用索引范围更容易)
mat.temp1[i,j] = mean(mat.temp[max(1,i-1):min(nrow(mat.temp),i+1),
max(1,j-1):min(ncol(mat.temp),j+1)])
我有一个简单的矩阵:
x <- seq (1:100)
matrix_A = matrix(x, ncol = 10)
matrix_A
我想用大小为 3 x 3
的 运行 window 计算所有值的平均值执行此操作的简单函数:
running_window_v1 <- function(mat.temp){
#Create an empty matrix to store calculations in it
mat.temp1=matrix(NA,ncol = ncol(mat.temp), nrow = nrow(mat.temp))
for (i in (1 : (nrow(mat.temp)))){
for (j in (1 : (ncol(mat.temp)))){
mat.temp1[i,j] = mean (mat.temp[i - 1, j - 1],
mat.temp[i - 1, j],
mat.temp[i- 1, j + 1],
mat.temp[i, j - 1],
mat.temp[i, j],
mat.temp[i, j + 1],
mat.temp[i + 1, j - 1],
mat.temp[i + 1, j],
mat.temp[i +1, j + 1])
}
}
return(mat.temp1)
}
running_window_v1(matrix_A)
这个脚本的问题很明显,我得到了错误,因为当(例如)i = 1
、j = 1
时,我正在调用矩阵 matrix_A[- 1, - 1]
中不存在的值。因此,只有当我按以下方式更改它时,函数才会起作用:
running_window_v2 <- function(mat.temp){
#Create an empty matrix to store calculations in it
mat.temp1=matrix(NA,ncol = ncol(mat.temp), nrow = nrow(mat.temp))
for (i in (2 : (nrow(mat.temp)-1))){
for (j in (2 : (ncol(mat.temp)-1))){
mat.temp1[i,j] = mean (mat.temp[i - 1, j - 1],
mat.temp[i - 1, j],
mat.temp[i- 1, j + 1],
mat.temp[i, j - 1],
mat.temp[i, j],
mat.temp[i, j + 1],
mat.temp[i + 1, j - 1],
mat.temp[i + 1, j],
mat.temp[i +1, j + 1])
}
}
return(mat.temp1)
}
> running_window_v2(matrix_A)
[,1] [,2] [,3] [,4] [,5] [,6] [,7] [,8] [,9] [,10]
[1,] NA NA NA NA NA NA NA NA NA NA
[2,] NA 1 11 21 31 41 51 61 71 NA
[3,] NA 2 12 22 32 42 52 62 72 NA
[4,] NA 3 13 23 33 43 53 63 73 NA
[5,] NA 4 14 24 34 44 54 64 74 NA
[6,] NA 5 15 25 35 45 55 65 75 NA
[7,] NA 6 16 26 36 46 56 66 76 NA
[8,] NA 7 17 27 37 47 57 67 77 NA
[9,] NA 8 18 28 38 48 58 68 78 NA
[10,] NA NA NA NA NA NA NA NA NA NA
对于我的工作,不丢失信息非常重要,我还需要对边缘进行平均(当然,使用较少的数字)。您有什么建议吗?如何修改函数 running_window_v1
使其适合我?
我知道我可以为每个可能的边缘编写额外的条件,但我正在寻找更优雅的条件。
您可以在每个循环中执行类似以下操作(而不是单独列出所有元素,在此处使用索引范围更容易)
mat.temp1[i,j] = mean(mat.temp[max(1,i-1):min(nrow(mat.temp),i+1),
max(1,j-1):min(ncol(mat.temp),j+1)])