求2D版approxfun()

ycggw6v2  于 2023-07-31  发布在  其他
关注(0)|答案(4)|浏览(77)

我在R中寻找stats::approxfun()的2D版本,它可以从(x,y,z)数据集生成插值 * 函数 * f(x,y)。我没有找到一个包akima或其他地方。

pgvzfuti

pgvzfuti1#

我会尝试从R包fields中重新调整interp.surface函数。一个从?interp.surface重新适配的例子:
加载包

library(fields)
#> Warning: package 'fields' was built under R version 4.1.2
#> Loading required package: spam
#> Warning: package 'spam' was built under R version 4.1.2
#> Loading required package: dotCall64
#> Warning: package 'dotCall64' was built under R version 4.1.2
#> Loading required package: grid
#> Spam version 2.7-0 (2021-06-25) is loaded.
#> Type 'help( Spam)' or 'demo( spam)' for a short introduction 
#> and overview of this package.
#> Help for individual functions is also obtained by adding the
#> suffix '.spam' to the function name, e.g. 'help( chol.spam)'.
#> 
#> Attaching package: 'spam'
#> The following objects are masked from 'package:base':
#> 
#>     backsolve, forwardsolve
#> Loading required package: viridis
#> Loading required package: viridisLite
#> 
#> Try help(fields) to get started.

字符串
加载数据

data(lennon)
obj <- list(x = 1:20, y = 1:20, z = lennon[201:220, 201:220])


定义近似函数

approxfun_2d <- function(x, y) {
  interp.surface(obj, cbind(x, y))
}


测试一下

set.seed(1)
approxfun_2d(x = runif(1, min = 1, max = 20), y = runif(1, min = 1, max = 20))
#> [1] 33.34148


绘制原始数据

image.plot(obj)


x1c 0d1x的数据
计算插值

x_interp <- runif(2e2, 1, 20)
y_interp <- runif(2e2, 1, 20)
z_interp <- approxfun_2d(x_interp, y_interp)


图逼近

quilt.plot(x_interp, y_interp, z_interp)

创建于2021-11-23由reprex package(v2.0.1)
这并不是100%等于approxfun的2D版本,但对于大多数用途来说可能已经足够好了。

kkbh8khc

kkbh8khc2#

更新

如果你想返回一个函数,你可以定义

library(pracma)
x <- linspace(-1, 1, 11)
y <- linspace(-1, 1, 11)
mgrid <- meshgrid(x, y)
Z <- mgrid$X^2 + mgrid$Y^2
xp <- yp <- linspace(-1, 1, 101)

approxfun2 <- function(x, y, Z, method = "linear") {
  function(xp, yp) interp2(x, y, Z, xp, yp, method)
}

f <- approxfun2(x, y, Z)

字符串
你会看到

> is.function(f)
[1] TRUE

> f(xp, yp)
  [1] 2.000 1.928 1.856 1.784 1.712 1.640 1.568 1.496 1.424 1.352 1.280 1.224
 [13] 1.168 1.112 1.056 1.000 0.944 0.888 0.832 0.776 0.720 0.680 0.640 0.600
 [25] 0.560 0.520 0.480 0.440 0.400 0.360 0.320 0.296 0.272 0.248 0.224 0.200
 [37] 0.176 0.152 0.128 0.104 0.080 0.072 0.064 0.056 0.048 0.040 0.032 0.024
 [49] 0.016 0.008 0.000 0.008 0.016 0.024 0.032 0.040 0.048 0.056 0.064 0.072
 [61] 0.080 0.104 0.128 0.152 0.176 0.200 0.224 0.248 0.272 0.296 0.320 0.360
 [73] 0.400 0.440 0.480 0.520 0.560 0.600 0.640 0.680 0.720 0.776 0.832 0.888
 [85] 0.944 1.000 1.056 1.112 1.168 1.224 1.280 1.352 1.424 1.496 1.568 1.640
 [97] 1.712 1.784 1.856 1.928 2.000

上一次回答

你可以尝试pracma包中的interp2,它几乎是MATLAB函数interp2的镜像,可以帮助你进行二维插值(主要的区别在于方法选项,因为MATLAB版本包含“线性”,“最近”,“立方”,“makima”或“样条线”)。

  • 产品描述:二维数据插值类似于查表。
  • 用法:interp2(x, y, Z, xp, yp, method = c("linear", "nearest", "constant"))参数xy向量,元素单调递增,表示Z中数据值的x-y-坐标。
  • Z:数值length(y) × length(x)矩阵。
  • xpypx-,y-计算插值的点的坐标。
  • method:插值法,“线性”最有用。

我认为默认的“线性”方法是用于所需的“2-D approxfun”的方法。
下面是来自pracma::interp2的官方示例

library(pracma)
x <- linspace(-1, 1, 11)
y <- linspace(-1, 1, 11)
mgrid <- meshgrid(x, y)
Z <- mgrid$X^2 + mgrid$Y^2
xp <- yp <- linspace(-1, 1, 101)

method <- "linear"
zp <- interp2(x, y, Z, xp, yp, method)
plot(xp, zp, type = "l", col = "blue")

method <- "nearest"
zp <- interp2(x, y, Z, xp, yp, method)
lines(xp, zp, col = "red")
grid()

ryoqjall

ryoqjall3#

(到目前为止)没有一个答案是理想的,我的也不是。然而,这最接近我个人所寻找的。希望这对行动有帮助。

library(interp)
approxfun2 <- function(x1, x2, y) {
    function(xo1, xo2) {
        interp(x = x1, y = x2, z = y, xo = xo1, yo = xo2, output = "points")$z
    }
}

x1 <- c(rep(0, 10), rep(1, 10))
x2 <- rep(seq(10), 2)
y <- c(1 + 2 * seq(10), -0.1 * seq(10) ^ 2)
f <- approxfun2(x1, x2, y)
f(x1, x2) # returns y
f(c(rep(0, 19), rep(1, 19)), rep(seq(1, 10, 0.5), 2)) # returns y with intermediate values

字符串

eanckbw9

eanckbw94#

一个简单且非常快速的例程是来自CRAN上提供的cooltools包的approxfun2。它生成一个类似于approxfun的向量化函数,比大多数其他2D插值器快得多。

library(cooltools)
x = seq(3)
y = seq(4)
z = array(c(x+1,x+2,x+3,x+4),c(3,4))
f = approxfun2(x,y,z)
print(f(1.7,2.4))

字符串

相关问题