轉載:https://ww2.mathworks.cn/help/matlab/ref/interp1.html?s_tid=srchtitle#btwp6lt-2_1
interp1
語法
說明
示例
基於粗略采樣的正弦函數進行插值
定義樣本點 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
,其列為向量 v1
、v2
和 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'
插值方法,指定為下表中的選項之一。
方法 |
說明 |
連續性 |
注釋 |
---|---|---|---|
|
線性插值。在查詢點插入的值基於各維中鄰點網格點處數值的線性插值。這是默認插值方法。 |
C0 |
|
|
最近鄰點插值。在查詢點插入的值是距樣本網格點最近的值。 |
不連續 |
|
|
下一個鄰點插值。在查詢點插入的值是下一個抽樣網格點的值。 |
不連續 |
|
|
上一個鄰點插值。在查詢點插入的值是上一個抽樣網格點的值。 |
不連續 |
|
|
保形分段三次插值。在查詢點插入的值基於鄰點網格點處數值的保形分段三次插值。 |
C1 |
|
注意
|
與 |
C1 |
此方法目前返回與 |
|
用於 MATLAB® 5 的三次卷積。 |
C1 |
點之間的間距必須均勻。 |
|
修正 Akima 三次 Hermite 插值。在查詢點插入的值基於次數最大為 3 的多項式的分段函數。為防過沖,已修正 Akima 公式。 |
C1 |
|
|
使用非結終止條件的樣條插值。在查詢點插入的值基於各維中鄰點網格點處數值的三次插值。 |
C2 |
|
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.