2

我正在尝试使用 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 返回插值矩阵?

4

1 回答 1

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

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

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

如果您真的需要这种方式,您可能必须在所有人前面添加 at(ranspose) 。

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

于 2013-04-09T10:19:32.460 回答