我有一个不规则的网格,我需要转换为常规网格,以利用图形设备的image
useRaster=TRUE
选项。我可以通过将不规则网格转换为点来小规模地执行此操作,然后使用akima' s interp
对点进行插值。然而,这种尺寸可能会更大,所以我正在寻找选择。
首先,这里是小规模(5x10)的例子,其中只有x维是不规则的:
nx <- 5
ny <- 10
si <- list() # irregular surface
si$x <- cumsum(runif(nx) * 10) + 100
si$y <- seq(20, 50, length.out=ny)
si$z <- matrix(rnorm(nx * ny), ncol=ny)
image(si)
双线性插值结果:
sr_x <- seq(min(si$x), max(si$x), length.out=nx * 5)
sr_y <- si$y # this dimension is already regular
require(akima) # interpolate from points repeated off irregular grid
sr <- interp(rep(si$x, length(si$y)), rep(si$y, each=length(si$x)), si$z,
xo=sr_x, yo=sr_y)
image(sr, useRaster=TRUE)
但是,如果使用更大尺寸的不规则网格(例如nx <- 50; ny <- 100
),则该过程非常慢。是否有可以加快这一过程的库或技术?
更新,可能还有解决方案。数据描述时间与时间(以年为单位),其中不规则维度的时间间隔为0.5天至30天,第二个时间轴为等间距365天的间距。由于沿不规则轴的间距要小得多,因此插值不起作用。因此,平滑或聚合方法将产生更好的结果。
更现实的数据场景,显示更精细的不规则维度:
nx <- 200
ny <- 10
si <- list() # irregular surface
si$x <- cumsum(runif(nx, 0.5, 30) / 365)
si$y <- 1:ny
si$z <- matrix(rnorm(nx * ny), ncol=ny)
image(si)
一些真正的粗骨料意味着:
dx <- 1/12 # 1 month spacing along x-axis
sr <- list() # regular surface
sr$x <- seq(min(si$x), max(si$y), dx) # equal-width breaks
nsrx <- length(sr$x)
sr$y <- si$y # this dimension is already regular
sr$z <- matrix(nrow=length(sr$x), ncol=length(sr$y))
# Classify irregular dimension
si_xc <- cut(si$x, sr$x, include.lowest=TRUE, labels=FALSE)
# Aggregate means from irregular to regular dimension
for(xi in seq_len(nsrx))
sr$z[xi,] <- apply(si$z[si_xc == xi, , drop=FALSE], 2, mean)
image(sr, zlim=range(si$z), useRaster=TRUE)
这似乎可以解决这个问题,并且可以在每个维度上使用100年的大型数据集进行扩展。所以我想我的新问题只是整理上面的代码来执行聚合方法。
答案 0 :(得分:2)
有几个带有“kriging”工具的软件包,基本上就是你想要的。但是,我不知道它是否比akima::interp
更快。
我使用多核技术解决了这个问题,所以如果你有多核处理器,请考虑类似下面的代码片段:
picbits <- clusterApply( myclus, 1:length(picsec) , function(j) { gc();
akima::interp(newx[picsec[[j]] ], newy[picsec[[j]] ], picture[picsec[[j]] ],
xo=trunc(min(newx[picsec[[j]] ])):trunc(max(newx[picsec[[j]] ])),
yo=trunc(min(newy[picsec[[j]] ])):trunc(max(newy[picsec[[j]] ])) )} )
这是从我为在图像上执行旋转“漩涡”而编写的函数中提取的,所以在那里有很多你不需要的东西。