我正在尝试akima ::: interp的简单应用,但我只能得到分段错误。我试图将一个球体的半球投影到一个磁盘上,然后使用' image'制作情节。当nx和ny等于50时,代码工作正常,但我需要nx和ny为> 200。
library(plot3D)
library(akima)
# Define surface data for sphere
n<-100
az.matrix<-matrix(0,nrow=n,ncol=n)
# Simple function for sphere surface
d.function <- seq(0,0,length=n)+dnorm(1:n,mean=n/4,sd=n/10)+dnorm(1:n,mean=3*n/4,sd=n/10)*-1
for (i in 1:n){
for (j in 1:n){
az.matrix[i,j] <- sin(seq(0,pi,length=n))[j]*(d.function/max(d.function)*log(2))[i]
}
}
az.matrix.image <- az.matrix[1:(n/2),1:(n/2)]
# Define hemisphere
M <- mesh(seq(0, 2*pi, length.out = n/2), seq(0, pi, length.out = n/2))
u <- M$x ; v <- M$y
x <- cos(u)*sin(v)
y <- sin(u)*sin(v)
z <- az.matrix.image
# Define output grid
nx<-50
ny<-50
x.out <- seq(min(x),max(x),length=nx)
y.out <- seq(min(x),max(x),length=ny)
Interp <- akima:::interp(x = x, y = y, z = z,
xo = x.out, yo = y.out,
duplicate="strip", extrap = FALSE)
new.z <- Interp[[3]]
image(x = x.out, y = y.out, new.z , useRaster = TRUE, asp = 1, axes = FALSE, xlab = "", ylab = "",
col =jet.col(100))
此代码产生this plot,但我需要绘图具有更高的分辨率。
当我尝试大nx和ny(例如200)时,此代码产生
*** caught segfault ***
address 0x10f53d000, cause 'memory not mapped'
Traceback:
1: .Fortran("idsfft", as.integer(1), as.integer(ncp), as.integer(n), as.double(x), as.double(y), as.double(z), as.integer(nx), as.integer(ny), x = as.double(xo), y = as.double(yo), z = zo, integer((31 + ncp) * n + nx * ny), double(5 * n), misso = as.logical(misso), PACKAGE = "akima")
2: interp.old(x, y, z, xo, yo, ncp = 0, extrap = FALSE, duplicate = duplicate, dupfun = dupfun)
3: akima:::interp(x = x, y = y, z = z, duplicate = "strip")
我的RStudio会话已中止。 sessionInfo()的输出是
Platform: x86_64-apple-darwin13.4.0 (64-bit)
Running under: macOS Sierra 10.12.3
locale:
[1] en_NZ.UTF-8/en_NZ.UTF-8/en_NZ.UTF-8/C/en_NZ.UTF-8/en_NZ.UTF-8
attached base packages:
[1] stats graphics grDevices utils datasets methods base
loaded via a namespace (and not attached):
[1] tools_3.3.2 sp_1.2-4 grid_3.3.2 akima_0.6-2 lattice_0.20-34
任何帮助将不胜感激!提前致谢。 这是几天前的一个问题的重复,我不小心发布在错误的论坛上,它在噪音中丢失了。 Interp function in akima causing segmentation fault
答案 0 :(得分:0)
我遇到了同样的问题,我在同一域中有两组(range(x)
,range(y)
),一组包含50k点,其他30k点,具有相同的输出矩阵({ {1}}和xo
)。 50k点设置很好,30k点设置使R崩溃。 (带有参数yo
)
我偶然发现了“解决方案”,方法是处理脚本中的功能linear=TRUE
和akima::interp
,然后使用“复制的”功能运行代码(无需更改代码中的任何内容)。我的意图是放置akima::interp.old
并找到错误的根源。但是,崩溃不再发生了……
sessionInfo():
browser()
答案 1 :(得分:0)
从 2020 年开始,新的 interp
包可以处理此问题而不会崩溃。