interp1一維數據插值在matlab中的用法


轉載:https://ww2.mathworks.cn/help/matlab/ref/interp1.html?s_tid=srchtitle#btwp6lt-2_1

interp1

一維數據插值(表查找)

全頁折疊
 

說明

示例

vq = interp1(x,v,xq) 使用線性插值返回一維函數在特定查詢點的插入值。向量 x 包含樣本點,v 包含對應值 v(x)。向量 xq 包含查詢點的坐標。

如果您有多個在同一點坐標采樣的數據集,則可以將 v 以數組的形式進行傳遞。數組 v 的每一列都包含一組不同的一維樣本值。

示例

vq = interp1(x,v,xq,method) 指定備選插值方法:'linear''nearest''next''previous''pchip''cubic''v5cubic''makima' 或 'spline'。默認方法為 'linear'

示例

vq = interp1(x,v,xq,method,extrapolation) 用於指定外插策略,來計算落在 x 域范圍外的點。如果希望使用 method 算法進行外插,可將 extrapolation 設置為 'extrap'。您也可以指定一個標量值,這種情況下,interp1 將為所有落在 x 域范圍外的點返回該標量值。

示例

vq = interp1(v,xq) 返回插入的值,並假定一個樣本點坐標默認集。默認點是從 1 到 n 的數字序列,其中 n 取決於 v 的形狀:

  • 當 v 是向量時,默認點是 1:length(v)

  • 當 v 是數組時,默認點是 1:size(v,1)

如果您不在意點之間的絕對距離,則可使用此語法。

vq = interp1(v,xq,method) 指定備選插值方法中的任意一種,並使用默認樣本點。

vq = interp1(v,xq,method,extrapolation) 指定外插策略,並使用默認樣本點。

pp = interp1(x,v,method,'pp') 使用 method 算法返回分段多項式形式的 v(x)。

 

注意

不建議使用該語法。請改用 griddedInterpolant

 

 

示例

全部折疊

基於粗略采樣的正弦函數進行插值

定義樣本點 x 及其對應樣本值 v

x = 0:pi/4:2*pi; 
v = sin(x);

將查詢點定義為 x 范圍內更精細的采樣點。

xq = 0:pi/16:2*pi;

在查詢點插入函數並繪制結果。

figure
vq1 = interp1(x,v,xq);
plot(x,v,'o',xq,vq1,':.');
xlim([0 2*pi]);
title('(Default) Linear Interpolation');

現在使用 'spline' 方法計算相同點處的 v

figure
vq2 = interp1(x,v,xq,'spline');
plot(x,v,'o',xq,vq2,':.');
xlim([0 2*pi]);
title('Spline Interpolation');

 
 

在不指定樣本點的情況下進行插值

定義一組函數值。

v = [0  1.41  2  1.41  0  -1.41  -2  -1.41 0];

定義一組介於默認點 1:9 之間的查詢點。在這種情況下,默認點為 1:9,因為 v 包含 9 個值。

xq = 1.5:8.5;

計算 xq 處的 v

vq = interp1(v,xq);

繪制結果。

figure
plot((1:9),v,'o',xq,vq,'*');
legend('v','vq');

 
 

復數值插值

定義一組樣本點。

x = 1:10;

定義函數 v(x)=5x+x2i 在樣本點處的值。

v = (5*x)+(x.^2*1i);

將查詢點定義為 x 范圍內更精細的采樣點。

xq = 1:0.25:10;

在查詢點處進行 v 插值。

vq = interp1(x,v,xq);

用紅色繪制結果的實部,用藍色繪制虛部。

figure
plot(x,real(v),'*r',xq,real(vq),'-r');
hold on
plot(x,imag(v),'*b',xq,imag(vq),'-b');

 
 

日期和時間的插值

對時間戳數據點進行插值。

以包含溫度讀數的數據集為例,這些讀數每四個小時測量一次。創建包含一天的數據的表,並繪制數據圖。

x = (datetime(2016,1,1):hours(4):datetime(2016,1,2))';
x.Format = 'MMM dd, HH:mm';
T = [31 25 24 41 43 33 31]';
WeatherData = table(x,T,'VariableNames',{'Time','Temperature'})
WeatherData=7×2 table
        Time         Temperature
    _____________    ___________

    Jan 01, 00:00        31     
    Jan 01, 04:00        25     
    Jan 01, 08:00        24     
    Jan 01, 12:00        41     
    Jan 01, 16:00        43     
    Jan 01, 20:00        33     
    Jan 02, 00:00        31     

plot(WeatherData.Time, WeatherData.Temperature, 'o')

插入數據集以預測一天中每一分鍾內的溫度讀數。由於數據是周期性的,因此請使用 'spline' 插值方法。

xq = (datetime(2016,1,1):minutes(1):datetime(2016,1,2))';
V = interp1(WeatherData.Time, WeatherData.Temperature, xq, 'spline');

繪制插入的點。

hold on
plot(xq,V,'r')

 
 

使用兩種不同方法進行外插

定義樣本點 x 及其對應樣本值 v

x = [1 2 3 4 5];
v = [12 16 31 10 6];

指定查詢點 xq,這些查詢點延伸到 x 的定義域以外。

xq = [0 0.5 1.5 5.5 6];

使用 'pchip' 方法計算 xq 處的 v

vq1 = interp1(x,v,xq,'pchip')
vq1 = 1×5

   19.3684   13.6316   13.2105    7.4800   12.5600

接着,使用 'linear' 方法計算 xq 處的 v

vq2 = interp1(x,v,xq,'linear')
vq2 = 1×5

   NaN   NaN    14   NaN   NaN

現在將 'linear' 方法與 'extrap' 選項結合使用。

vq3 = interp1(x,v,xq,'linear','extrap')
vq3 = 1×5

     8    10    14     4     2

'pchip' 默認外插,但 'linear' 不會。

 
 

為 x 域范圍外的所有查詢指定常量值

定義樣本點 x 及其對應樣本值 v

x = [-3 -2 -1 0 1 2 3];
v = 3*x.^2;

指定查詢點 xq,這些查詢點延伸到 x 的定義域以外。

xq = [-4 -2.5 -0.5 0.5 2.5 4];

現在使用 'pchip' 方法計算 xq 處的 v,並為 x 域范圍外的所有查詢點賦予值 27

vq = interp1(x,v,xq,'pchip',27)
vq = 1×6

   27.0000   18.6562    0.9375    0.9375   18.6562   27.0000

 
 

在一個傳遞點插入多組數據

定義樣本點。

x = (-5:5)';

在 x 所定義的點處對三個不同的拋物線函數采樣。

v1 = x.^2;
v2 = 2*x.^2 + 2;
v3 = 3*x.^2 + 4;

創建矩陣 v,其列為向量 v1v2 和 v3

v = [v1 v2 v3];

將一組查詢點 xq 定義為 x 范圍內更精細的采樣點。

xq = -5:0.1:5;

計算 xq 處的全部三個函數,並繪制結果。

vq = interp1(x,v,xq,'pchip');
figure
plot(x,v,'o',xq,vq);

h = gca;
h.XTick = -5:5;

繪圖中的圓圈表示 v,實線表示 vq

 
 

輸入參數

全部折疊

x - 樣本點
向量

樣本點,指定為一行或一列實數向量。x 中的值必須各不相同。x 的長度必須符合以下要求之一:

  • 如果 v 為向量,則 length(x) 必須等於 length(v)

  • 如果 v 為數組,則 length(x) 必須等於 size(v,1)

 

示例: [1 2 3 4 5 6 7 8 9 10]

示例: 1:10

示例: [3 7 11 15 19 23 27 31]'

數據類型: single | double | duration | datetime

v - 樣本值
向量 | 矩陣 | 數組

樣本值,指定為實數/復數向量、矩陣或數組。如果 v 是矩陣或數組,則每列包含單獨的一組一維值。

如果 v 包含復數,則 interp1 將分別插入實部和虛部。

示例: rand(1,10)

示例: rand(10,1)

示例: rand(10,3)

數據類型: single | double | duration | datetime
復數支持: 是

xq - 查詢點
標量 | 向量 | 矩陣 | 數組

查詢點,指定為實數標量、向量、矩陣或數組。

示例: 5

示例: 1:0.05:10

示例: (1:0.05:10)'

示例: [0 1 2 7.5 10]

數據類型: single | double | duration | datetime

method - 插值方法
'linear' (默認) | 'nearest' | 'next' | 'previous' | 'pchip' | 'cubic' | 'v5cubic' | 'makima' | 'spline'

插值方法,指定為下表中的選項之一。

方法

說明

連續性

注釋

'linear'

線性插值。在查詢點插入的值基於各維中鄰點網格點處數值的線性插值。這是默認插值方法。

C0

 

  • 需要至少 2 個點。

  • 比最近鄰點插值需要更多內存和計算時間。

 

'nearest'

最近鄰點插值。在查詢點插入的值是距樣本網格點最近的值。

不連續

 

  • 需要至少 2 個點。

  • 最低內存要求

  • 最快計算時間

 

'next'

下一個鄰點插值。在查詢點插入的值是下一個抽樣網格點的值。

不連續

 

  • 需要至少 2 個點。

  • 內存要求和計算時間與 'nearest' 相同

 

'previous'

上一個鄰點插值。在查詢點插入的值是上一個抽樣網格點的值。

不連續

 

  • 需要至少 2 個點。

  • 內存要求和計算時間與 'nearest' 相同

 

'pchip'

保形分段三次插值。在查詢點插入的值基於鄰點網格點處數值的保形分段三次插值。

C1

 

  • 需要至少 4 個點。

  • 比 'linear' 需要更多內存和計算時間

 

'cubic'

注意

interp1(...,'cubic') 的行為在以后的版本中會有所變化。在以后的版本中,此方法將執行三次卷積。

 

與 'pchip' 相同。

C1

此方法目前返回與 'pchip' 相同的結果。

'v5cubic'

用於 MATLAB® 5 的三次卷積。

C1

點之間的間距必須均勻。'cubic' 將在以后的版本中替代 'v5cubic'

'makima'

修正 Akima 三次 Hermite 插值。在查詢點插入的值基於次數最大為 3 的多項式的分段函數。為防過沖,已修正 Akima 公式。

C1

 

  • 需要至少 2 個點。

  • 產生的波動比 'spline' 小,但不像 'pchip' 那樣急劇變平

  • 計算成本高於 'pchip',但通常低於 'spline'

  • 內存要求與 'spline' 類似

 

'spline'

使用非結終止條件的樣條插值。在查詢點插入的值基於各維中鄰點網格點處數值的三次插值。

C2

 

  • 需要至少 4 個點。

  • 比 'pchip' 需要更多內存和計算時間

 

 

extrapolation - 外插策略
'extrap' | 標量值

外插策略,指定為 'extrap' 或實數標量值。

  • 如果希望 interp1 使用與內插所用相同的方法來計算落在域范圍外的點,則指定 'extrap'

  • 如果希望 interp1 為落在域范圍外的點返回一個特定常量值,則指定一個標量值。

 

默認行為取決於輸入參數:

  • 如果您指定 'pchip''spline' 或 'makima' 插值方法,則默認行為是 'extrap'

  • 任何其他方法都會為落在域范圍外的查詢點默認返回 NaN

示例: 'extrap'

示例: 5

數據類型: char | string | single | double

輸出參數

全部折疊

vq - 插入的值
標量 | 向量 | 矩陣 | 數組

插入的值,以標量、向量、矩陣或數組的形式返回。vq 的大小取決於 v 和 xq 的形狀。

v 的形狀 xq 的形狀 Vq 的大小 示例
向量 向量 size(xq) 如果 size(v) = [1 100]
且 size(xq) = [1 500]
則 size(vq) = [1 500]
向量 矩陣
或 N 維數組
size(xq) 如果 size(v) = [1 100]
且 size(xq) = [50 30]
則 size(vq) = [50 30]
矩陣
或 N 維數組
向量 [length(xq) size(v,2),...,size(v,n)] 如果 size(v) = [100 3]
且 size(xq) = [1 500]
則 size(vq) = [500 3]
矩陣
或 N 維數組
矩陣
或 N 維數組
[size(xq,1),...,size(xq,n),... size(v,2),...,size(v,m)] 如果 size(v) = [4 5 6]
且 size(xq) = [2 3 7]
則 size(vq) = [2 3 7 5 6]

 

pp - 分段多項式
結構體

分段多項式,以可傳遞到 ppval 函數進行計算的結構體的形式返回。

詳細信息

全部折疊

Akima 和樣條插值

[1] 和 [2] 中所述的一維插值 Akima 算法執行三次插值以生成具有連續一階導數 (C1) 的分段多項式。該算法保持斜率,避免平台區的波動。每當有三個或更多連續共線點時,就會出現平台區,算法將這些點用一條直線相連。為了確保兩個數據點之間的區域是平坦的,請在這兩個點之間插入一個額外的數據點。

當兩個具有不同斜率的平台區相遇時,對原始 Akima 算法所做的修改會對斜率更接近於零的一側賦予更多權重。此修改優先考慮更接近水平的一側,這樣更直觀並可避免過沖。(原始 Akima 算法對兩邊的點賦予相等的權重,從而均勻地划分波動。)

另一方面,樣條算法執行三次插值以產生具有連續二階導數 (C2) 的分段多項式。結果相當於常規多項式插值,但不太容易受到高次數據點之間劇烈振盪的影響。但這種方法仍容易受到數據點之間的過沖和振盪的影響。

與樣條算法相比,Akima 算法產生的波動較少,更適合處理平台區之間的快速變化。下面使用連接多個平台區的測試數據來說明這種差異。

參考

[1] Akima, Hiroshi. "A new method of interpolation and smooth curve fitting based on local procedures." Journal of the ACM (JACM) , 17.4, 1970, pp. 589-602.

[2] Akima, Hiroshi. "A method of bivariate interpolation and smooth surface fitting based on local procedures." Communications of the ACM , 17.1, 1974, pp. 18-20.

擴展功能


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM