2013-04-15 35 views
6

讓我們假設我有一個3×5矩陣中R:插值數據

4 5 5 6 8 
3 4 4 5 6 
2 3 3 3 4 

我想在這些值之間進行內插在由25來創建尺寸15的矩陣I還要指定插值是線性的,高斯等。我該怎麼做?

舉例來說,如果我有這樣的

2 3 
1 3 

小矩陣,我希望它由3變成3,那麼它可能看起來像

2 2.5 3 
    1.5 2.2 3 
    1 2  3 
+1

目前尚不清楚你想要什麼。請提供樣本輸出。 –

+0

這篇文章可能有些幫助嗎? http://stackoverflow.com/questions/3093455/3d-geometry-how-to-interpolate-a-matrix – Arun

+0

@Arun似乎很有用,雖然R中必須有一個內置函數來做到這一點... – CodeGuy

回答

6
app <- function(x, n) approx(x, n=n)$y # Or whatever interpolation that you want 

apply(t(apply(x, 1, function(x) app(x, nc))), 2, function(x) app(x, nr)) 
    [,1] [,2] [,3] 
[1,] 2.0 2.50 3 
[2,] 1.5 2.25 3 
[3,] 1.0 2.00 3 
+0

要跟進在我的回答中,我的意見是:如果我正確地讀取了這段代碼,將'nc'和'nr'設置爲輸出矩陣所需的列/行數將允許任意的非對稱擴展。 –

0

很久以前我寫了一個類似的玩具,除了我從未想過定義插值函數。還有raster::disaggregate

zexpand<-function(inarray, fact=2, interp=FALSE, ...) { 
# do same analysis of fact to allow one or two values, fact >=1 required, etc. 
fact<-as.integer(round(fact)) 
switch(as.character(length(fact)), 
      '1' = xfact<-yfact<-fact, 
      '2'= {xfact<-fact[1]; yfact<-fact[2]}, 
      {xfact<-fact[1]; yfact<-fact[2];warning(' fact is too long. First two values used.')}) 
if (xfact < 1) { stop('fact[1] must be > 0') } 
if (yfact < 1) { stop('fact[2] must be > 0') } 
bigtmp <- matrix(rep(t(inarray), each=xfact), nrow(inarray), ncol(inarray)*xfact, byr=T) #does column expansion 
bigx <- t(matrix(rep((bigtmp),each=yfact),ncol(bigtmp),nrow(bigtmp)*yfact,byr=T)) 
# the interpolation would go here. Or use interp.loess on output (won't 
# handle complex data). Also, look at fields::Tps which probably does 
# a much better job anyway. Just do separately on Re and Im data 
return(invisible(bigx)) 
} 
+0

感謝您的回覆。這與Math Lundberg的回答有什麼不同或更好? – CodeGuy

+0

@CodeGuy如果我真的在那裏插入一個插值函數(基本上替換隻複製行或列的'rep'函數),它將做幾乎完全相同的事情,除了允許在列中進行不同的擴展行維度。正如馬修寫的,你可以在代碼中交換你想要的任何插補器。 –

+0

我明白了。感謝您的迴應。 – CodeGuy