矩阵中的移动平均线 - 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 = 1j = 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)])