Repeatedly interpolating from scattered to regular grid with varying sample values

3 vues (au cours des 30 derniers jours)
I want to do scattered interpolation in Matlab, but scatteredInterpolant does not do quite what I want.
scatteredInterpolant allows me to provide a set of input sampling positions and corresponding sample values. Then I can query the interpolated values by supplying a set of positions:
F = scatteredInterpolant(xpos, ypos, samplevals)
interpvals = F(xgrid, ygrid)
This is sort of the opposite of what I want. I already have a fixed set of sample positions, xpos/ypos, and output grid, xgrid/ygrid, and then I want to vary the sample values. The use case is that I have many quantities sampled at the same sampling positions, that should all be interpolated to the same output grid.
I have an idea how to do this for nearest neighbor and linear interpolation, but not for more general cases, in particular for natural neighbor interpolation.
This is what I want, in mock code:
G = myScatteredInterpolant(xpos, ypos, xgrid, ygrid, interp_method)
interpvals = G(samplevals)
In terms of what this means, I suppose G should hold a (presumably sparse) matrix of weights, W, and then G(samplevals) basically does W * samplevals, where the weights in the matrix W depends on the input and output grid, as well as the interpolation method (nearest neighbor, linear, natural neighbor). Calculating the matrix W is probably much more expensive than evaluating the product W * samplevals, which is why I want this to be reused.
Is there any code in Matlab, or in a similar language that I could adapt, that does this? Can it somehow be extracted from scatteredInterpolant in reasonable processing time?

Réponse acceptée

Matt J
Matt J le 1 Juil 2020
Modifié(e) : Matt J le 1 Juil 2020
You can change the Values property of the scatteredInterpolant object. That can eliminate significant object re-building time, as the following example shows.
[xgrid,ygrid]=ndgrid(linspace(0,1,500));
N=500^2;
tic;
F=scatteredInterpolant(rand(N,1), rand(N,1), rand(N,1));
toc;% Elapsed time is 1.048601 seconds.
newsamplevals=rand(N,1);
tic;
F.Values=newsamplevals;
toc;% Elapsed time is 0.398981 seconds.
tic;
F(xgrid,ygrid);
toc;% Elapsed time is 0.444320 seconds.
You could also consider generating the W matrix you are talking about using func2mat from the File Exchange
However, the construction of this matrix can be very slow, depending on the size of your grid. It has options to use the Parallel Computing Toolbox, if you have it, and this will mitigate computation time somewhat, but you would still have to assess whether the time to build W is worth the investment to you.
  2 commentaires
DNF
DNF le 1 Juil 2020
Thanks for the answer. I suppose you don't know any built-in Matlab functionality that fully answers my question? Anyway, this is definitely useful.
Matt J
Matt J le 1 Juil 2020
Modifié(e) : Matt J le 1 Juil 2020
I suppose you don't know any built-in Matlab functionality that fully answers my question?
I am quite convinced that there is no built-in Matlab functionality for this.

Connectez-vous pour commenter.

Plus de réponses (0)

Catégories

En savoir plus sur Matrix Indexing dans Help Center et File Exchange

Produits


Version

R2020a

Community Treasure Hunt

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

Start Hunting!

Translated by