2014-02-11 1 views
3

그래픽 장치에 imageuseRaster=TRUE 옵션을 사용하려면 일반 그리드로 변환해야하는 불규칙한 그리드가 있습니다. 불규칙한 격자를 포인트로 변환 한 후 작은 크기로이 작업을 수행 한 다음 akima의 interp을 사용하여 포인트를 보간합니다. 그러나 이것은 더 큰 차원으로 끔찍하게 비례하므로 옵션을 찾고 있습니다.불규칙한 그리드를 일반 그리드에 보간

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) 

우선, 여기에 소규모 (5 ×)에만 X-치수 불규칙 예이며 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) 

이 트릭을 할 것, 그리고 각 차원에 따라 100 년이되는 훨씬 더 큰 데이터 세트를 기준으로 확장합니다. 그래서 나는 나의 새로운 질문이 단순히 집계 수단을 수행하기 위해 위의 코드를 정돈하는 것이라고 생각한다.

regular_2

+0

실제 데이터 소스 란 무엇입니까? netcdf에 뭔가가 있습니까? @mdsumner 시간과 나이를 – mdsumner

+0

조사하면 가치가 있습니다. 두 측정 기준 모두 년 단위입니다. z는 연령에 따른 확률입니다. –

답변

2

당신이 원하는 기본적으로/"크리깅"도구, w 여러 패키지가 있습니다. 그러나 나는 그것이 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]] ])))}) 

:

나는 당신이 멀티 코어 프로세서가있는 경우, 다음 코드 비슷한을 고려, 그래서이 멀티 코어 기술을 사용하여 해결 이미지에, 그래서 거기에 많은 벼락치기가 필요하지 않습니다.

관련 문제