Mercurial > hg > octave-lyh
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