我是R和编程的初学者。所以我认为比问题很简单,但我找不到答案或解决它。
我有光栅(100*100 个单元格)。我需要在移动窗口通过 2D DFT 获取谐波幅度的中值(例如,窗口大小 = 21)。我在栅格包中找到了焦点函数。对于这个函数,我可以编写自己的函数,该函数获取值(窗口中的栅格值)并返回整个窗口的单个值。
r <- raster(matrix(rnorm(10000), nrow = 100, ncol = 100)) # creation of raster
win <- 21 # setting the window size
spectr <- function(d) {
return(median(abs(spec.fft(x = 1:win, y = 1:win, z = (d - mean(d)))$A)))
} # i think "d" - the matrix of raster values in the window border
focal(x = r, w = matrix(1, win, win), fun = spectr())
输出: spec.fft(x = 1:win, y = 1:win, z = (d - mean(d))) 中的误差: 缺少参数"d",没有默认值
我假设来自窗口的数据在函数中自动传输。我的代码中有什么错误?谢谢!
更新。为了测试需要加载库"光谱":
install.packages("spectral")
library(spectral)
首先,要使用您之前在 focal()
中定义的函数,您只需删除函数名称后面()
括号即可。
其次,你的函数使用 spectral::spec.fft
这要求z
参数是一个矩阵。但是,焦点转发了一个值向量,正如我们从?focal
中了解到的那样:
函数 fun 应该接受多个数字,并返回一个数字。
因此,您必须自己生成所需的矩阵。
请参阅此示例(但是,请检查输出的有效性):
spectr <- function(d) {
return(median(abs(spec.fft(x = 1:win, y = 1:win,
z = (matrix(d, ncol = win, nrow = win) - mean(d)))$A
# eventually you have to reorder or transpose the matrix
# if its order has some impact on spec.fft
)))
}
让我们在focal()
中使用该函数
focal(x = r, w = matrix(1, win, win), fun = spectr)
# class : RasterLayer
# dimensions : 100, 100, 10000 (nrow, ncol, ncell)
# resolution : 0.01, 0.01 (x, y)
# extent : 0, 1, 0, 1 (xmin, xmax, ymin, ymax)
# coord. ref. : NA
# data source : in memory
# names : layer
# values : 0.03341064, 0.04557778 (min, max)