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

R 如何用size=n的变量中的最大值替换矩阵中的每个元素?,r,matrix,raster,nearest-neighbor,sp,R,Matrix,Raster,Nearest Neighbor,Sp,所以本质上,我想做的是用窗口内相邻单元格的最大值替换矩阵中的每个元素,该值由该单元格中的值决定 窗口大小将由以下函数确定:“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){

所以本质上,我想做的是用窗口内相邻单元格的最大值替换矩阵中的每个元素,该值由该单元格中的值决定

窗口大小将由以下函数确定:“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))
    }
}}

对于向量,可以按如下方式执行:

结果是

> y
[1] 3 3 3 3 4 4
> 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
对于矩阵, 这有点复杂, 假设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] 3 3 3 3 4 4
> 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,您的解决方案奏效了,我对其进行了轻微修改,以最大限度地利用圆形移动窗口

这适用于矩形移动窗口:

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)]) 
  }
}
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)))}
}

Y是否替换矩阵或向量中的每个元素?你能举一个你的X的例子吗?@ibilgen如上所述,我添加了一个例子,我想替换矩阵中的每个值。谢谢你,但是我如何将相同的方法应用于矩阵?窗口大小是二维的吗?如果你觉得我的答案有用,请投上一票。很高兴这有帮助。