How can I interpolate just one point on a given function while saving time?

Hi all,
I have a function and I have a collection of N couple of points , namely and respecting the function f. I want to evaluate my function in a single point out of set X, so . Until now I'm using the Matlab function = interp1(,'spline'). But maybe this methods requires a certain computational effort. Since I always evaluate my function on a single point (not a vector of points), is there an alternative function (or method) to interp1 to do this task that allows to save time?
Thank you in advance!

4 个评论

Will you be doing this repeatedly with the same X and Y?
Is your X sorted? Is it monotonic (no duplicates, no reversals) ?
@Jan The spline method could be an accurate one, any other suggestion? (I tried with a linear interpolation, but it is not sufficient)
@Walter Roberson the vector X represent angles in degree, X = -360:0.5:359.5.
Everything takes computation effort. Please state how long it takes, and how fast you need it to be. You can use tic and toc to time it.

请先登录,再进行评论。

 采纳的回答

3 times faster without overhead, if you fokus on the neighborhood:
X = -360:0.5:359.5;
Y = rand(size(X));
xi = 7.59;
tic
for k = 1:1e4
yi1 = interp1(X, Y, xi,'spline');
end
toc
tic
index = find(xi >= X, 1, 'last');
XX = X(index-8:index+8);
for k = 1:1e4
F = griddedInterpolant(XX, Y(index-8:index+8), 'spline');
yi2 = F(xi);
end
toc
yi1 - yi2 % Of course a difference: RAND are very noisy input data
% Elapsed time is 1.554598 seconds.
% Elapsed time is 0.513496 seconds.

更多回答(1 个)

With the X being sorted and known increments, for any xstar you can directly compute the corresponding X bin that does not exceed xstar as xstar*2+721. Call that idx
jdxstart = min(max(1,idx-2), length(X) - 4);
jdx = jdxstart:jdxstart+4;
pp = spline(X(jdx), y(idx))
ystar = ppval(pp, xstar);
That is, we extract X y "near" xstar and spline only there to reduce the work.

6 个评论

Thank you so much! It is a good code but I tried it and it weights computationally more then interp1(X,Y,xstar,'spline'). But, again, thank you!
interp1 and spline have a lot of overhead. If you post some code, which shows unequivocally, how you call these functions, it is possible to suggest a lean version, which avoids the overhead. Because your system is tiny, it is e.g. a waste of time to set it up as sparse matrix as in spline().
This is the function, or, better, the points that I called Y versus X. X is a collection of points described as before, so they are -360:0.5:359.5. For example I want to evaluate the value relative to x* = 7.59. Until now I'm using:
y* = interp1(X,Y,x*,'spline');
This command takes on average 80 microseconds (tested on 100'000 instances). Is this time improvable in your opinion?
And can I exploit the fact that I'm evaluating my function on a single point?
It's great!! Thank you so much Yan, very very great!

请先登录,再进行评论。

类别

在 帮助中心 和 File Exchange 中查找有关 Interpolation 的更多信息

Community Treasure Hunt

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

Start Hunting!

Translated by