如何用 size = n 的变量移动寡妇中的最大值替换矩阵中的每个元素?

How to replace every element in a matrix with the maximum of the values within a variable moving widow of size = n?

所以本质上,我想要做的是用 window 中由该单元格中的值确定的最大相邻单元格替换矩阵中的每个元素。

window 大小将由以下函数确定:'fitlwr'(下图),其中 Tree_Height 调用适合树高和树冠直径数据集的线性模型数据:

RoundOdd <- function(x) {2*floor(x/2)+1} #makes sure window size is an odd number

fitlwr <- function(x){for(i in x){
  if(i > 13){
    m <- RoundOdd(Tree_Heights[Tree_Heights$Tree_Height == i, "fit.lwr"]) 
  return(matrix(1, nrow = m, ncol = m))
    }
  else {
    return(matrix(1, 3, 3))
    }
}}

然后我想用 window 中的最大值替换该矩阵中的每个值,栅格焦点函数是我的首选,但它们不允许您使用变量 window尺寸。

矩阵源自栅格图层,值表示给定像元的地面以上高度。尺寸为 6,571 x 5,764。一部分数据可能如下所示:

      [,1] [,2] [,3] [,4] [,5] [,6] [,7] [,8] [,9] [,10]
 [1,]    9   47  103   58   80   55   72   56   14    52
 [2,]   68   49   49   43   62   80   62   23   55    82
 [3,]   58   10   79   70   75   49   68   60   74    79
 [4,]   78   19   51   26   61   77   57   70   51    43
 [5,]   47   88   57   80   25   33   24   30   56    63
 [6,]   73   36   53   25   63   30   19   59   17    63
 [7,]   95    9   49   95    6   13   21   75   60    34
 [8,]   36   65   47   64   22   66   52    9   71    20
 [9,]   45   53   31   47  114   55   44   42   44    44
[10,]   47   23  102   34   67   60    5   23   61    32

对于一个vector,可以按如下方式进行:

说,

x = c(1,3,2,1,4,2) 
y = x # copy the vector
N=2 # window size, you can set any number you want.
for (i in 1:length(x)){ 
   y[i] = max(x[i-N:i+N]) 
} 

结果是

> y
[1] 3 3 3 3 4 4

对于矩阵,

有点复杂, 假设 X 是,

X = matrix(sample(100, 36), ncol=6)
> X
     [,1] [,2] [,3] [,4] [,5] [,6]
[1,]    9   72   17   62   41   47
[2,]   18   33   61   30   16   35
[3,]   38   96   37   60   13   70
[4,]    4   44   69   78   80   90
[5,]   39   81   65   24   28   11
[6,]   73   75   25   98   64  100

您可以按如下方式解决:

Y=X # copy the matrix
N=2 # any window size 
for (i in 1:nrow(X)){ 
   for (j in 1:ncol(X)){ 
      Y[i,j] = max( X[ max(1,i-N):min(nrow(X),i+N), max(1,j-N):min(ncol(X),j+N)] ) 
   }
}

结果是

> Y
     [,1] [,2] [,3] [,4] [,5] [,6]
[1,]   96   96   96   96   70   70
[2,]   96   96   96   96   90   90
[3,]   96   96   96   96   90   90
[4,]   96   98   98  100  100  100
[5,]   96   98   98  100  100  100
[6,]   81   98   98  100  100  100

谢谢 Ibilgen,您的解决方案奏效了,我对其进行了一些修改,以最大程度地进行圆周移动 window。

这是一个矩形移动window:

Y <- X
for (i in 1:nrow(X)){ 
   for (j in 1:ncol(X)){ 
      N <- fitlwr(X[i,j])
      Y[i,j] = max(X[max(1, i-N):min(nrow(X), i+N), max(1, j-N):min(ncol(X), j+N)]) 
  }
}

fitlwr() #是一个自定义函数,它调用一个线性模型,该模型将单元格的值与移动的预期半径相匹配window

这里是循环移动window:

Y <- X
for (i in 1:nrow(X)){ 
   for (j in 1:ncol(X)){ 
      N = fitlwr(X[i,j])
      M = X[max(1, i-N):min(nrow(X), i+N), max(1, j-N):min(ncol(X), j+N)]
      W = reshape2::melt(M)
      W$d2 = sqrt((W$Var1-mean(W$Var1))^2 + (W$Var2-mean(W$Var2))^2)
      Y[i,j] = max(X[i,j], max(subset(W, d2 <= N, select = value)))}
}