我正在嘗試計算3 x 3 鄰域中柵格單元i與其鄰居j s (即(ji)^ 2)之間差異的平方,然后計算這些差異的平均值并將該結果分配給單元格i。我找到了 Forrest R. Stevens 給出的這個答案,它接近我想要實作的目標,但我只有一個包含 136710 個像元(1 089 130 個與相鄰函式的組合)的柵格(不是堆疊),所以對于回圈需要永遠。
我想使用 raster 包中的函式 focus,所以 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 值。
謝謝!
uj5u.com熱心網友回復:
你可以試試這個:
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)
轉載請註明出處,本文鏈接:https://www.uj5u.com/net/327625.html
標籤:r
