如何像MATLAB一样使用R interp1?

时间:2016-11-12 22:24:12

标签: r interpolation

我试图在R中线性插值 MATLAB中的伪代码为u = interp1(u, linspace(1, numel(u), numel(u)-1));,如果该点位于域外,则外推返回NaN(默认值为here)。

  • approx rule=1相当于MATLAB伪代码

我不确定第二个interp1参数在MATLAB中不需要什么,所以我只是让{not} y <- x不成功

interp1(x, y, xi, method = "linear")

最小代码示例(真实的一个具有> 500 k点,因此线性将起作用)并且其输出位于顶部

List of 2
 $ : num [1:3] 1 2 3
 $ : num [1:2] 1 2
 num [1:2] 0 1
Error in interp1(x, y, xi, method = "linear") : 
  Points 'xi' outside of range of argument 'x'.
Execution halted

library("pracma") # http://finzi.psych.upenn.edu/library/pracma/html/interp1.html

files <- vector("list", 2)
files[[1]] <- c(1,2,3)
files[[2]] <- c(1,2)
str(files)

# Wanted, MATLAB:  u = interp1(u, linspace(1, numel(u), numel(u)-1));

xi <- seq(0,1, len = length(files[[1]]) - 1)
x <- files[[1]]
y <- files[[1]]
str(xi)

files[[1]] <- interp1(x, y, xi, method = "linear")

str(files)

我知道线程using interp1 in R for matrix,但我没有矩阵。

输入:c(1,2,3)
预期输出:[1:2]数据结构

R:3.3.1
操作系统:Debian 8.5

1 个答案:

答案 0 :(得分:1)

如果您愿意通过as is the default for linear interpolation/extrapolation in interp1得出NA值,那么approx()可以正常工作:

files <- list(1:3,1:2)
xi <- seq(0,1, len = length(files[[1]]) - 1)
x <- files[[1]]
y <- files[[1]]
a <- approx(x,y,xi)

你说你只想要一个双元素向量,所以大概你只想要输出y值:

a$y
## [1] NA  1

这可能看似错误,但对您实际提出的问题是正确答案。您已为files[[1]]x使用y,因此当输入范围为1到3时,approx()应返回y = x,{{1} }} 除此以外。在这种情况下,NAxi,因此第一个元素超出了提供的x / y数据的范围......

PS我可以欣赏想要使用[0 1]来与MATLAB的语法相似,但是 - 虽然pracma是高质量和广泛使用的 - 基本R函数甚至被更广泛地使用/彻底测试..