interp1 - [Matlab R2016a] - Speed Issues

16 visualizaciones (últimos 30 días)
Ilya Klyashtornyy
Ilya Klyashtornyy el 30 de Jun. de 2017
Respondida: Nikolaus Koopmann el 3 de Jun. de 2020
Heeeey guys,
as I already noticed in this community, I am not alone with that problem. I have tried several solutions proposed in here but it didnt help for reasons like: Old Matlab Versions (interp1 has changed significatly) or another kind of problem.
Let me first tell you what i am doing to make it easier for you to help me:
I a for-loop with approx. 30.000 iterations i use interp1 several time (5 times per iteration - see the profiler below).
Example of the call: [interp1( x, y, xq)]
Here, x is a vector (length 10.000) and y is also a vector (length 10.000) and xq is a vector (length 50.000 or more).
The problem is also that y changes in each iteration and therefore, I cannot precompute any operation (xq is also updated each iteration).
I would be very grateful if you had any suggestions to improve the computational time in this case.
Best regards, Ilya
  1 comentario
Walter Roberson
Walter Roberson el 30 de Jun. de 2017
Would x happen to be equally spaced? Is xq sorted?

Iniciar sesión para comentar.

Respuesta aceptada

Steven Lord
Steven Lord el 30 de Jun. de 2017
Test if creating a griddedInterpolant once before the start of the for loop, replacing the Values property of the object each time you change y, is faster.
  4 comentarios
Ilya Klyashtornyy
Ilya Klyashtornyy el 30 de Jun. de 2017
Editada: Ilya Klyashtornyy el 30 de Jun. de 2017
I replaced all
int=interp1(x,y,xq);
with
S=griddedInterpolant(x,y);
int=S(xq);
It gave me a speed up of almost 25%
Thank you! :)
Ilya Klyashtornyy
Ilya Klyashtornyy el 1 de Jul. de 2017
Editada: Ilya Klyashtornyy el 1 de Jul. de 2017
Hey, thanks for this advice.
I found out that (mb only in my case) creating a new griddedInterpolant takes less time than updating the values.
S=griddedInterpolant(x,y_new): 1.03s
S.Values=y_new: 1.32s
Do you agree with me on that? Do you receive different results?

Iniciar sesión para comentar.

Más respuestas (2)

Walter Roberson
Walter Roberson el 30 de Jun. de 2017
  6 comentarios
Walter Roberson
Walter Roberson el 1 de Jul. de 2017
Under the assumption that xq might be "exactly" -pi but is less than +pi:
xmin = -pi; xmax = +pi; span = xmax - xmin;
idx = floor( (xq - xmin) * length(x) / span + 1 );
offset = xq - x(idx);
yq = y(idx) * (1-offset) + y(idx+1) * offset;
I would need to double-check that the rounding for the index calculation works out well enough.
The idea is that with x being equally spaced with known min and max, then algebraically you can calculate the index into the x vector through a simple scaling operation. Then you can use the index vector to look up the values to do linear interpolation.
Ilya Klyashtornyy
Ilya Klyashtornyy el 2 de Jul. de 2017
Hey Walter,
thank you very much for your time!
I ve evaluated ther method and compared it to the griddedInterpolant:
%Time per iteration:
griddedInterpolant: average - 0.00328s
your suggestion: average - 0.00672s

Iniciar sesión para comentar.


Nikolaus Koopmann
Nikolaus Koopmann el 3 de Jun. de 2020
% Current date = June 03, 2020
% Matlab version = 9.6.0.1072779 (R2019a)
% User name = Nikolaus Koopmann
function [yq,p] = interp1_lin(x,y,xq)
validateattributes(x,{'double'},{'increasing','vector'}) % slow
%% lin. regr.
X = [ones(length(x),1) x(:)];
p = flipud(X\y(:)); % see https://www.mathworks.com/help/matlab/data_analysis/linear-regression.html
% flin = @(x_)p(1)*x_ + p(2); % slow
yq = p(1)*xq + p(2);
end

Categorías

Más información sobre Characters and Strings en Help Center y File Exchange.

Community Treasure Hunt

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

Start Hunting!

Translated by