# HG changeset patch # User Ben Abbott # Date 1280144077 14400 # Node ID f3c984d45dcb1cad2a77f38f3da44f07e16ba1a9 # Parent 947adebb1336334ddc6c1317d42b3fc9dc777140 interpn.m: Convert interpolation vectors of non-equal length to nd-arrays. diff -r 947adebb1336 -r f3c984d45dcb scripts/ChangeLog --- a/scripts/ChangeLog Mon Jul 26 12:46:21 2010 +0200 +++ b/scripts/ChangeLog Mon Jul 26 07:34:37 2010 -0400 @@ -1,3 +1,8 @@ +2010-07-26 Ben Abbott + + * general/interpn.m: Convert interpolation vectors of non-equal + length to nd-arrays. + 2010-07-26 Soren Hauberg * image/image.m: Replace parenthesis with curly bracket in Texinfo. diff -r 947adebb1336 -r f3c984d45dcb scripts/general/interpn.m --- a/scripts/general/interpn.m Mon Jul 26 12:46:21 2010 +0200 +++ b/scripts/general/interpn.m Mon Jul 26 07:34:37 2010 -0400 @@ -17,7 +17,7 @@ ## . ## -*- texinfo -*- -## @deftypefn {Function File} {@var{vi} =} interpn (@var{x1}, @var{x2}, @dots{}, @var{v}, @var{y1}, @var{y2}, @dots{}) +## @deftypefn {Function File} {@var{vi} =} interpn (@var{x1}, @var{x2}, @dots{}, @var{v}, @var{y1}, @var{y2}, @dots{}) ## @deftypefnx {Function File} {@var{vi} =} interpn (@var{v}, @var{y1}, @var{y2}, @dots{}) ## @deftypefnx {Function File} {@var{vi} =} interpn (@var{v}, @var{m}) ## @deftypefnx {Function File} {@var{vi} =} interpn (@var{v}) @@ -137,6 +137,13 @@ method = tolower (method); + all_vectors = all (cellfun (@isvector, y)); + different_lengths = numel (unique (cellfun (@numel, y))) > 1; + if (all_vectors && different_lengths) + [foobar(1:numel(y)).y] = ndgrid (y{:}); + y = {foobar.y}; + endif + if (strcmp (method, "linear")) vi = __lin_interpn__ (x{:}, v, y{:}); vi (isna (vi)) = extrapval; @@ -149,10 +156,10 @@ endfor idx = cell (1,nd); for i = 1 : nd - idx{i} = yidx{i} + (y{i} - x{i}(yidx{i}) >= x{i}(yidx{i} + 1) - y{i}); + idx{i} = yidx{i} + (y{i} - x{i}(yidx{i})(:) >= x{i}(yidx{i} + 1)(:) - y{i}); endfor vi = v (sub2ind (sz, idx{:})); - idx = zeros (prod(yshape),1); + idx = zeros (prod (yshape), 1); for i = 1 : nd idx |= y{i} < min (x{i}(:)) | y{i} > max (x{i}(:)); endfor @@ -253,6 +260,25 @@ %! assert (interpn(x,y,z,f,x,y,z,'spline'), f) %!test +%! [x, y, z] = ndgrid (0:2, 1:4, 2:6); +%! f = x + y + z; +%! xi = [0.5 1.0 1.5]; +%! yi = [1.5 2.0 2.5 3.5]; +%! zi = [2.5 3.5 4.0 5.0 5.5]; +%! fi = interpn (x, y, z, f, xi, yi, zi); +%! [xi, yi, zi] = ndgrid (xi, yi, zi); +%! assert (fi, xi + yi + zi) + +%!test +%! xi = 0:2; +%! yi = 1:4; +%! zi = 2:6; +%! [x, y, z] = ndgrid (xi, yi, zi); +%! f = x + y + z; +%! fi = interpn (x, y, z, f, xi, yi, zi, "nearest"); +%! assert (fi, x + y + z) + +%!test %! [x,y,z] = ndgrid(0:2); %! f = x.^2+y.^2+z.^2; %! assert (interpn(x,y,-z,f,1.5,1.5,-1.5), 7.5)