2012-02-10 110 views
1

我有一些多維數據結構,我需要做一些插值。我真的很難找到如何在R中做到這一點的例子!R中的2d雙線性插值

舉個例子,如果我有數組,old

old <- array(runif(10*12), dim=c(12,10)) 

str(old) 
num [1:12, 1:10] 0.763 0.429 0.792 0.923 0.476 ... 

什麼,我想要做的是使數組new

new <- interp2d(old, newx=6, newy=5) 

即我想改變的尺寸數組,以便新數據是old數據的6 * 5數組 - 在此示例中,保留old網格中的總數非常重要。上面的行是我想要做的一個例子,我不知道該怎麼做,並希望有人會?!謝謝!

+0

甲'?? interpolate'示出(爲我)'統計:: approx'(在基R),'spatstat :: interp.im'和'fBasics :: linearInterp'和'e1071 ::插值'。也許其中一個可以工作? (我會對不需要額外軟件包的base-R解決方案感興趣,但'stats :: approx'看起來有點笨拙,因爲它返回一個列表)。 – 2012-02-10 01:23:22

+1

這是非常相似的http://stackoverflow.com/questions/9171904/r-apply-fun-to-kxk-subsections-of-array – 2012-02-10 02:10:31

回答

2

這裏是一個開始,而不是我敢肯定,這是你想要(保留總計)是什麼。事實上,我不確定如果你以這種方式粗化,你會如何確切地保留總數......除非你寧願「裝箱」而不是「插入」?

library(sos) 
findFn("{bilinear interpolation}") 

set.seed(101) 
old <- array(runif(10*12), dim=c(12,10)) 

library(fields) 

interp2d <- function(old, newx, newy) { 
    interp.surface.grid(list(x=seq(nrow(old)),y=seq(ncol(old)),z=old), 
         list(x=seq(1,nrow(old),length=newx), 
          y=seq(1,ncol(old),length=newy)))$z 
} 

newmat <- interp2d(old, newx=6, newy=5) 
+0

感謝本!這似乎正在做我所需要的。它是一種恥辱,它需要基本包以外的東西(即字段),但它起作用,所以我很高興! – 2012-02-10 11:56:25