2016-11-12 27 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完全不同。 –