diff scripts/general/interp3.m @ 6722:5b09d433171c

[project @ 2007-06-14 10:13:14 by dbateman]
author dbateman
date Thu, 14 Jun 2007 10:13:16 +0000
parents b2391d403ed2
children ebf96cc00ee9
line wrap: on
line diff
--- a/scripts/general/interp3.m	Thu Jun 14 06:56:42 2007 +0000
+++ b/scripts/general/interp3.m	Thu Jun 14 10:13:16 2007 +0000
@@ -75,27 +75,58 @@
     method = varargin {end};
     nargs = nargs - 1;
   elseif (ischar (varargin {end - 1}))
-    if (! isnumeric (vargin {end}) || ! isscalar (vargin {end}))
+    if (! isnumeric (varargin {end}) || ! isscalar (varargin {end}))
       error ("extrapal is expected to be a numeric scalar");
     endif
+    extrapval = varargin {end};
     method = varargin {end - 1};
     nargs = nargs - 2;
   endif
 
   if (nargs < 3 || (nargs == 4 && ! isvector (varargin {1}) && 
       nargs == (ndims (varargin {1}) + 1)))
-    v = varargin {1};
     if (ndims (v) != 3)
       error ("expect 3-dimensional array of values");
     endif
-    vi = ipermute (interpn (permute(varargin, [1, 3, 2, 4]){:}), [2, 1, 3]);
+    x = varargin (2:4);
+    if (any (! cellfun (@isvector, x)))
+      for i = 2 : 3
+	if (! size_equal (x{1}, x{i}) || ! size_equal (x{i}, v))
+	  error ("dimensional mismatch");
+	endif
+	x{i} = permute (x{i}, [2, 1, 3]);
+      endfor
+      x{1} = permute (x{1}, [2, 1, 3]);
+    endif
+    v = permute (v, [2, 1, 3]);
+    vi = ipermute (interpn (v, x{:}, method, extrapval), [2, 1, 3]);
   elseif (nargs == 7 && nargs == (2 * ndims (varargin {ceil (nargs / 2)})) + 1)
     v = varargin {4};
     if (ndims (v) != 3)
       error ("expect 3-dimensional array of values");
     endif
-    vi = ipermute (interpn (permute(varargin, [2, 1, 3, 4, 6, 5, 7]){:}), 
-		   [2, 1, 3]);
+    x = varargin (1:3);
+    if (any (! cellfun (@isvector, x)))
+      for i = 2 : 3
+	if (! size_equal (x{1}, x{i}) || ! size_equal (x{i}, v))
+	  error ("dimensional mismatch");
+	endif
+	x{i} = permute (x{i}, [2, 1, 3]);
+      endfor
+      x{1} = permute (x{1}, [2, 1, 3]);
+    endif
+    y = varargin (5:7);
+    if (any (! cellfun (@isvector, y)))
+      for i = 2 : 3
+	if (! size_equal (y{1}, y{i}))
+	  error ("dimensional mismatch");
+	endif
+	y{i} = permute (y{i}, [2, 1, 3]);
+      endfor
+      y{1} = permute (y{1}, [2, 1, 3]);
+    endif
+    v = permute (v, [2, 1, 3]);
+    vi = ipermute (interpn (x{:}, v, y{:}, method, extrapval), [2,1,3]);
   else
     error ("wrong number or incorrectly formatted input arguments");
   endif