2016-11-12 21 views
-1

我试图在R中线性内插。 MATLAB中的伪代码为u = interp1(u, linspace(1, numel(u), numel(u)-1));,如果点在域外(默认值,更多here),外插返回NaN。如何像MATLAB一样使用R interp1?

  • approx rule=1相当于MATLAB伪

我不知道关于第二interp1参数究竟是不是在MATLAB需要,所以我只是让unsuccessufully y <- x这样

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

最少的代码例子(真实的有> 500k点,所以线性工作),其输出在顶部

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
OS:Debian的8.5

+0

你试过'?约'? – baptiste

+0

@baptiste是的,我先试了一下,但后来又回到'interp1',因为它听起来最接近MATLAB伪代码。 –

+0

MATLAB如何外推? ''approx'中'rule'的解释说明,如果你设置'rule = 2',你可以得到最接近数据极值的值,但是如果你想做一些更像更接近于两点的线性外推的事情,你可能会必须做更多的工作... –

回答

1

如果你愿意得到的外推NA值,as is the default for linear interpolation/extrapolation in interp1 ,然后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 

这似乎是错的,但正确的答案,你居然提出的问题。对于xy,您都使用files[[1]],所以approx()应该在输入范围为1到3时返回y = x,否则返回NA。在这种情况下是xi[0 1],所以第一个元素是从所提供的x/y的数据的范围的...

PS我可以欣赏想要使用pracma为相似MATLAB的语法,但 - 虽然pracma是高 - 质量和广泛使用 - 基地的R功能更广泛地使用/彻底测试...

+0

非常感谢你的解释! - 我现在通过更精确地研究输出来获得语法。它实际上返回一个2的列表。它与MATLAB完全不同。 –