Mercurial > octave-nkf
diff scripts/general/interpn.m @ 7421:1c7b3e1fda19
[project @ 2008-01-25 21:00:42 by dbateman]
author | dbateman |
---|---|
date | Fri, 25 Jan 2008 21:02:26 +0000 |
parents | a730e47fda4d |
children | 342a48abed2a |
line wrap: on
line diff
--- a/scripts/general/interpn.m Fri Jan 25 18:56:07 2008 +0000 +++ b/scripts/general/interpn.m Fri Jan 25 21:02:26 2008 +0000 @@ -134,19 +134,8 @@ x{1} = x{1}(idx{:})(:); endif - if (strcmp (method, "linear") || strcmp (method, "nearest")) - if (all (cellfun (@isvector, y))) - [y{:}] = ndgrid (y{:}); - endif - elseif (any (! cellfun (@isvector, y))) - for i = 1 : nd - idx (1 : nd) = {1}; - idx (i) = ":"; - y{i} = y{i}(idx{:})(:).'; - endfor - endif + method = tolower (method); - method = tolower (method); if (strcmp (method, "linear")) vi = __lin_interpn__ (x{:}, v, y{:}); vi (isna (vi)) = extrapval; @@ -159,7 +148,7 @@ 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); @@ -169,7 +158,17 @@ vi(idx) = extrapval; vi = reshape (vi, yshape); elseif (strcmp (method, "spline")) + szi = size (y{1}); + for i = 1 : nd + y{i} = y{i}(:); + endfor + vi = __splinen__ (x, v, y, extrapval, "interpn"); + + ## get all diagonal elements of vi + sc = sum ([1 cumprod(size (vi)(1:end-1))]); + vi = vi(sc * [0:size(vi,1)-1] + 1); + vi = reshape (vi,szi); elseif (strcmp (method, "cubic")) error ("cubic interpolation not yet implemented"); else @@ -182,7 +181,7 @@ %! A=[13,-1,12;5,4,3;1,6,2]; %! x=[0,1,4]; y=[10,11,12]; %! xi=linspace(min(x),max(x),17); -%! yi=linspace(min(y),max(y),26)'; +%! AI=linspace(min(y),max(y),26)'; %! mesh(xi,yi,interpn(x,y,A.',xi,yi,"linear").'); %! [x,y] = meshgrid(x,y); %! hold on; plot3(x(:),y(:),A(:),"b*"); hold off; @@ -225,3 +224,13 @@ %! vi = interpn(x, y, z, v, xxi, yyi, zzi, 'spline'); %! mesh (yi, zi, squeeze (vi(1,:,:))); + +%!test +%! [x,y,z] = ndgrid(0:2); +%! f = x+y+z; +%! assert (interpn(x,y,z,f,[.5 1.5],[.5 1.5],[.5 1.5]), [1.5, 4.5]) +%! assert (interpn(x,y,z,f,[.51 1.51],[.51 1.51],[.51 1.51],'nearest'), [3, 6]) +%! assert (interpn(x,y,z,f,[.5 1.5],[.5 1.5],[.5 1.5],'spline'), [1.5, 4.5]) +%! assert (interpn(x,y,z,f,x,y,z), f) +%! assert (interpn(x,y,z,f,x,y,z,'nearest'), f) +%! assert (interpn(x,y,z,f,x,y,z,'spline'), f)