首页 > 解决方案 > R 焦点函数:计算栅格单元和邻域之间的差平方并找到 3x3 窗口的平均值

问题描述

我正在尝试计算 3 x 3 邻域中栅格单元i与其邻居j s (即(ji)^2)之间的差异的平方,然后计算这些差异的平均值并将该结果分配给单元格i。我找到了 Forrest R. Stevens 给出的这个答案,它接近我想要实现的目标,但我只有一个栅格(不是堆栈),其中包含 136710 个单元(与相邻函数的 1 089 130 个组合),所以对于循环是永远的。

我想使用 raster 包中的焦点函数,因此 for 循环仅针对 3x3 矩阵运行,但它不适用于我。这是一个使用我上面提到的 Forrest R. Stevens 代码的示例:

r <- raster(matrix(1:25,nrow=5))
r[] <-c(2,3,2,3,2,
        3,2,3,2,NA,
        NA,3,2,3,2,
        NA,2,3,2,3,
        2,3,2,3,NA)
##  Calculate adjacent raster cells for each focal cell:
a <- raster::adjacent(r, cell=1:ncell(r), directions=8, sorted=T)
# Function
sq_dff<- function(w){
  ##  Create column to store calculation:
  out <- data.frame(a)
  out$sqrd_diff <- NA
  ##  Loop over all focal cells and their adjacencies,
  ##    extract the values across all layers and calculate
  ##    the squared difference, storing it in the appropriate row of
  ##    our output data.frame:
  cores <- 8
  beginCluster(cores, type='SOCK')
  for (i in 1:nrow(a)) {
    print(i)
    out$sqrd_diff[i] <- (r[a[i,2]]- r[a[i,1]])^2
    print(Sys.time())
  }
  endCluster()
  ##  Take the mean of the squared differences by focal cell ID:
  r_out_vals <- aggregate(out$sqrd_diff, by=list(out$from), FUN=mean,na.rm=T)
  names(r_out_vals)<- c('cell_numb','value')
  return(r_out_vals$value)
}


r1 <- focal(x=r, w=matrix(1,3,3), fun=sq_dff)

如果我像这样应用它,该函数运行良好:r1 <-sq_dff(r),并使用#r_out <- r[[1]]; #r_out[] <- r_out_vals$value; return(r_out) (正如 Forrest R. Stevens 在他的回答中所建议的那样)而不是 return(r_out_vals$value)

但是,当我将它应用到上面所写的焦点函数中时,它会返回一个栅格,其中只有中心的九个像元的值,并且所有这些像元都分配了相同的 0.67 值。

谢谢!

标签: r

解决方案


你可以试试这个:

library(terra)
r <- rast(matrix(1:25,nrow=5))
r[] <-c(2,3,2,3,2,
        3,2,3,2,NA,
        NA,3,2,3,2,
        NA,2,3,2,3,
        2,3,2,3,NA)
        
f <- function(x) {
    mean((x[-5] - x[5])^2, na.rm=TRUE)
}

rr <- focal(r, 3 ,f)
plot(rr)
text(rr, dig=2)

推荐阅读