在R中使用interp1表示矩阵

时间:2013-04-09 07:53:02

标签: r interpolation

我试图使用R中的interp1函数来线性插值矩阵而不使用for循环。到目前为止,我已经尝试过:

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)

所以,这里我在for循环中的矩阵的每一行上都使用了interp1。我想知道如何在不使用for循环的情况下做到这一点。我可以通过如下转置矩阵在matlab中做到这一点:

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

但是当我尝试在R

中这样做时
layerT <- interp1(depthTemp,t(Temp),layerZ)

它不返回插值结果矩阵,而是返回数值数组。如何确保R返回插值的矩阵?

1 个答案:

答案 0 :(得分:1)

  • 你的方法没有错;我可能会避免使用中间t <-

  • 如果您想感受R-ish,请尝试

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

如果您真的需要,可能必须在所有人面前添加一个t(ranspose)。

由于这是一个3d场,因此每行插值可能不是最佳的。我最喜欢的是interp.loesstgp,但对于常规间距,其他选项可能是可用的。该方法不适用于你的迷你示例(这个问题很好),但需要更大的网格。