interp1一維資料插值在matlab中的用法
轉載:https://ww2.mathworks.cn/help/matlab/ref/interp1.html?s_tid=srchtitle#btwp6lt-2_1
interp1
一維資料插值(表查詢)
全頁摺疊語法
vq = interp1(x,v,xq)
vq = interp1(x,v,xq,method)
vq = interp1(x,v,xq,method,extrapolation)
vq = interp1(v,xq)
vq = interp1(v,xq,method)
vq = interp1(v,xq,method,extrapolation)
pp = interp1(x,v,method,'pp')
說明
使用線性插值返回一維函式在特定查詢點的插入值。向量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
,其列為向量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.