X-Git-Url: https://git.creatis.insa-lyon.fr/pubgit/?a=blobdiff_plain;ds=sidebyside;f=octave_packages%2Fm%2Flinear-algebra%2Forth.m;fp=octave_packages%2Fm%2Flinear-algebra%2Forth.m;h=94cdb40c2d46de9f09ecad938ddd75e7fad9fb05;hb=1c0469ada9531828709108a4882a751d2816994a;hp=0000000000000000000000000000000000000000;hpb=63de9f36673d49121015e3695f2c336ea92bc278;p=CreaPhase.git diff --git a/octave_packages/m/linear-algebra/orth.m b/octave_packages/m/linear-algebra/orth.m new file mode 100644 index 0000000..94cdb40 --- /dev/null +++ b/octave_packages/m/linear-algebra/orth.m @@ -0,0 +1,90 @@ +## Copyright (C) 1994-2012 John W. Eaton +## +## This file is part of Octave. +## +## Octave 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 3 of the License, or (at +## your option) any later version. +## +## Octave 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. +## +## You should have received a copy of the GNU General Public License +## along with Octave; see the file COPYING. If not, see +## . + +## -*- texinfo -*- +## @deftypefn {Function File} {} orth (@var{A}) +## @deftypefnx {Function File} {} orth (@var{A}, @var{tol}) +## Return an orthonormal basis of the range space of @var{A}. +## +## The dimension of the range space is taken as the number of singular +## values of @var{A} greater than @var{tol}. If the argument @var{tol} is +## missing, it is computed as +## +## @example +## max (size (@var{A})) * max (svd (@var{A})) * eps +## @end example +## @seealso{null} +## @end deftypefn + +## Author: KH +## Created: 24 December 1993. +## Adapted-By: jwe + +function retval = orth (A, tol) + + if (nargin == 1 || nargin == 2) + + if (isempty (A)) + retval = []; + return; + endif + + [U, S, V] = svd (A); + + [rows, cols] = size (A); + + [S_nr, S_nc] = size (S); + + if (S_nr == 1 || S_nc == 1) + s = S(1); + else + s = diag (S); + endif + + if (nargin == 1) + if (isa (A, "single")) + tol = max (size (A)) * s (1) * eps ("single"); + else + tol = max (size (A)) * s (1) * eps; + endif + endif + + rank = sum (s > tol); + + if (rank > 0) + retval = -U (:, 1:rank); + else + retval = zeros (rows, 0); + endif + + else + + print_usage (); + + endif + +endfunction + +%!test +%! for ii=1:20 +%! A = rand (10, 10); +%! V = orth (A); +%! if (det (A) != 0) +%! assert (V'*V, eye (10), 100*eps) +%! endif +%! endfor