r - 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 值。
谢谢!
解决方案
你可以试试这个:
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)
推荐阅读
- django-models - 如何在 Django 子查询中使用范围过滤?
- undefined - 为什么 isNaN() 未定义?
- expression - Power Automate Flow - 如何获取列名
- django - Django AJAX 使用分页获取下一个项目
- firebase - 删除按钮不会从视图中删除项目,而是在 firebase SwiftUI 上删除
- javascript - 为什么我的 async fetch 调用一直返回或退出到最外部的函数,执行外部函数,然后继续执行内部函数?
- react-native - 反应本机位置权限已被授予
- laravel - Laravel 检查今天日期是否存在任何记录
- visual-studio-2019 - NETStandard.Library 在 .NET Standard 2.0 项目中被引用
- pandas - 带有最小值、最大值和总和的 Pandas 数据框 Groupby