diff scripts/linear-algebra/subspace.m @ 7611:4f903c303c3c

implement subspace function
author Jaroslav Hajek <highegg@gmail.com>
date Wed, 19 Mar 2008 21:22:20 -0400
parents
children c1702f963a5e
line wrap: on
line diff
new file mode 100644
--- /dev/null
+++ b/scripts/linear-algebra/subspace.m
@@ -0,0 +1,53 @@
+## Copyright (C) 2008 VZLU Prague, a.s., Czech Republic
+##
+## 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
+## <http://www.gnu.org/licenses/>.
+
+## -*- texinfo -*-
+## @deftypefn {Function File} {@var{angle} =} subspace (@var{a}, @var{B})
+## Determine the largest principal angle between two subspaces
+## spanned by columns of matrices @var{a} and @var{b}.
+## @end deftypefn
+
+## Author: Jaroslav Hajek <highegg@gmail.com>
+
+## reference:
+## [1]  Andrew V. Knyazev, Merico E. Argentati:
+##   Principal Angles between Subspaces in an A-Based Scalar Product: 
+##  Algorithms and Perturbation Estimates.  
+##  SIAM Journal on Scientific Computing, Vol. 23 no. 6, pp. 2008-2040
+##
+## other texts are also around...
+
+function ang = subspace (a, b)
+
+  a = orth (a);
+  b = orth (b);
+  c = a'*b;
+  scos = min (svd (c));
+  if (scos^2 > 1/2)
+    if (columns (a) >= columns (b))
+      c = b - a*c;
+    else
+      c = a - b*c';
+    endif
+    ssin = max (svd (c));
+    ang = asin (min (ssin, 1));
+  else
+    ang = acos (scos);
+  endif
+
+endfunction