%% Interpolating Scattered Data Using the scatteredInterpolant Class
% This example shows how to use scatteredInterpolant to interpolate a scattered sampling of the peaks function.
%% Create the scattered data set.

X = -3 + 6.*gallery('uniformdata',[250 2],0);
V = peaks(X(:,1),X(:,2));

%
%% Create the interpolant.

F = scatteredInterpolant(X,V)

% The Points property represents the coordinates of the data points, and the Values property represents the associated values. The Method property represents the interpolation method that performs the interpolation. The ExtrapolationMethod property represents the extrapolation method used when query points fall outside the convex hull.
% You can access the properties of F in the same way you access the fields of a struct. For example, use F.Points to examine the coordinates of the data points.
%
%% Evaluate the interpolant.
% scatteredInterpolant provides subscripted evaluation of the interpolant. It is evaluated the same way as a function. You can evaluate the interpolant as follows. In this case, the value at the query location is given by Vq. You can evaluate at a single query point:

Vq = F([1.5 1.25])

%
% You can also pass individual coordinates:

Vq = F(1.5, 1.25)

%
% You can evaluate at a vector of point locations:

Xq = [0.5 0.25; 0.75 0.35; 1.25 0.85];
Vq = F(Xq)

%
% You can evaluate F at grid point locations and plot the result.

[Xq,Yq] = meshgrid(-2.5:0.125:2.5);
Vq = F(Xq,Yq);
surf(Xq,Yq,Vq);
xlabel('X','fontweight','b'), ylabel('Y','fontweight','b');
zlabel('Value - V','fontweight','b');
title('Linear Interpolation Method','fontweight','b');

%
%% Change the interpolation method.
% You can change the interpolation method on the fly. Set the method to 'nearest'.

F.Method = 'nearest';

%
% Reevaluate and plot the interpolant as before.

Vq = F(Xq,Yq);
figure
surf(Xq,Yq,Vq);
xlabel('X','fontweight','b'),ylabel('Y','fontweight','b') 
zlabel('Value - V','fontweight','b')
title('Nearest neighbor Interpolation Method','fontweight','b');

%
% Change the interpolation method to natural neighbor, reevaluate, and plot the results.

F.Method = 'natural';
Vq = F(Xq,Yq);
figure
surf(Xq,Yq,Vq);
xlabel('X','fontweight','b'),ylabel('Y','fontweight','b') 
zlabel('Value - V','fontweight','b')
title('Natural neighbor Interpolation Method','fontweight','b');

%
%% Replace the values at the sample data locations.
% You can change the values V at the sample data locations, X, on the fly. This is useful in practice as some interpolation problems may have multiple sets of values at the same locations. For example, suppose you want to interpolate a 3-D velocity field that is defined by locations (x, y, z) and corresponding componentized velocity vectors (Vx, Vy, Vz). You can interpolate each of the velocity components by assigning them to the values property (V) in turn. This has important performance benefits, because it allows you to reuse the same interpolant without incurring the overhead of computing a new one each time.
% The following steps show how to change the values in our example. You will compute the values using the expression, v = xe^{-x^{2}-y^{2}}.

V = X(:,1).*exp(-X(:,1).^2-X(:,2).^2);
F.Values = V;

%
% Evaluate the interpolant and plot the result.

Vq = F(Xq,Yq);
figure
surf(Xq,Yq,Vq);
xlabel('X','fontweight','b'), ylabel('Y','fontweight','b') 
zlabel('Value - V','fontweight','b')
title('Natural neighbor interpolation of v = x.*exp(-x.^2-y.^2)')

%
%% Add additional point locations and values to the existing interpolant.
% This performs an efficient update as opposed to a complete recomputation using the augmented data set.
% When adding sample data, it is important to add both the point locations and the corresponding values.
% Continuing the example, create new sample points as follows:

X = -1.5 + 3.*rand(100,2);
V = X(:,1).*exp(-X(:,1).^2-X(:,2).^2);

%
% Add the new points and corresponding values to the triangulation.

F.Points(end+(1:100),:) = X;
F.Values(end+(1:100)) = V;

%
% Evaluate the refined interpolant and plot the result.

Vq = F(Xq,Yq);
figure
surf(Xq,Yq,Vq);
xlabel('X','fontweight','b'), ylabel('Y','fontweight','b');
zlabel('Value - V','fontweight','b');

%
%% Remove data from the interpolant.
% You can incrementally remove sample data points from the interpolant. You also can remove data points and corresponding values from the interpolant. This is useful for removing spurious outliers.
% When removing sample data, it is important to remove both the point location and the corresponding value.
% Remove the 25th point.

F.Points(25,:) = [];
F.Values(25) = [];

%
% Remove points 5 to 15.

F.Points(5:15,:) = [];
F.Values(5:15) = [];

%
% Retain 150 points and remove the rest.

F.Points(150:end,:) = [];
F.Values(150:end) = [];

%
% This creates a coarser surface when you evaluate and plot:

Vq = F(Xq,Yq);
figure
surf(Xq,Yq,Vq);
xlabel('X','fontweight','b'), ylabel('Y','fontweight','b');
zlabel('Value - V','fontweight','b');
title('Interpolation of v = x.*exp(-x.^2-y.^2) with sample points removed')

% Copyright 2015 The MathWorks, Inc.