Linear Extrapolation with interp2
146 visualizaciones (últimos 30 días)
Mostrar comentarios más antiguos
Michael Boutros
el 16 de Mayo de 2020
Matlab's griddedInterpolant allows for linear interpolation with linear extrapolation in 2D space, i.e.,
griddedInterpolant(X,Y,V,'linear','linear');
However, it seems to be the case that interp2, which I believe uses griddedInterpolant under-the-hood, doesn't allow for this combination. If "linear" is selected as the interpolation method, then the extrapolation must be a scalar. Is there a way to use linear-linear inter-extrapolation with interp2?
4 comentarios
John D'Errico
el 16 de Mayo de 2020
My question is still valid for Michael to answer as to why. Regardless, you can't force interp2 to do what it is not written to do. Anyway, IF the interp2 call is just going to get sent into griddedInterpolant anyway, then the GPU call would still seem to be a problem, since then interp2 is just a wrapper.
Matt J
el 16 de Mayo de 2020
I am curious of Michael's actual motives as well. Irrespectively, though, it is a frustrating problem for gpuArray users... I don't believe the gpuArray version of interp2 is a wrapper for anything. If a GPU version of griddedInterpolant existed, it would make sense for the Parallel Computing Toolbox developers to make it available to us.
Respuesta aceptada
Matt J
el 16 de Mayo de 2020
Editada: Matt J
el 16 de Mayo de 2020
The only remedy I can think of is to pre-pad the edges of the data V with linearly extrapolated values at distant X, Y. That way, you aren't doing any extrapolation anymore. All of your query points xq,yq will fall within the boundaries of the padded data, assuming you make the padded, X,Y distant enough to enclose them.
[V,x]=linearpad(V,x);
[V,x]=linearpad(fliplr(V),flip(x)); V=fliplr(V);
V=V.';
[V,y]=linearpad(V,y);
[V,y]=linearpad(fliplr(V),flip(y)); V=fliplr(V);
V=V.';
Vq=interp2(x,y,V,xq,yq,'linear');
function [D,z]=linearpad(D0,z0)
factor=1e6;
dz=z0(end)-z0(end-1);
dD=D(:,end)-D(:,end-1);
z=z0;
z(end+1)=z(end)+factor*dz;
D=D0;
D(:,end+1)=D(:,end) + factor*dD;
end
1 comentario
KD
el 26 de Mzo. de 2021
Editada: KD
el 26 de Mzo. de 2021
FYI this almost works but there are mistakes. There should be no fliplr after applying linearpad the second time in each direction, and in the function it should be D=D0(:,end)-D0(:,end-1); (not D=D...)
Otherwise works great - thanks!
This is my modified version:
[V,x]=linearpad(V,x);
[V,x]=linearpad(fliplr(V),flip(x));
V=V.';
[V,y]=linearpad(V,y);
[V,y]=linearpad(fliplr(V),flip(y));
V=V.';
Vq=interp2(x,y,V,xq,yq,'linear');
function [D,z]=linearpad(D0,z0)
factor=1e6;
dz=z0(end)-z0(end-1);
dD=D0(:,end)-D0(:,end-1);
z=z0;
z(end+1)=z(end)+factor*dz;
D=D0;
D(:,end+1)=D(:,end) + factor*dD;
end
Más respuestas (0)
Ver también
Community Treasure Hunt
Find the treasures in MATLAB Central and discover how the community can help you!
Start Hunting!