我试图使用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返回插值的矩阵?
答案 0 :(得分:1)
你的方法没有错;我可能会避免使用中间t <-
如果您想感受R-ish,请尝试
apply(Temp,1,function(t) interp1(depthTemp,t,layerZ))
如果您真的需要,可能必须在所有人面前添加一个t(ranspose)。
由于这是一个3d场,因此每行插值可能不是最佳的。我最喜欢的是interp.loess
包tgp
,但对于常规间距,其他选项可能是可用的。该方法不适用于你的迷你示例(这个问题很好),但需要更大的网格。