2013-04-09 78 views
2

我想在R中使用interp1函數來線性插入矩陣而不使用for循環。到目前爲止,我曾嘗試:在R中使用interp1作爲矩陣

bthD <- c(0,2,3,4,5) # original depth vector 
bthA <- c(4000,3500,3200,3000,2800) # original array of area 

Temp <- c(4.5,4.2,4.2,4,5,5,4.5,4.2,4.2,4) 
Temp <- matrix(Temp,2) # matrix for temperature measurements 

# -- interpolating bathymetry data -- 
depthTemp <- c(0.5,1,2,3,4) 
layerZ <- seq(depthTemp[1],depthTemp[5],0.1) 

library(signal) 
layerA <- interp1(bthD,bthA,layerZ); 

# -- interpolate= matrix -- 
layerT <- list() 
for (i in 1:2){ 
    t <- Temp[i,] 
    layerT[[i]] <- interp1(depthTemp,t,layerZ) 
} 
layerT <- do.call(rbind,layerT) 

所以,在這裏我已經在使用interp1在矩陣中的每一行for循環。我想知道如何在不使用for循環的情況下做到這一點。我可以在MATLAB通過轉置矩陣如下做到這一點:

layerT = interp1(depthTemp,Temp',layerZ)'; % matlab code 

但是當我試圖做到這一點R中

layerT <- interp1(depthTemp,t(Temp),layerZ) 

它不返回的插值結果矩陣,但數字排列。我如何確保R返回插值的矩陣?

回答

1
  • 你的方法沒有問題;我可能會避免中間t <-

  • 如果你想感受R-ISH,嘗試

apply(Temp,1,function(t) interp1(depthTemp,t,layerZ))

您可能必須在前面真的在(ranspose)添加的全部,如果你需要這種方式。

由於這是一個3d字段,因此每行插值可能不是最佳的。我最喜歡的是interp.loess,套件tgp,但對於常規間距,其他選項可能可用。該方法不適用於你的小例子(這對於問題來說很好),但需要一個更大的網格。