2014-02-11 72 views
3

我有一個不規則網格,我需要轉換爲常規網格才能利用圖形設備的imageuseRaster=TRUE選項。我可以通過將不規則網格轉換爲點來實現小規模,然後使用akima的interp對點進行插值。然而,這更大的尺寸可怕地縮放,所以我正在尋找選擇。將不規則網格內插到普通網格

首先,這裏是小規模(5×10)例如,在僅在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) 

irregular

和雙線性內插的結果:

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) 

regular

但是,如果使用較大尺寸的不規則網格(例如, 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) 

irregular_2

而一些真正的粗骨料是指:

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) 

這似乎這樣的伎倆,並在每個維度上具有數百年的更大的數據集上進行縮放。所以我想我的新問題只是整理上面的代碼來執行聚合手段。

regular_2

+0

什麼是真正的數據源? netcdf中的東西?可能值得調查 – mdsumner

+0

@mdsumner時間與年齡的關係,兩個維度的單位均爲年。 z是年齡的概率。 –

回答

2

有幾個包瓦特/「克立格」工具,這基本上是你想要的。不過,我不知道它是否會比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]] ])))}) 

也就是說從函數提取我寫信給執行旋轉「漩渦」在一張圖片上,那裏有很多你不需要的東西。

相關問題