Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/qt/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
R焦点(光栅包):如何对背景数据子集应用过滤器?_R_Optimization_R Raster - Fatal编程技术网

R焦点(光栅包):如何对背景数据子集应用过滤器?

R焦点(光栅包):如何对背景数据子集应用过滤器?,r,optimization,r-raster,R,Optimization,R Raster,我想知道你们中是否有人可以帮助我完成以下任务,处理R raster包中的focal()函数 默认情况下,focal()函数将运行给定光栅(“背景”光栅)的每个单元格,并将给定函数应用于用户定义的移动窗口定义的相邻值。为了优化和加速大型光栅/研究区域的计算,我希望仅当“背景”光栅在“移动窗口”覆盖的范围内具有某些值(例如大于零)并跳过所有其他焦点单元时,才应用此功能(过滤器)。这样,过滤器就不会在不需要计算焦点值的地方花费时间 下面是一个可复制的小示例和在线注释: library(raster)

我想知道你们中是否有人可以帮助我完成以下任务,处理R raster包中的focal()函数

默认情况下,focal()函数将运行给定光栅(“背景”光栅)的每个单元格,并将给定函数应用于用户定义的移动窗口定义的相邻值。为了优化和加速大型光栅/研究区域的计算,我希望仅当“背景”光栅在“移动窗口”覆盖的范围内具有某些值(例如大于零)并跳过所有其他焦点单元时,才应用此功能(过滤器)。这样,过滤器就不会在不需要计算焦点值的地方花费时间

下面是一个可复制的小示例和在线注释:

library(raster)

x <- matrix(1:25, ncol=5)
x[c(1,2,3,6,7,8,11,12,13)] <- 0
r <- raster(x)

#Apply filter to focal cells and return values using a 3x3 moving window...ONLY IF 
#ALL values found within the window are > 0. Skip focal cell otherwise.

r3 <- focal(r, w=matrix(1/9,nrow=3,ncol=3), FUN=sum)
库(光栅)

xwindows幻灯片在所有焦点像素位置都运行。不可能跳过/跳转位置。但是,您可以检查所有元素/矩阵单元是否满足您的阈值条件,如下所示:

myfunc = function (x){
  if(all(x > threshold)){
    print(x)
    x = sum(x)
  }else{
    x = 0}
}
r3 <- focal(x=r>1, w=matrix(1/9,nrow=3,ncol=3), fun=sum)
myfunc=函数(x){
如果(全部(x>阈值)){
打印(x)
x=总和(x)
}否则{
x=0}
}
R31,w=矩阵(1/9,nrow=3,ncol=3),fun=sum)

我不确定它是否会更快,但您也可以检查中心单元格是否符合某些标准(例如,为NA或>0)。这样,焦点计算将仅在满足这些条件时运行

w=matrix(1,5,5)

skipNA_avgFunc <- function(x) {

  # general definition of center cell for weight matrices with odd dims
  center <- x[ceiling(length(x)/2)]

  if (is.na(center)) { # handle NA values
    return(center)
  }

  else if (center >= 0) { # calculate mean
    mean(x, na.rm=TRUE)
  }
}
r3 <- focal(r, w=w, fun=skipNA_avgFunc, pad=TRUE, padValue=NA)
w=矩阵(1,5,5)
skipNA_avgFunc