diff scripts/linear-algebra/cross.m @ 4890:e7da90a1cc11

[project @ 2004-05-06 20:36:29 by jwe]
author jwe
date Thu, 06 May 2004 20:36:29 +0000
parents 38c61cbf086c
children 10004c9625c3
line wrap: on
line diff
--- a/scripts/linear-algebra/cross.m
+++ b/scripts/linear-algebra/cross.m
@@ -18,7 +18,7 @@
 ## 02111-1307, USA.
 
 ## -*- texinfo -*-
-## @deftypefn {Function File} {} cross (@var{x}, @var{y})
+## @deftypefn {Function File} {} cross (@var{x}, @var{y}, @var{dim})
 ## Computes the vector cross product of the two 3-dimensional vectors
 ## @var{x} and @var{y}.
 ##
@@ -29,44 +29,62 @@
 ## @end group
 ## @end example
 ##
-## If @var{x} and @var{y} are two - dimensional matrices the
-## cross product is applied along the first dimension with 3 elements.
-##
+## If @var{x} and @var{y} are matrices, the cross product is applied 
+## along the first dimension with 3 elements. The optional argument 
+## @var{dim} is used to force the cross product to be calculated along
+## the dimension defiend by @var{dim}.
 ## @end deftypefn
 
 ## Author: Kurt Hornik <Kurt.Hornik@ci.tuwien.ac.at>
 ## Created: 15 October 1994
 ## Adapted-By: jwe
 
-function z = cross (x, y)
+function z = cross (x, y, dim)
 	
-  if (nargin != 2)
-    usage ("cross (x, y)");
+  if (nargin != 2 && nargin != 3)
+    usage ("cross (x, y, dim)");
+  endif
+
+  if (ndims (x) < 3 && ndims (y) < 3 && nargin < 3)
+    ## XXX COMPATIBILITY XXX opposite behaviour for cross(row,col)
+    ## Swap x and y in the assignments below to get the matlab behaviour.
+    ## Better yet, fix the calling code so that it uses conformant vectors.
+    if (columns (x) == 1 && rows (y) == 1)
+      warning ("cross: taking cross product of column by row");
+      y = y.';
+    elseif (rows (x) == 1 && columns (y) == 1)
+      warning ("cross: taking cross product of row by column");
+      x = x.';
+    endif
   endif
 
-  ## XXX COMPATIBILITY XXX opposite behaviour for cross(row,col)
-  ## Swap x and y in the assignments below to get the matlab behaviour.
-  ## Better yet, fix the calling code so that it uses conformant vectors.
-  if (columns(x) == 1 && rows(y) == 1)
-    warning ("cross: taking cross product of column by row");
-    y = y.';
-  elseif (rows(x) == 1 && columns(y) == 1)
-    warning ("cross: taking cross product of row by column");
-    x = x.';
+  if (nargin == 2)
+     dim = min (find (size (x) == 3));
+     if (isempty (dim)) 
+       error ("cross: must have at least one dimension with 3 elements");
+     endif
+   else
+     if (size (x) != 3)
+       error ("cross: dimension dim must have 3 elements");
+     endif
   endif
 
-  if (size(x) == size(y))
-    if (rows(x) == 3)
-      z = [ ( x (2,:) .* y (3,:) - x (3,:) .* y (2,:) ) ;
-            ( x (3,:) .* y (1,:) - x (1,:) .* y (3,:) ) ;
-            ( x (1,:) .* y (2,:) - x (2,:) .* y (1,:) ) ];
-    elseif (columns(x) == 3)
-      z = [ ( x (:,2) .* y (:,3) - x (:,3) .* y (:,2) ) , \
-            ( x (:,3) .* y (:,1) - x (:,1) .* y (:,3) ) , \
-            ( x (:,1) .* y (:,2) - x (:,2) .* y (:,1) ) ];
-    else
-      error ("cross: x,y must have dimension nx3 or 3xn");
-    endif
+  nd = ndims (x);
+  sz = size (x);
+  idx1 = cell ();
+  for i = 1:nd
+    idx1{i} = 1:sz(i);
+  endfor
+  idx2 = idx3 = idx1;
+  idx1(dim) = 1;
+  idx2(dim) = 2;
+  idx3(dim) = 3;
+
+  if (size (x) == size (y))
+    z = cat (dim, 
+	     (x(idx2{:}) .* y(idx3{:}) - x(idx3{:}) .* y(idx2{:})),
+             (x(idx3{:}) .* y(idx1{:}) - x(idx1{:}) .* y(idx3{:})),
+             (x(idx1{:}) .* y(idx2{:}) - x(idx2{:}) .* y(idx1{:})));
   else
     error ("cross: x and y must have the same dimensions");
   endif