From: <hi...@us...> - 2010-02-22 07:07:22
|
Revision: 6944 http://octave.svn.sourceforge.net/octave/?rev=6944&view=rev Author: highegg Date: 2010-02-22 07:07:16 +0000 (Mon, 22 Feb 2010) Log Message: ----------- move rotv and rotparams to linear-algebra Modified Paths: -------------- trunk/octave-forge/main/linear-algebra/INDEX trunk/octave-forge/main/miscellaneous/INDEX Added Paths: ----------- trunk/octave-forge/main/linear-algebra/inst/rotparams.m trunk/octave-forge/main/linear-algebra/inst/rotv.m Removed Paths: ------------- trunk/octave-forge/main/miscellaneous/inst/rotparams.m trunk/octave-forge/main/miscellaneous/inst/rotv.m Modified: trunk/octave-forge/main/linear-algebra/INDEX =================================================================== --- trunk/octave-forge/main/linear-algebra/INDEX 2010-02-22 07:06:08 UTC (rev 6943) +++ trunk/octave-forge/main/linear-algebra/INDEX 2010-02-22 07:07:16 UTC (rev 6944) @@ -5,6 +5,8 @@ thfm outer cartprod + rotparams + rotv Matrix factorization gsvd GramSchmidt Copied: trunk/octave-forge/main/linear-algebra/inst/rotparams.m (from rev 6941, trunk/octave-forge/main/miscellaneous/inst/rotparams.m) =================================================================== --- trunk/octave-forge/main/linear-algebra/inst/rotparams.m (rev 0) +++ trunk/octave-forge/main/linear-algebra/inst/rotparams.m 2010-02-22 07:07:16 UTC (rev 6944) @@ -0,0 +1,71 @@ +## Copyright (C) 2002 Etienne Grossmann. All rights reserved. +## +## This program is free software; you can redistribute it and/or modify it +## under the terms of the GNU General Public License as published by the +## Free Software Foundation; either version 2, or (at your option) any +## later version. +## +## This is distributed in the hope that it will be useful, but WITHOUT +## ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or +## FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License +## for more details. + +## -*- texinfo -*- +## @deftypefn{Function File} {@var{[vstacked, astacked]} = } rotparams ( rstacked ) +## @cindex +## The function w = rotparams (r) - Inverse to rotv(). +## Using, @var{w} = rotparams(@var{r}) is such that +## rotv(w)*r' == eye(3). +## +## If used as, [v,a]=rotparams(r) , idem, with v (1 x 3) s.t. w == a*v. +## +## 0 <= norm(w)==a <= pi +## +## :-O !! Does not check if 'r' is a rotation matrix. +## +## Ignores matrices with zero rows or with NaNs. (returns 0 for them) +## +## @seealso{rotv} +## @end deftypefn + +## Author: Etienne Grossmann <et...@cs...> + +function [vstacked, astacked] = rotparams (rstacked) + +N = size (rstacked,1) / 3; + +## ang = 0 ; +## if length(varargin), +## if strcmp(varargin{1},'ang'), ang = 1; end +## end +ok = all ( ! isnan (rstacked') ) & any ( rstacked' ); +ok = min ( reshape (ok,3,N) ); +ok = find (ok) ; +## keyboard +vstacked = zeros (N,3); +astacked = zeros (N,1); +for j = ok, + r = rstacked(3*j-2:3*j,:); + [v,f] = eig (r); + f = diag(f); + + [m,i] = min (abs (real (f)-1)); + v = v(:,i); + + w = null (v'); + u = w(:,1); + a = u'*r*u; + if a<1, + a = real (acos (u'*r*u)); + else + a = 0; + end + ## Check orientation + x=r*u; + if v'*[0 -u(3) u(2); u(3) 0 -u(1);-u(2) u(1) 0]*x < 0, v=-v; end + + + if nargout <= 1, v = v*a; end + vstacked(j,:) = -v'; + astacked(j) = a; +end Copied: trunk/octave-forge/main/linear-algebra/inst/rotv.m (from rev 6941, trunk/octave-forge/main/miscellaneous/inst/rotv.m) =================================================================== --- trunk/octave-forge/main/linear-algebra/inst/rotv.m (rev 0) +++ trunk/octave-forge/main/linear-algebra/inst/rotv.m 2010-02-22 07:07:16 UTC (rev 6944) @@ -0,0 +1,85 @@ +## Copyright (C) 2002 Etienne Grossmann. All rights reserved. +## +## This program is free software; you can redistribute it and/or modify it +## under the terms of the GNU General Public License as published by the +## Free Software Foundation; either version 2, or (at your option) any +## later version. +## +## This is distributed in the hope that it will be useful, but WITHOUT +## ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or +## FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License +## for more details. +## + +## -*- texinfo -*- +## @deftypefn{Function File} {@var{r} = } rotv ( v, ang ) +## @cindex +## The functionrotv calculates a Matrix of rotation about @var{v} w/ angle |v| +## r = rotv(v [,ang]) +## +## Returns the rotation matrix w/ axis v, and angle, in radians, norm(v) or +## ang (if present). +## +## rotv(v) == w'*w + cos(a) * (eye(3)-w'*w) - sin(a) * crossmat(w) +## +## where a = norm (v) and w = v/a. +## +## v and ang may be vertically stacked : If 'v' is 2x3, then +## rotv( v ) == [rotv(v(1,:)); rotv(v(2,:))] +## +## @example +## +## @end example +## @seealso{rotparams} +## @end deftypefn + +## See also : rota, rot +## + +## Author: Etienne Grossmann <et...@cs...> +## Last modified: Setembro 2002 + +function r = rotv(v ,ang) + +if nargin > 1 + v = v.*((ang(:)./sqrt(sum(v'.^2))')*ones(1,3)); +end +## For checking only +## v00 = v ; +## static toto = floor(rand(1)*100) ; +## toto +a = sqrt(sum(v'.^2))' ; +oka = find(a!=0); +if all(size(oka)), + v(oka,:) = v(oka,:)./(a(oka)*ones(1,3)) ; +end +## ca = cos(a); +## sa = sin(a); + +N = size(v,1) ; N3 = 3*N ; +r = (reshape( v', N3,1 )*ones(1,3)).*kron(v,ones(3,1)) ; +r += kron(cos(a),ones(3,3)) .* (kron(ones(N,1),eye(3))-r) ; + +## kron(cos(a),ones(3,3)) .* (kron(ones(N,1),eye(3))-r0) +## cos(a) + +tmp = zeros(N3,3) ; +tmp( 2:3:N3,1 ) = v(:,3) ; +tmp( 1:3:N3,2 ) = -v(:,3) ; +tmp( 3:3:N3,1 ) = -v(:,2) ; +tmp( 1:3:N3,3 ) = v(:,2) ; +tmp( 2:3:N3,3 ) = -v(:,1) ; +tmp( 3:3:N3,2 ) = v(:,1) ; +## keyboard +r -= kron(sin(a),ones(3)) .* tmp ; + +## For checking only +## r2 = zeros(N3,3) ; +## for i=1:size(v,1), +## v0 = v00(i,:); +## t = norm(v0); +## if t, v0 = v0/t; end; +## r2(3*i-2:3*i,:) = v0'*v0 + cos(t)*(eye(3)-v0'*v0) + -sin(t)*[0, -v0(3), v0(2);v0(3), 0, -v0(1);-v0(2), v0(1), 0]; +## end +## max(abs(r2(:)-r(:))) + Modified: trunk/octave-forge/main/miscellaneous/INDEX =================================================================== --- trunk/octave-forge/main/miscellaneous/INDEX 2010-02-22 07:06:08 UTC (rev 6943) +++ trunk/octave-forge/main/miscellaneous/INDEX 2010-02-22 07:07:16 UTC (rev 6944) @@ -11,8 +11,6 @@ match nze reduce - rotparams - rotv slurp_file units zagzig Deleted: trunk/octave-forge/main/miscellaneous/inst/rotparams.m =================================================================== --- trunk/octave-forge/main/miscellaneous/inst/rotparams.m 2010-02-22 07:06:08 UTC (rev 6943) +++ trunk/octave-forge/main/miscellaneous/inst/rotparams.m 2010-02-22 07:07:16 UTC (rev 6944) @@ -1,71 +0,0 @@ -## Copyright (C) 2002 Etienne Grossmann. All rights reserved. -## -## This program is free software; you can redistribute it and/or modify it -## under the terms of the GNU General Public License as published by the -## Free Software Foundation; either version 2, or (at your option) any -## later version. -## -## This is distributed in the hope that it will be useful, but WITHOUT -## ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or -## FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License -## for more details. - -## -*- texinfo -*- -## @deftypefn{Function File} {@var{[vstacked, astacked]} = } rotparams ( rstacked ) -## @cindex -## The function w = rotparams (r) - Inverse to rotv(). -## Using, @var{w} = rotparams(@var{r}) is such that -## rotv(w)*r' == eye(3). -## -## If used as, [v,a]=rotparams(r) , idem, with v (1 x 3) s.t. w == a*v. -## -## 0 <= norm(w)==a <= pi -## -## :-O !! Does not check if 'r' is a rotation matrix. -## -## Ignores matrices with zero rows or with NaNs. (returns 0 for them) -## -## @seealso{rotv} -## @end deftypefn - -## Author: Etienne Grossmann <et...@cs...> - -function [vstacked, astacked] = rotparams (rstacked) - -N = size (rstacked,1) / 3; - -## ang = 0 ; -## if length(varargin), -## if strcmp(varargin{1},'ang'), ang = 1; end -## end -ok = all ( ! isnan (rstacked') ) & any ( rstacked' ); -ok = min ( reshape (ok,3,N) ); -ok = find (ok) ; -## keyboard -vstacked = zeros (N,3); -astacked = zeros (N,1); -for j = ok, - r = rstacked(3*j-2:3*j,:); - [v,f] = eig (r); - f = diag(f); - - [m,i] = min (abs (real (f)-1)); - v = v(:,i); - - w = null (v'); - u = w(:,1); - a = u'*r*u; - if a<1, - a = real (acos (u'*r*u)); - else - a = 0; - end - ## Check orientation - x=r*u; - if v'*[0 -u(3) u(2); u(3) 0 -u(1);-u(2) u(1) 0]*x < 0, v=-v; end - - - if nargout <= 1, v = v*a; end - vstacked(j,:) = -v'; - astacked(j) = a; -end Deleted: trunk/octave-forge/main/miscellaneous/inst/rotv.m =================================================================== --- trunk/octave-forge/main/miscellaneous/inst/rotv.m 2010-02-22 07:06:08 UTC (rev 6943) +++ trunk/octave-forge/main/miscellaneous/inst/rotv.m 2010-02-22 07:07:16 UTC (rev 6944) @@ -1,85 +0,0 @@ -## Copyright (C) 2002 Etienne Grossmann. All rights reserved. -## -## This program is free software; you can redistribute it and/or modify it -## under the terms of the GNU General Public License as published by the -## Free Software Foundation; either version 2, or (at your option) any -## later version. -## -## This is distributed in the hope that it will be useful, but WITHOUT -## ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or -## FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License -## for more details. -## - -## -*- texinfo -*- -## @deftypefn{Function File} {@var{r} = } rotv ( v, ang ) -## @cindex -## The functionrotv calculates a Matrix of rotation about @var{v} w/ angle |v| -## r = rotv(v [,ang]) -## -## Returns the rotation matrix w/ axis v, and angle, in radians, norm(v) or -## ang (if present). -## -## rotv(v) == w'*w + cos(a) * (eye(3)-w'*w) - sin(a) * crossmat(w) -## -## where a = norm (v) and w = v/a. -## -## v and ang may be vertically stacked : If 'v' is 2x3, then -## rotv( v ) == [rotv(v(1,:)); rotv(v(2,:))] -## -## @example -## -## @end example -## @seealso{rotparams} -## @end deftypefn - -## See also : rota, rot -## - -## Author: Etienne Grossmann <et...@cs...> -## Last modified: Setembro 2002 - -function r = rotv(v ,ang) - -if nargin > 1 - v = v.*((ang(:)./sqrt(sum(v'.^2))')*ones(1,3)); -end -## For checking only -## v00 = v ; -## static toto = floor(rand(1)*100) ; -## toto -a = sqrt(sum(v'.^2))' ; -oka = find(a!=0); -if all(size(oka)), - v(oka,:) = v(oka,:)./(a(oka)*ones(1,3)) ; -end -## ca = cos(a); -## sa = sin(a); - -N = size(v,1) ; N3 = 3*N ; -r = (reshape( v', N3,1 )*ones(1,3)).*kron(v,ones(3,1)) ; -r += kron(cos(a),ones(3,3)) .* (kron(ones(N,1),eye(3))-r) ; - -## kron(cos(a),ones(3,3)) .* (kron(ones(N,1),eye(3))-r0) -## cos(a) - -tmp = zeros(N3,3) ; -tmp( 2:3:N3,1 ) = v(:,3) ; -tmp( 1:3:N3,2 ) = -v(:,3) ; -tmp( 3:3:N3,1 ) = -v(:,2) ; -tmp( 1:3:N3,3 ) = v(:,2) ; -tmp( 2:3:N3,3 ) = -v(:,1) ; -tmp( 3:3:N3,2 ) = v(:,1) ; -## keyboard -r -= kron(sin(a),ones(3)) .* tmp ; - -## For checking only -## r2 = zeros(N3,3) ; -## for i=1:size(v,1), -## v0 = v00(i,:); -## t = norm(v0); -## if t, v0 = v0/t; end; -## r2(3*i-2:3*i,:) = v0'*v0 + cos(t)*(eye(3)-v0'*v0) + -sin(t)*[0, -v0(3), v0(2);v0(3), 0, -v0(1);-v0(2), v0(1), 0]; -## end -## max(abs(r2(:)-r(:))) - This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |