X-Git-Url: https://git.creatis.insa-lyon.fr/pubgit/?a=blobdiff_plain;ds=sidebyside;f=octave_packages%2Fm%2Fgeometry%2Fgriddatan.m;fp=octave_packages%2Fm%2Fgeometry%2Fgriddatan.m;h=37f15d2631b5d8b81511b938b8ce4c0cfd57c31d;hb=1c0469ada9531828709108a4882a751d2816994a;hp=0000000000000000000000000000000000000000;hpb=63de9f36673d49121015e3695f2c336ea92bc278;p=CreaPhase.git diff --git a/octave_packages/m/geometry/griddatan.m b/octave_packages/m/geometry/griddatan.m new file mode 100644 index 0000000..37f15d2 --- /dev/null +++ b/octave_packages/m/geometry/griddatan.m @@ -0,0 +1,106 @@ +## Copyright (C) 2007-2012 David Bateman +## +## This file is part of Octave. +## +## Octave is free software; you can redistribute it and/or modify it +## under the terms of the GNU General Public License as published by +## the Free Software Foundation; either version 3 of the License, or (at +## your option) any later version. +## +## Octave is distributed in the hope that it will be useful, but +## WITHOUT ANY WARRANTY; without even the implied warranty of +## MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +## General Public License for more details. +## +## You should have received a copy of the GNU General Public License +## along with Octave; see the file COPYING. If not, see +## . + +## -*- texinfo -*- +## @deftypefn {Function File} {@var{yi} =} griddatan (@var{x}, @var{y}, @var{xi}, @var{method}, @var{options}) +## +## Generate a regular mesh from irregular data using interpolation. +## The function is defined by @code{@var{y} = f (@var{x})}. +## The interpolation points are all @var{xi}. +## +## The interpolation method can be @code{"nearest"} or @code{"linear"}. +## If method is omitted it defaults to @code{"linear"}. +## @seealso{griddata, delaunayn} +## @end deftypefn + +## Author: David Bateman + +function yi = griddatan (x, y, xi, method, varargin) + + if (nargin == 3) + method = "linear"; + endif + if (nargin < 3) + print_usage (); + endif + + if (ischar (method)) + method = tolower (method); + endif + + [m, n] = size (x); + [mi, ni] = size (xi); + + if (n != ni || size (y, 1) != m || size (y, 2) != 1) + error ("griddatan: dimensional mismatch"); + endif + + ## triangulate data + ## tri = delaunayn(x, varargin{:}); + tri = delaunayn (x); + + yi = NaN (mi, 1); + + if (strcmp (method, "nearest")) + ## search index of nearest point + idx = dsearchn (x, tri, xi); + valid = !isnan (idx); + yi(valid) = y(idx(valid)); + + elseif (strcmp (method, "linear")) + ## search for every point the enclosing triangle + [tri_list, bary_list] = tsearchn (x, tri, xi); + + ## only keep the points within triangles. + valid = !isnan (tri_list); + tri_list = tri_list(!isnan (tri_list)); + bary_list = bary_list(!isnan (tri_list), :); + nr_t = rows (tri_list); + + ## assign x,y for each point of simplex + xt = reshape (x(tri(tri_list,:),:), [nr_t, n+1, n]); + yt = y(tri(tri_list,:)); + + ## Use barycentric coordinate of point to calculate yi + yi(valid) = sum (y(tri(tri_list,:)) .* bary_list, 2); + + else + error ("griddatan: unknown interpolation METHOD"); + endif + +endfunction + +%!testif HAVE_QHULL +%! [xx,yy] = meshgrid(linspace(-1,1,32)); +%! xi = [xx(:), yy(:)]; +%! x = (2 * rand(100,2) - 1); +%! x = [x;1,1;1,-1;-1,-1;-1,1]; +%! y = sin(2*(sum(x.^2,2))); +%! zz = griddatan(x,y,xi,'linear'); +%! zz2 = griddata(x(:,1),x(:,2),y,xi(:,1),xi(:,2),'linear'); +%! assert (zz, zz2, 1e-10) + +%!testif HAVE_QHULL +%! [xx,yy] = meshgrid(linspace(-1,1,32)); +%! xi = [xx(:), yy(:)]; +%! x = (2 * rand(100,2) - 1); +%! x = [x;1,1;1,-1;-1,-1;-1,1]; +%! y = sin(2*(sum(x.^2,2))); +%! zz = griddatan(x,y,xi,'nearest'); +%! zz2 = griddata(x(:,1),x(:,2),y,xi(:,1),xi(:,2),'nearest'); +%! assert (zz, zz2, 1e-10)