1. 程式人生 > 實用技巧 >interp1一維資料插值在matlab中的用法

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)返回插入的值,並假定一個樣本點座標預設集。預設點是從1n的數字序列,其中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

示例

全部摺疊

基於粗略取樣的正弦函式進行插值

View MATLAB Command

定義樣本點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');

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

View MATLAB Command

定義一組函式值。

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');

複數值插值

View MATLAB Command

定義一組樣本點。

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');

日期和時間的插值

View MATLAB Command

對時間戳資料點進行插值。

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

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')

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

View MATLAB Command

定義樣本點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 域範圍外的所有查詢指定常量值

View MATLAB Command

定義樣本點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

在一個傳遞點插入多組資料

View MATLAB Command

定義樣本點。

x = (-5:5)';

x所定義的點處對三個不同的拋物線函式取樣。

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

建立矩陣v,其列為向量v1v2v3

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的大小取決於vxq的形狀。

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.

擴充套件功能