raster::focal搭配对角权重矩阵计算最小值结果异常问题
raster::focal对角矩阵权重计算最小值异常问题解决
问题原因
raster::focal对权重矩阵的默认处理逻辑为:权重矩阵中数值为0的位置对应的邻域像元,会被先乘以权重值(即变为0),再传入指定的统计函数。
你使用的5×5对角矩阵仅对角线位置权重为1,其余20个位置权重均为0,因此每次计算窗口最小值时,都会包含这20个0值,最终得到全0结果。而计算最大值时,栅格原始值均大于0,0值不会干扰最大值筛选,因此结果符合预期;列矩阵权重全为1,无0值参与计算,最小值结果也正常。
解决方法
若要实现仅统计邻域对角线位置像元的最小值,可使用以下两种方案:
- 将权重矩阵中不需要参与计算的位置设为
NA,focal会自动忽略NA对应的像元:
# 构造对角权重矩阵,非对角位置替换为NA w <- diag(1, nrow =5, ncol = 5) w[w == 0] <- NA r_min_d <- focal(r, w, fun = min, na.rm = TRUE)
- 自定义统计函数,直接筛选窗口内对角线元素计算最小值:
r_min_d <- focal(r, w = matrix(1, 5, 5), fun = function(x){ # 提取5×5展平后向量的对角线位置元素(索引为1、7、13、19、25) diag_vals <- x[c(1, 7, 13, 19, 25)] return(min(diag_vals, na.rm = TRUE)) })
内容的提问来源于stack exchange,提问作者rm167
相关产品推荐
相关产品推荐

