使用 interp2 {pracma} 进行双线性插值时出错;二维插值有什么更好的方法吗?
Error when doing bilinear interpolation with `interp2 {pracma}`; any better way for 2D interpolation?
我正在尝试对名为 vol_coarse
的 table 执行二维插值。
install.packages("install.load")
install.load::load_package("pracma", "data.table")
vol_coarse <- data.table(V1 = c(3 / 8, 1 / 2, 3 / 4, 1, 1 + 1 / 2, 2, 3, 6),
V2 = c(0.50, 0.59, 0.66, 0.71, 0.75, 0.78, 0.82, 0.87),
V3 = c(0.48, 0.57, 0.64, 0.69, 0.73, 0.76, 0.80, 0.85),
V4 = c(0.44, 0.53, 0.60, 0.65, 0.69, 0.72, 0.76, 0.81))
setnames(vol_coarse, c("Maximum size of aggregate (in)", "2.40", "2.60", "2.80"))
x <- vol_coarse[, 2][[1]]
y <- as.numeric(colnames(vol_coarse[, 2:ncol(vol_coarse)]))
z <- meshgrid(x, y)
xp <- 3 / 4
yp <- 2.70
interp2(x = x, y = y, Z = z, xp = xp, yp = yp, method = "linear")
这是返回的错误信息:
Error: is.numeric(Z) is not TRUE
我在 ?interp2
中读到:
length(x) = nrow(Z) = 8 and length(y) = ncol(Z) = 3 must be satisfied.
如何创建一个 8 x 3 的矩阵以便我可以使用 interp2
?
或者是否有更好的方法来执行这种类型的插值?
谢谢。
如果我没有误会你的意思,你想要:
x <- c(3 / 8, 1 / 2, 3 / 4, 1, 1 + 1 / 2, 2, 3, 6) ## V1
y <- c(2.4, 2.6, 2.8) ## column names
Z <- cbind(c(0.50, 0.59, 0.66, 0.71, 0.75, 0.78, 0.82, 0.87), ## V2
c(0.48, 0.57, 0.64, 0.69, 0.73, 0.76, 0.80, 0.85), ## V3
c(0.44, 0.53, 0.60, 0.65, 0.69, 0.72, 0.76, 0.81)) ## V4
xp <- 3 / 4
yp <- 2.70
您已经在网格上有一个定义明确的矩阵。例如,您可以通过以下方式调查您的 3D 数据:
persp(x, y, Z)
image(x, y, Z)
contour(x, y, Z)
不推荐pracma
,因为interp2
函数有bug。我建议使用 fields
包中的 interp.surface
函数在网格上进行插值。
library(fields)
## the list MUST has name `x`, `y`, `x`!
## i.e., unnamed list `list(x, y, Z)` does not work!
interp.surface(list(x = x, y = y, z = Z), cbind(xp, yp))
# [1] 0.62
interp2
来自 pracma
不一致。手册上说 Z
矩阵是 length(x)
by length(y)
,但函数实际上检查 Z
必须是 length(y)
by length(x)
.
## from manual
Z: numeric ‘length(x)’-by-‘length(y)’ matrix.
## from source code of `interp2`
lx <- length(x)
ly <- length(y)
if (ncol(Z) != lx || nrow(Z) != ly)
stop("Required: 'length(x) = ncol(Z)' and 'length(y) = nrow(Z)'.")
因此,为了使 interp2
有效,您必须传入 Z
的转置:
interp2(x, y, t(Z), xp, yp)
# [1] 0.62
或反转 x
和 y
(还有 xp
、yp
!!):
interp2(y, x, Z, yp, xp)
# [1] 0.62
这确实与我们使用 image
、contour
和 persp
的方式不一致。
我正在尝试对名为 vol_coarse
的 table 执行二维插值。
install.packages("install.load")
install.load::load_package("pracma", "data.table")
vol_coarse <- data.table(V1 = c(3 / 8, 1 / 2, 3 / 4, 1, 1 + 1 / 2, 2, 3, 6),
V2 = c(0.50, 0.59, 0.66, 0.71, 0.75, 0.78, 0.82, 0.87),
V3 = c(0.48, 0.57, 0.64, 0.69, 0.73, 0.76, 0.80, 0.85),
V4 = c(0.44, 0.53, 0.60, 0.65, 0.69, 0.72, 0.76, 0.81))
setnames(vol_coarse, c("Maximum size of aggregate (in)", "2.40", "2.60", "2.80"))
x <- vol_coarse[, 2][[1]]
y <- as.numeric(colnames(vol_coarse[, 2:ncol(vol_coarse)]))
z <- meshgrid(x, y)
xp <- 3 / 4
yp <- 2.70
interp2(x = x, y = y, Z = z, xp = xp, yp = yp, method = "linear")
这是返回的错误信息:
Error: is.numeric(Z) is not TRUE
我在 ?interp2
中读到:
length(x) = nrow(Z) = 8 and length(y) = ncol(Z) = 3 must be satisfied.
如何创建一个 8 x 3 的矩阵以便我可以使用 interp2
?
或者是否有更好的方法来执行这种类型的插值?
谢谢。
如果我没有误会你的意思,你想要:
x <- c(3 / 8, 1 / 2, 3 / 4, 1, 1 + 1 / 2, 2, 3, 6) ## V1
y <- c(2.4, 2.6, 2.8) ## column names
Z <- cbind(c(0.50, 0.59, 0.66, 0.71, 0.75, 0.78, 0.82, 0.87), ## V2
c(0.48, 0.57, 0.64, 0.69, 0.73, 0.76, 0.80, 0.85), ## V3
c(0.44, 0.53, 0.60, 0.65, 0.69, 0.72, 0.76, 0.81)) ## V4
xp <- 3 / 4
yp <- 2.70
您已经在网格上有一个定义明确的矩阵。例如,您可以通过以下方式调查您的 3D 数据:
persp(x, y, Z)
image(x, y, Z)
contour(x, y, Z)
不推荐pracma
,因为interp2
函数有bug。我建议使用 fields
包中的 interp.surface
函数在网格上进行插值。
library(fields)
## the list MUST has name `x`, `y`, `x`!
## i.e., unnamed list `list(x, y, Z)` does not work!
interp.surface(list(x = x, y = y, z = Z), cbind(xp, yp))
# [1] 0.62
interp2
来自 pracma
不一致。手册上说 Z
矩阵是 length(x)
by length(y)
,但函数实际上检查 Z
必须是 length(y)
by length(x)
.
## from manual
Z: numeric ‘length(x)’-by-‘length(y)’ matrix.
## from source code of `interp2`
lx <- length(x)
ly <- length(y)
if (ncol(Z) != lx || nrow(Z) != ly)
stop("Required: 'length(x) = ncol(Z)' and 'length(y) = nrow(Z)'.")
因此,为了使 interp2
有效,您必须传入 Z
的转置:
interp2(x, y, t(Z), xp, yp)
# [1] 0.62
或反转 x
和 y
(还有 xp
、yp
!!):
interp2(y, x, Z, yp, xp)
# [1] 0.62
这确实与我们使用 image
、contour
和 persp
的方式不一致。