Simple Interpolation with interp1

18 次查看(过去 30 天)
Hi,
I'm having trouble with interp1. I have velocity recorded as a function of time. Some of the velocities were thrown out from a filtering process. I would like to go back and fill in the missing values with a linear interpolation. The input time series may only have one missing value between observations or it may have large gaps of missing values. I expect to end up with a time series with no missing values.
A cubic interpolation fills in all the gaps... interpX=interp1(time,velocity,time, 'cubic')
but this still leaves gaps interpX=interp1(time,velocity,time, 'linear')
What am I doing wrong?
Thanks,
Tim

采纳的回答

Matt Tearle
Matt Tearle 2011-9-29
I'm guessing that you're passing the entire arrays (ie NaNs and all) into interp1. For cubic interpolation, interp1 calls pchip which excises any NaNs in the data. However, interp1 just performs linear interpolation itself.
For linear interpolation, the interpolated value is simply the weighted average of the points on either side. If either of those is a NaN, the result is a NaN.
Here's some example code to show what's happening, using the data sample you posted:
% Set method to 'linear' or 'cubic'
method = 'linear';
% Data
x = [0.595 0.2243
0.605 0.2421
0.615 NaN
0.625 NaN
0.635 0.2181
0.645 NaN
0.655 0.1911
0.665 0.2479];
t = x(:,1);
y = x(:,2);
% Interpolation, first cutting out NaNs
idx = isnan(y);
y(idx) = interp1(t(~idx),y(~idx),t(idx),method)
subplot(2,1,1)
plot(t,y,'o-')
% Interpolation on raw data
y = x(:,2);
y(idx) = interp1(t,y,t(idx),method)
subplot(2,1,2)
plot(t,y,'o-')

更多回答(2 个)

Andrei Bobrov
Andrei Bobrov 2011-9-29
time = [0 sort(randi(120,1,5))]
velocity = randi(120,1,6)
t = linspace(time(1),time(end),100);
rl = interp1(time,velocity,t);
rc = interp1(time,velocity,t,'cubic');
plot([rl',rc']),grid on
ADDED
tvy = [0.595 0.2243
0.605 0.2421
0.615 NaN
0.625 NaN
0.635 0.2181
0.645 NaN
0.655 0.1911
0.665 0.2479
]
tvw = tvy(~isnan(tvy(:,2)),:)
t = sort([tvw(2:end-1,1); linspace(tvw(1,1),tvw(end,1),100)']);
rl = interp1(tvw(:,1),tvw(:,2),t);
rc = interp1(tvw(:,1),tvw(:,2),t,'cubic');
plot(t,rl,t,rc,tvw(:,1),tvw(:,2),'go'),grid on
  1 个评论
Tim
Tim 2011-9-29
Thanks Andrei, but I'm still not 100 percent clear. Is the problem that I'm using the same time variable in the interp function twice? The time variable I'm using contains all the times I want a velocity at...that is the time variable has no missing values. See below...[time, velocity].
0.595 0.2243
0.605 0.2421
0.615 NaN
0.625 NaN
0.635 0.2181
0.645 NaN
0.655 0.1911
0.665 0.2479

请先登录,再进行评论。


Tim
Tim 2011-9-29
Thanks Andrei, I was able to put your code to use.
But if anybody can explain why A cubic interpolation fills in all the gaps but switching the option to 'linear' does not, I'd appreciate it.
interpX=interp1(time,velocity,time, 'cubic')

类别

Help CenterFile Exchange 中查找有关 Interpolation 的更多信息

Community Treasure Hunt

Find the treasures in MATLAB Central and discover how the community can help you!

Start Hunting!

Translated by