Alternative for interp1 for fast computation
20 visualizaciones (últimos 30 días)
Mostrar comentarios más antiguos
Chandan Bangalore
el 26 de Nov. de 2018
Comentada: Michal
el 28 de Jul. de 2021
I am working with matrices of size (1000 x 1000) and have a function that involves log and tanh functions. To avoid the computational complexity I want to store the results in the form of a lookup table and access them directly without performing log(tanh(abs(x))) everytime. I am using interp1 function to do this, but this is very slow. Could someone please help me speed up the below function?
range = 0:0.1:6;
data = log(tanh(abs(range)));
value = [0 0.1 0.2105];
out = interp1(range,data,value,'nearest');
5 comentarios
David Thoen
el 16 de Nov. de 2020
might be a bit late, but check out this piece of interpolation-script: https://www.mathworks.com/matlabcentral/fileexchange/28376-faster-linear-interpolation
Michal
el 28 de Jul. de 2021
Yes the FEX https://www.mathworks.com/matlabcentral/fileexchange/28376-faster-linear-interpolation is definitely fastest solution ... based on matlab scripts (without MEX).
Respuesta aceptada
Jan
el 27 de Nov. de 2018
Editada: Jan
el 27 de Nov. de 2018
You can try this C-Mex function for a linear interpolation: https://www.mathworks.com/matlabcentral/fileexchange/25463-scaletime
range = 0:0.1:6;
data = log(tanh(range)); % No abs() needed for the given range
value = linspace(0, 6, 1e6); % Equivalent to 1000x1000 matrix
tic;
index = value * (numel(range)-1) / 6 + 1;
out = ScaleTime(data, index);
toc
tic
out2 = log(tanh(value));
toc
7 comentarios
Bruno Luong
el 29 de Nov. de 2018
step = 0.1;
index = floor((value - range(1))/step) + 1;
Jan
el 29 de Nov. de 2018
range = 0.1:6;
data = -log(tanh(range));
value = [-0.5, 0.5];
index = abs(value) * (numel(range)-1) / 6 + 1;
out = ScaleTime(data, index);
You need to create the look-up-table data only for the positive inputs, if you provide positive inputs only.
Más respuestas (1)
Bruno Luong
el 26 de Nov. de 2018
range = 0:0.1:6;
data = log(tanh(abs(range)))
edges = [-Inf, 0.5*(range(1:end-1)+range(2:end)), Inf]; % this is done once
value = linspace(0,6,1024);
% This replace INTERP1
[~,~,loc]=histcounts(value,edges);
out = data(loc)
2 comentarios
Bruno Luong
el 26 de Nov. de 2018
Editada: Bruno Luong
el 26 de Nov. de 2018
Sorry you timing is flawed for 2 reasons:
- includes the non-relevant parts
- too small data therefore overhead of histcounts and interp1 will kills any advantage
Ver también
Categorías
Más información sobre Matrix Indexing 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!