Mercurial > octave
annotate libinterp/corefcn/gsvd.cc @ 22237:867b177af1fe
gsvd: replace deprecated gripe_wrong_type_arg with err_wrong_type_arg.
author | Carnë Draug <carandraug@octave.org> |
---|---|
date | Tue, 09 Aug 2016 21:34:53 +0100 |
parents | 065a44375723 |
children | dfb49a84c0e4 |
rev | line source |
---|---|
22235
63b41167ef1e
gsvd: new function imported from Octave-Forge linear-algebra package.
Barbara Locsi <locsi.barbara@gmail.com>
parents:
diff
changeset
|
1 // Copyright (C) 1996, 1997 John W. Eaton |
63b41167ef1e
gsvd: new function imported from Octave-Forge linear-algebra package.
Barbara Locsi <locsi.barbara@gmail.com>
parents:
diff
changeset
|
2 // Copyright (C) 2006, 2010 Pascal Dupuis <Pascal.Dupuis@uclouvain.be> |
22236
065a44375723
gsvd: reduce code duplication with templates.
Barbara Locsi <locsi.barbara@gmail.com>
parents:
22235
diff
changeset
|
3 // Copyright (C) 2016 Barbara Lócsi |
22235
63b41167ef1e
gsvd: new function imported from Octave-Forge linear-algebra package.
Barbara Locsi <locsi.barbara@gmail.com>
parents:
diff
changeset
|
4 // |
63b41167ef1e
gsvd: new function imported from Octave-Forge linear-algebra package.
Barbara Locsi <locsi.barbara@gmail.com>
parents:
diff
changeset
|
5 // This program is free software; you can redistribute it and/or modify it under |
63b41167ef1e
gsvd: new function imported from Octave-Forge linear-algebra package.
Barbara Locsi <locsi.barbara@gmail.com>
parents:
diff
changeset
|
6 // the terms of the GNU General Public License as published by the Free Software |
63b41167ef1e
gsvd: new function imported from Octave-Forge linear-algebra package.
Barbara Locsi <locsi.barbara@gmail.com>
parents:
diff
changeset
|
7 // Foundation; either version 3 of the License, or (at your option) any later |
63b41167ef1e
gsvd: new function imported from Octave-Forge linear-algebra package.
Barbara Locsi <locsi.barbara@gmail.com>
parents:
diff
changeset
|
8 // version. |
63b41167ef1e
gsvd: new function imported from Octave-Forge linear-algebra package.
Barbara Locsi <locsi.barbara@gmail.com>
parents:
diff
changeset
|
9 // |
63b41167ef1e
gsvd: new function imported from Octave-Forge linear-algebra package.
Barbara Locsi <locsi.barbara@gmail.com>
parents:
diff
changeset
|
10 // This program is distributed in the hope that it will be useful, but WITHOUT |
63b41167ef1e
gsvd: new function imported from Octave-Forge linear-algebra package.
Barbara Locsi <locsi.barbara@gmail.com>
parents:
diff
changeset
|
11 // ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or |
63b41167ef1e
gsvd: new function imported from Octave-Forge linear-algebra package.
Barbara Locsi <locsi.barbara@gmail.com>
parents:
diff
changeset
|
12 // FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more |
63b41167ef1e
gsvd: new function imported from Octave-Forge linear-algebra package.
Barbara Locsi <locsi.barbara@gmail.com>
parents:
diff
changeset
|
13 // details. |
63b41167ef1e
gsvd: new function imported from Octave-Forge linear-algebra package.
Barbara Locsi <locsi.barbara@gmail.com>
parents:
diff
changeset
|
14 // |
63b41167ef1e
gsvd: new function imported from Octave-Forge linear-algebra package.
Barbara Locsi <locsi.barbara@gmail.com>
parents:
diff
changeset
|
15 // You should have received a copy of the GNU General Public License along with |
63b41167ef1e
gsvd: new function imported from Octave-Forge linear-algebra package.
Barbara Locsi <locsi.barbara@gmail.com>
parents:
diff
changeset
|
16 // this program; if not, see <http://www.gnu.org/licenses/>. |
63b41167ef1e
gsvd: new function imported from Octave-Forge linear-algebra package.
Barbara Locsi <locsi.barbara@gmail.com>
parents:
diff
changeset
|
17 |
63b41167ef1e
gsvd: new function imported from Octave-Forge linear-algebra package.
Barbara Locsi <locsi.barbara@gmail.com>
parents:
diff
changeset
|
18 #ifdef HAVE_CONFIG_H |
63b41167ef1e
gsvd: new function imported from Octave-Forge linear-algebra package.
Barbara Locsi <locsi.barbara@gmail.com>
parents:
diff
changeset
|
19 # include <config.h> |
63b41167ef1e
gsvd: new function imported from Octave-Forge linear-algebra package.
Barbara Locsi <locsi.barbara@gmail.com>
parents:
diff
changeset
|
20 #endif |
63b41167ef1e
gsvd: new function imported from Octave-Forge linear-algebra package.
Barbara Locsi <locsi.barbara@gmail.com>
parents:
diff
changeset
|
21 |
63b41167ef1e
gsvd: new function imported from Octave-Forge linear-algebra package.
Barbara Locsi <locsi.barbara@gmail.com>
parents:
diff
changeset
|
22 #include "defun.h" |
63b41167ef1e
gsvd: new function imported from Octave-Forge linear-algebra package.
Barbara Locsi <locsi.barbara@gmail.com>
parents:
diff
changeset
|
23 #include "error.h" |
63b41167ef1e
gsvd: new function imported from Octave-Forge linear-algebra package.
Barbara Locsi <locsi.barbara@gmail.com>
parents:
diff
changeset
|
24 #include "gripes.h" |
63b41167ef1e
gsvd: new function imported from Octave-Forge linear-algebra package.
Barbara Locsi <locsi.barbara@gmail.com>
parents:
diff
changeset
|
25 #include "pr-output.h" |
63b41167ef1e
gsvd: new function imported from Octave-Forge linear-algebra package.
Barbara Locsi <locsi.barbara@gmail.com>
parents:
diff
changeset
|
26 #include "utils.h" |
63b41167ef1e
gsvd: new function imported from Octave-Forge linear-algebra package.
Barbara Locsi <locsi.barbara@gmail.com>
parents:
diff
changeset
|
27 #include "ovl.h" |
63b41167ef1e
gsvd: new function imported from Octave-Forge linear-algebra package.
Barbara Locsi <locsi.barbara@gmail.com>
parents:
diff
changeset
|
28 |
22236
065a44375723
gsvd: reduce code duplication with templates.
Barbara Locsi <locsi.barbara@gmail.com>
parents:
22235
diff
changeset
|
29 #include "gsvd.h" |
065a44375723
gsvd: reduce code duplication with templates.
Barbara Locsi <locsi.barbara@gmail.com>
parents:
22235
diff
changeset
|
30 |
065a44375723
gsvd: reduce code duplication with templates.
Barbara Locsi <locsi.barbara@gmail.com>
parents:
22235
diff
changeset
|
31 template <typename T> |
065a44375723
gsvd: reduce code duplication with templates.
Barbara Locsi <locsi.barbara@gmail.com>
parents:
22235
diff
changeset
|
32 static typename gsvd<T>::Type |
065a44375723
gsvd: reduce code duplication with templates.
Barbara Locsi <locsi.barbara@gmail.com>
parents:
22235
diff
changeset
|
33 gsvd_type (int nargout) |
065a44375723
gsvd: reduce code duplication with templates.
Barbara Locsi <locsi.barbara@gmail.com>
parents:
22235
diff
changeset
|
34 { |
065a44375723
gsvd: reduce code duplication with templates.
Barbara Locsi <locsi.barbara@gmail.com>
parents:
22235
diff
changeset
|
35 return ((nargout == 0 || nargout == 1) |
065a44375723
gsvd: reduce code duplication with templates.
Barbara Locsi <locsi.barbara@gmail.com>
parents:
22235
diff
changeset
|
36 ? gsvd<T>::Type::sigma_only |
065a44375723
gsvd: reduce code duplication with templates.
Barbara Locsi <locsi.barbara@gmail.com>
parents:
22235
diff
changeset
|
37 : (nargout > 5) ? gsvd<T>::Type::std : gsvd<T>::Type::economy); |
065a44375723
gsvd: reduce code duplication with templates.
Barbara Locsi <locsi.barbara@gmail.com>
parents:
22235
diff
changeset
|
38 } |
065a44375723
gsvd: reduce code duplication with templates.
Barbara Locsi <locsi.barbara@gmail.com>
parents:
22235
diff
changeset
|
39 |
22235
63b41167ef1e
gsvd: new function imported from Octave-Forge linear-algebra package.
Barbara Locsi <locsi.barbara@gmail.com>
parents:
diff
changeset
|
40 |
63b41167ef1e
gsvd: new function imported from Octave-Forge linear-algebra package.
Barbara Locsi <locsi.barbara@gmail.com>
parents:
diff
changeset
|
41 DEFUN (gsvd, args, nargout, |
63b41167ef1e
gsvd: new function imported from Octave-Forge linear-algebra package.
Barbara Locsi <locsi.barbara@gmail.com>
parents:
diff
changeset
|
42 doc: /* -*- texinfo -*- |
63b41167ef1e
gsvd: new function imported from Octave-Forge linear-algebra package.
Barbara Locsi <locsi.barbara@gmail.com>
parents:
diff
changeset
|
43 @deftypefn {Loadable Function} {@var{s} =} gsvd (@var{a}, @var{b}) |
63b41167ef1e
gsvd: new function imported from Octave-Forge linear-algebra package.
Barbara Locsi <locsi.barbara@gmail.com>
parents:
diff
changeset
|
44 @deftypefnx {Loadable Function} {[@var{u}, @var{v}, @var{c}, @var{s}, @var{x} [, @var{r}]] =} gsvd (@var{a}, @var{b}) |
63b41167ef1e
gsvd: new function imported from Octave-Forge linear-algebra package.
Barbara Locsi <locsi.barbara@gmail.com>
parents:
diff
changeset
|
45 @cindex generalised singular value decomposition |
63b41167ef1e
gsvd: new function imported from Octave-Forge linear-algebra package.
Barbara Locsi <locsi.barbara@gmail.com>
parents:
diff
changeset
|
46 Compute the generalised singular value decomposition of (@var{a}, @var{b}): |
63b41167ef1e
gsvd: new function imported from Octave-Forge linear-algebra package.
Barbara Locsi <locsi.barbara@gmail.com>
parents:
diff
changeset
|
47 @iftex |
63b41167ef1e
gsvd: new function imported from Octave-Forge linear-algebra package.
Barbara Locsi <locsi.barbara@gmail.com>
parents:
diff
changeset
|
48 @tex |
63b41167ef1e
gsvd: new function imported from Octave-Forge linear-algebra package.
Barbara Locsi <locsi.barbara@gmail.com>
parents:
diff
changeset
|
49 $$ |
63b41167ef1e
gsvd: new function imported from Octave-Forge linear-algebra package.
Barbara Locsi <locsi.barbara@gmail.com>
parents:
diff
changeset
|
50 U^H A X = [I 0; 0 C] [0 R] |
63b41167ef1e
gsvd: new function imported from Octave-Forge linear-algebra package.
Barbara Locsi <locsi.barbara@gmail.com>
parents:
diff
changeset
|
51 V^H B X = [0 S; 0 0] [0 R] |
63b41167ef1e
gsvd: new function imported from Octave-Forge linear-algebra package.
Barbara Locsi <locsi.barbara@gmail.com>
parents:
diff
changeset
|
52 C*C + S*S = eye(columns(A)) |
63b41167ef1e
gsvd: new function imported from Octave-Forge linear-algebra package.
Barbara Locsi <locsi.barbara@gmail.com>
parents:
diff
changeset
|
53 I and 0 are padding matrices of suitable size |
63b41167ef1e
gsvd: new function imported from Octave-Forge linear-algebra package.
Barbara Locsi <locsi.barbara@gmail.com>
parents:
diff
changeset
|
54 R is upper triangular |
63b41167ef1e
gsvd: new function imported from Octave-Forge linear-algebra package.
Barbara Locsi <locsi.barbara@gmail.com>
parents:
diff
changeset
|
55 $$ |
63b41167ef1e
gsvd: new function imported from Octave-Forge linear-algebra package.
Barbara Locsi <locsi.barbara@gmail.com>
parents:
diff
changeset
|
56 @end tex |
63b41167ef1e
gsvd: new function imported from Octave-Forge linear-algebra package.
Barbara Locsi <locsi.barbara@gmail.com>
parents:
diff
changeset
|
57 @end iftex |
63b41167ef1e
gsvd: new function imported from Octave-Forge linear-algebra package.
Barbara Locsi <locsi.barbara@gmail.com>
parents:
diff
changeset
|
58 @ifinfo |
63b41167ef1e
gsvd: new function imported from Octave-Forge linear-algebra package.
Barbara Locsi <locsi.barbara@gmail.com>
parents:
diff
changeset
|
59 |
63b41167ef1e
gsvd: new function imported from Octave-Forge linear-algebra package.
Barbara Locsi <locsi.barbara@gmail.com>
parents:
diff
changeset
|
60 @example |
63b41167ef1e
gsvd: new function imported from Octave-Forge linear-algebra package.
Barbara Locsi <locsi.barbara@gmail.com>
parents:
diff
changeset
|
61 u' * a * x = [I 0; 0 c] * [0 r] |
63b41167ef1e
gsvd: new function imported from Octave-Forge linear-algebra package.
Barbara Locsi <locsi.barbara@gmail.com>
parents:
diff
changeset
|
62 v' * b * x = [0 s; 0 0] * [0 r] |
63b41167ef1e
gsvd: new function imported from Octave-Forge linear-algebra package.
Barbara Locsi <locsi.barbara@gmail.com>
parents:
diff
changeset
|
63 c * c + s * s = eye(columns(a)) |
63b41167ef1e
gsvd: new function imported from Octave-Forge linear-algebra package.
Barbara Locsi <locsi.barbara@gmail.com>
parents:
diff
changeset
|
64 I and 0 are padding matrices of suitable size |
63b41167ef1e
gsvd: new function imported from Octave-Forge linear-algebra package.
Barbara Locsi <locsi.barbara@gmail.com>
parents:
diff
changeset
|
65 r is upper triangular |
63b41167ef1e
gsvd: new function imported from Octave-Forge linear-algebra package.
Barbara Locsi <locsi.barbara@gmail.com>
parents:
diff
changeset
|
66 @end example |
63b41167ef1e
gsvd: new function imported from Octave-Forge linear-algebra package.
Barbara Locsi <locsi.barbara@gmail.com>
parents:
diff
changeset
|
67 @end ifinfo |
63b41167ef1e
gsvd: new function imported from Octave-Forge linear-algebra package.
Barbara Locsi <locsi.barbara@gmail.com>
parents:
diff
changeset
|
68 |
63b41167ef1e
gsvd: new function imported from Octave-Forge linear-algebra package.
Barbara Locsi <locsi.barbara@gmail.com>
parents:
diff
changeset
|
69 The function @code{gsvd} normally returns the vector of generalised singular |
63b41167ef1e
gsvd: new function imported from Octave-Forge linear-algebra package.
Barbara Locsi <locsi.barbara@gmail.com>
parents:
diff
changeset
|
70 values |
63b41167ef1e
gsvd: new function imported from Octave-Forge linear-algebra package.
Barbara Locsi <locsi.barbara@gmail.com>
parents:
diff
changeset
|
71 @iftex |
63b41167ef1e
gsvd: new function imported from Octave-Forge linear-algebra package.
Barbara Locsi <locsi.barbara@gmail.com>
parents:
diff
changeset
|
72 @tex |
63b41167ef1e
gsvd: new function imported from Octave-Forge linear-algebra package.
Barbara Locsi <locsi.barbara@gmail.com>
parents:
diff
changeset
|
73 diag(C)./diag(S). |
63b41167ef1e
gsvd: new function imported from Octave-Forge linear-algebra package.
Barbara Locsi <locsi.barbara@gmail.com>
parents:
diff
changeset
|
74 @end tex |
63b41167ef1e
gsvd: new function imported from Octave-Forge linear-algebra package.
Barbara Locsi <locsi.barbara@gmail.com>
parents:
diff
changeset
|
75 @end iftex |
63b41167ef1e
gsvd: new function imported from Octave-Forge linear-algebra package.
Barbara Locsi <locsi.barbara@gmail.com>
parents:
diff
changeset
|
76 @ifinfo |
63b41167ef1e
gsvd: new function imported from Octave-Forge linear-algebra package.
Barbara Locsi <locsi.barbara@gmail.com>
parents:
diff
changeset
|
77 diag(r)./diag(s). |
63b41167ef1e
gsvd: new function imported from Octave-Forge linear-algebra package.
Barbara Locsi <locsi.barbara@gmail.com>
parents:
diff
changeset
|
78 @end ifinfo |
63b41167ef1e
gsvd: new function imported from Octave-Forge linear-algebra package.
Barbara Locsi <locsi.barbara@gmail.com>
parents:
diff
changeset
|
79 If asked for five return values, it computes |
63b41167ef1e
gsvd: new function imported from Octave-Forge linear-algebra package.
Barbara Locsi <locsi.barbara@gmail.com>
parents:
diff
changeset
|
80 @iftex |
63b41167ef1e
gsvd: new function imported from Octave-Forge linear-algebra package.
Barbara Locsi <locsi.barbara@gmail.com>
parents:
diff
changeset
|
81 @tex |
63b41167ef1e
gsvd: new function imported from Octave-Forge linear-algebra package.
Barbara Locsi <locsi.barbara@gmail.com>
parents:
diff
changeset
|
82 $U$, $V$, and $X$. |
63b41167ef1e
gsvd: new function imported from Octave-Forge linear-algebra package.
Barbara Locsi <locsi.barbara@gmail.com>
parents:
diff
changeset
|
83 @end tex |
63b41167ef1e
gsvd: new function imported from Octave-Forge linear-algebra package.
Barbara Locsi <locsi.barbara@gmail.com>
parents:
diff
changeset
|
84 @end iftex |
63b41167ef1e
gsvd: new function imported from Octave-Forge linear-algebra package.
Barbara Locsi <locsi.barbara@gmail.com>
parents:
diff
changeset
|
85 @ifinfo |
63b41167ef1e
gsvd: new function imported from Octave-Forge linear-algebra package.
Barbara Locsi <locsi.barbara@gmail.com>
parents:
diff
changeset
|
86 U, V, and X. |
63b41167ef1e
gsvd: new function imported from Octave-Forge linear-algebra package.
Barbara Locsi <locsi.barbara@gmail.com>
parents:
diff
changeset
|
87 @end ifinfo |
63b41167ef1e
gsvd: new function imported from Octave-Forge linear-algebra package.
Barbara Locsi <locsi.barbara@gmail.com>
parents:
diff
changeset
|
88 With a sixth output argument, it also returns |
63b41167ef1e
gsvd: new function imported from Octave-Forge linear-algebra package.
Barbara Locsi <locsi.barbara@gmail.com>
parents:
diff
changeset
|
89 @iftex |
63b41167ef1e
gsvd: new function imported from Octave-Forge linear-algebra package.
Barbara Locsi <locsi.barbara@gmail.com>
parents:
diff
changeset
|
90 @tex |
63b41167ef1e
gsvd: new function imported from Octave-Forge linear-algebra package.
Barbara Locsi <locsi.barbara@gmail.com>
parents:
diff
changeset
|
91 R, |
63b41167ef1e
gsvd: new function imported from Octave-Forge linear-algebra package.
Barbara Locsi <locsi.barbara@gmail.com>
parents:
diff
changeset
|
92 @end tex |
63b41167ef1e
gsvd: new function imported from Octave-Forge linear-algebra package.
Barbara Locsi <locsi.barbara@gmail.com>
parents:
diff
changeset
|
93 @end iftex |
63b41167ef1e
gsvd: new function imported from Octave-Forge linear-algebra package.
Barbara Locsi <locsi.barbara@gmail.com>
parents:
diff
changeset
|
94 @ifinfo |
63b41167ef1e
gsvd: new function imported from Octave-Forge linear-algebra package.
Barbara Locsi <locsi.barbara@gmail.com>
parents:
diff
changeset
|
95 r, |
63b41167ef1e
gsvd: new function imported from Octave-Forge linear-algebra package.
Barbara Locsi <locsi.barbara@gmail.com>
parents:
diff
changeset
|
96 @end ifinfo |
63b41167ef1e
gsvd: new function imported from Octave-Forge linear-algebra package.
Barbara Locsi <locsi.barbara@gmail.com>
parents:
diff
changeset
|
97 The common upper triangular right term. Other authors, like S. Van Huffel, |
63b41167ef1e
gsvd: new function imported from Octave-Forge linear-algebra package.
Barbara Locsi <locsi.barbara@gmail.com>
parents:
diff
changeset
|
98 define this transformation as the simulatenous diagonalisation of the |
22236
065a44375723
gsvd: reduce code duplication with templates.
Barbara Locsi <locsi.barbara@gmail.com>
parents:
22235
diff
changeset
|
99 input matrices, this can be achieved by multiplying |
22235
63b41167ef1e
gsvd: new function imported from Octave-Forge linear-algebra package.
Barbara Locsi <locsi.barbara@gmail.com>
parents:
diff
changeset
|
100 @iftex |
63b41167ef1e
gsvd: new function imported from Octave-Forge linear-algebra package.
Barbara Locsi <locsi.barbara@gmail.com>
parents:
diff
changeset
|
101 @tex |
63b41167ef1e
gsvd: new function imported from Octave-Forge linear-algebra package.
Barbara Locsi <locsi.barbara@gmail.com>
parents:
diff
changeset
|
102 X |
63b41167ef1e
gsvd: new function imported from Octave-Forge linear-algebra package.
Barbara Locsi <locsi.barbara@gmail.com>
parents:
diff
changeset
|
103 @end tex |
63b41167ef1e
gsvd: new function imported from Octave-Forge linear-algebra package.
Barbara Locsi <locsi.barbara@gmail.com>
parents:
diff
changeset
|
104 @end iftex |
63b41167ef1e
gsvd: new function imported from Octave-Forge linear-algebra package.
Barbara Locsi <locsi.barbara@gmail.com>
parents:
diff
changeset
|
105 @ifinfo |
63b41167ef1e
gsvd: new function imported from Octave-Forge linear-algebra package.
Barbara Locsi <locsi.barbara@gmail.com>
parents:
diff
changeset
|
106 x |
63b41167ef1e
gsvd: new function imported from Octave-Forge linear-algebra package.
Barbara Locsi <locsi.barbara@gmail.com>
parents:
diff
changeset
|
107 @end ifinfo |
63b41167ef1e
gsvd: new function imported from Octave-Forge linear-algebra package.
Barbara Locsi <locsi.barbara@gmail.com>
parents:
diff
changeset
|
108 by the inverse of |
63b41167ef1e
gsvd: new function imported from Octave-Forge linear-algebra package.
Barbara Locsi <locsi.barbara@gmail.com>
parents:
diff
changeset
|
109 @iftex |
63b41167ef1e
gsvd: new function imported from Octave-Forge linear-algebra package.
Barbara Locsi <locsi.barbara@gmail.com>
parents:
diff
changeset
|
110 @tex |
63b41167ef1e
gsvd: new function imported from Octave-Forge linear-algebra package.
Barbara Locsi <locsi.barbara@gmail.com>
parents:
diff
changeset
|
111 [I 0; 0 R]. |
63b41167ef1e
gsvd: new function imported from Octave-Forge linear-algebra package.
Barbara Locsi <locsi.barbara@gmail.com>
parents:
diff
changeset
|
112 @end tex |
63b41167ef1e
gsvd: new function imported from Octave-Forge linear-algebra package.
Barbara Locsi <locsi.barbara@gmail.com>
parents:
diff
changeset
|
113 @end iftex |
63b41167ef1e
gsvd: new function imported from Octave-Forge linear-algebra package.
Barbara Locsi <locsi.barbara@gmail.com>
parents:
diff
changeset
|
114 @ifinfo |
63b41167ef1e
gsvd: new function imported from Octave-Forge linear-algebra package.
Barbara Locsi <locsi.barbara@gmail.com>
parents:
diff
changeset
|
115 [I 0; 0 r]. |
63b41167ef1e
gsvd: new function imported from Octave-Forge linear-algebra package.
Barbara Locsi <locsi.barbara@gmail.com>
parents:
diff
changeset
|
116 @end ifinfo |
63b41167ef1e
gsvd: new function imported from Octave-Forge linear-algebra package.
Barbara Locsi <locsi.barbara@gmail.com>
parents:
diff
changeset
|
117 |
63b41167ef1e
gsvd: new function imported from Octave-Forge linear-algebra package.
Barbara Locsi <locsi.barbara@gmail.com>
parents:
diff
changeset
|
118 For example, |
63b41167ef1e
gsvd: new function imported from Octave-Forge linear-algebra package.
Barbara Locsi <locsi.barbara@gmail.com>
parents:
diff
changeset
|
119 |
63b41167ef1e
gsvd: new function imported from Octave-Forge linear-algebra package.
Barbara Locsi <locsi.barbara@gmail.com>
parents:
diff
changeset
|
120 @example |
63b41167ef1e
gsvd: new function imported from Octave-Forge linear-algebra package.
Barbara Locsi <locsi.barbara@gmail.com>
parents:
diff
changeset
|
121 gsvd (hilb (3), [1 2 3; 3 2 1]) |
63b41167ef1e
gsvd: new function imported from Octave-Forge linear-algebra package.
Barbara Locsi <locsi.barbara@gmail.com>
parents:
diff
changeset
|
122 @end example |
63b41167ef1e
gsvd: new function imported from Octave-Forge linear-algebra package.
Barbara Locsi <locsi.barbara@gmail.com>
parents:
diff
changeset
|
123 |
63b41167ef1e
gsvd: new function imported from Octave-Forge linear-algebra package.
Barbara Locsi <locsi.barbara@gmail.com>
parents:
diff
changeset
|
124 @noindent |
63b41167ef1e
gsvd: new function imported from Octave-Forge linear-algebra package.
Barbara Locsi <locsi.barbara@gmail.com>
parents:
diff
changeset
|
125 returns |
63b41167ef1e
gsvd: new function imported from Octave-Forge linear-algebra package.
Barbara Locsi <locsi.barbara@gmail.com>
parents:
diff
changeset
|
126 |
63b41167ef1e
gsvd: new function imported from Octave-Forge linear-algebra package.
Barbara Locsi <locsi.barbara@gmail.com>
parents:
diff
changeset
|
127 @example |
63b41167ef1e
gsvd: new function imported from Octave-Forge linear-algebra package.
Barbara Locsi <locsi.barbara@gmail.com>
parents:
diff
changeset
|
128 ans = |
63b41167ef1e
gsvd: new function imported from Octave-Forge linear-algebra package.
Barbara Locsi <locsi.barbara@gmail.com>
parents:
diff
changeset
|
129 |
63b41167ef1e
gsvd: new function imported from Octave-Forge linear-algebra package.
Barbara Locsi <locsi.barbara@gmail.com>
parents:
diff
changeset
|
130 0.1055705 |
63b41167ef1e
gsvd: new function imported from Octave-Forge linear-algebra package.
Barbara Locsi <locsi.barbara@gmail.com>
parents:
diff
changeset
|
131 0.0031759 |
63b41167ef1e
gsvd: new function imported from Octave-Forge linear-algebra package.
Barbara Locsi <locsi.barbara@gmail.com>
parents:
diff
changeset
|
132 @end example |
63b41167ef1e
gsvd: new function imported from Octave-Forge linear-algebra package.
Barbara Locsi <locsi.barbara@gmail.com>
parents:
diff
changeset
|
133 |
63b41167ef1e
gsvd: new function imported from Octave-Forge linear-algebra package.
Barbara Locsi <locsi.barbara@gmail.com>
parents:
diff
changeset
|
134 @noindent |
63b41167ef1e
gsvd: new function imported from Octave-Forge linear-algebra package.
Barbara Locsi <locsi.barbara@gmail.com>
parents:
diff
changeset
|
135 and |
63b41167ef1e
gsvd: new function imported from Octave-Forge linear-algebra package.
Barbara Locsi <locsi.barbara@gmail.com>
parents:
diff
changeset
|
136 |
63b41167ef1e
gsvd: new function imported from Octave-Forge linear-algebra package.
Barbara Locsi <locsi.barbara@gmail.com>
parents:
diff
changeset
|
137 @example |
63b41167ef1e
gsvd: new function imported from Octave-Forge linear-algebra package.
Barbara Locsi <locsi.barbara@gmail.com>
parents:
diff
changeset
|
138 [u, v, c, s, x, r] = gsvd (hilb (3), [1 2 3; 3 2 1]) |
63b41167ef1e
gsvd: new function imported from Octave-Forge linear-algebra package.
Barbara Locsi <locsi.barbara@gmail.com>
parents:
diff
changeset
|
139 @end example |
63b41167ef1e
gsvd: new function imported from Octave-Forge linear-algebra package.
Barbara Locsi <locsi.barbara@gmail.com>
parents:
diff
changeset
|
140 |
63b41167ef1e
gsvd: new function imported from Octave-Forge linear-algebra package.
Barbara Locsi <locsi.barbara@gmail.com>
parents:
diff
changeset
|
141 @noindent |
63b41167ef1e
gsvd: new function imported from Octave-Forge linear-algebra package.
Barbara Locsi <locsi.barbara@gmail.com>
parents:
diff
changeset
|
142 returns |
63b41167ef1e
gsvd: new function imported from Octave-Forge linear-algebra package.
Barbara Locsi <locsi.barbara@gmail.com>
parents:
diff
changeset
|
143 |
63b41167ef1e
gsvd: new function imported from Octave-Forge linear-algebra package.
Barbara Locsi <locsi.barbara@gmail.com>
parents:
diff
changeset
|
144 @example |
63b41167ef1e
gsvd: new function imported from Octave-Forge linear-algebra package.
Barbara Locsi <locsi.barbara@gmail.com>
parents:
diff
changeset
|
145 u = |
63b41167ef1e
gsvd: new function imported from Octave-Forge linear-algebra package.
Barbara Locsi <locsi.barbara@gmail.com>
parents:
diff
changeset
|
146 |
63b41167ef1e
gsvd: new function imported from Octave-Forge linear-algebra package.
Barbara Locsi <locsi.barbara@gmail.com>
parents:
diff
changeset
|
147 -0.965609 0.240893 0.097825 |
63b41167ef1e
gsvd: new function imported from Octave-Forge linear-algebra package.
Barbara Locsi <locsi.barbara@gmail.com>
parents:
diff
changeset
|
148 -0.241402 -0.690927 -0.681429 |
63b41167ef1e
gsvd: new function imported from Octave-Forge linear-algebra package.
Barbara Locsi <locsi.barbara@gmail.com>
parents:
diff
changeset
|
149 -0.096561 -0.681609 0.725317 |
63b41167ef1e
gsvd: new function imported from Octave-Forge linear-algebra package.
Barbara Locsi <locsi.barbara@gmail.com>
parents:
diff
changeset
|
150 |
63b41167ef1e
gsvd: new function imported from Octave-Forge linear-algebra package.
Barbara Locsi <locsi.barbara@gmail.com>
parents:
diff
changeset
|
151 v = |
63b41167ef1e
gsvd: new function imported from Octave-Forge linear-algebra package.
Barbara Locsi <locsi.barbara@gmail.com>
parents:
diff
changeset
|
152 |
63b41167ef1e
gsvd: new function imported from Octave-Forge linear-algebra package.
Barbara Locsi <locsi.barbara@gmail.com>
parents:
diff
changeset
|
153 -0.41974 0.90765 |
63b41167ef1e
gsvd: new function imported from Octave-Forge linear-algebra package.
Barbara Locsi <locsi.barbara@gmail.com>
parents:
diff
changeset
|
154 -0.90765 -0.41974 |
63b41167ef1e
gsvd: new function imported from Octave-Forge linear-algebra package.
Barbara Locsi <locsi.barbara@gmail.com>
parents:
diff
changeset
|
155 |
63b41167ef1e
gsvd: new function imported from Octave-Forge linear-algebra package.
Barbara Locsi <locsi.barbara@gmail.com>
parents:
diff
changeset
|
156 c = |
63b41167ef1e
gsvd: new function imported from Octave-Forge linear-algebra package.
Barbara Locsi <locsi.barbara@gmail.com>
parents:
diff
changeset
|
157 |
63b41167ef1e
gsvd: new function imported from Octave-Forge linear-algebra package.
Barbara Locsi <locsi.barbara@gmail.com>
parents:
diff
changeset
|
158 0.10499 0.00000 |
63b41167ef1e
gsvd: new function imported from Octave-Forge linear-algebra package.
Barbara Locsi <locsi.barbara@gmail.com>
parents:
diff
changeset
|
159 0.00000 0.00318 |
63b41167ef1e
gsvd: new function imported from Octave-Forge linear-algebra package.
Barbara Locsi <locsi.barbara@gmail.com>
parents:
diff
changeset
|
160 |
63b41167ef1e
gsvd: new function imported from Octave-Forge linear-algebra package.
Barbara Locsi <locsi.barbara@gmail.com>
parents:
diff
changeset
|
161 s = |
63b41167ef1e
gsvd: new function imported from Octave-Forge linear-algebra package.
Barbara Locsi <locsi.barbara@gmail.com>
parents:
diff
changeset
|
162 0.99447 0.00000 |
63b41167ef1e
gsvd: new function imported from Octave-Forge linear-algebra package.
Barbara Locsi <locsi.barbara@gmail.com>
parents:
diff
changeset
|
163 0.00000 0.99999 |
63b41167ef1e
gsvd: new function imported from Octave-Forge linear-algebra package.
Barbara Locsi <locsi.barbara@gmail.com>
parents:
diff
changeset
|
164 x = |
63b41167ef1e
gsvd: new function imported from Octave-Forge linear-algebra package.
Barbara Locsi <locsi.barbara@gmail.com>
parents:
diff
changeset
|
165 |
63b41167ef1e
gsvd: new function imported from Octave-Forge linear-algebra package.
Barbara Locsi <locsi.barbara@gmail.com>
parents:
diff
changeset
|
166 0.408248 0.902199 0.139179 |
63b41167ef1e
gsvd: new function imported from Octave-Forge linear-algebra package.
Barbara Locsi <locsi.barbara@gmail.com>
parents:
diff
changeset
|
167 -0.816497 0.429063 -0.386314 |
63b41167ef1e
gsvd: new function imported from Octave-Forge linear-algebra package.
Barbara Locsi <locsi.barbara@gmail.com>
parents:
diff
changeset
|
168 0.408248 -0.044073 -0.911806 |
63b41167ef1e
gsvd: new function imported from Octave-Forge linear-algebra package.
Barbara Locsi <locsi.barbara@gmail.com>
parents:
diff
changeset
|
169 |
63b41167ef1e
gsvd: new function imported from Octave-Forge linear-algebra package.
Barbara Locsi <locsi.barbara@gmail.com>
parents:
diff
changeset
|
170 r = |
63b41167ef1e
gsvd: new function imported from Octave-Forge linear-algebra package.
Barbara Locsi <locsi.barbara@gmail.com>
parents:
diff
changeset
|
171 -0.14093 -1.24345 0.43737 |
63b41167ef1e
gsvd: new function imported from Octave-Forge linear-algebra package.
Barbara Locsi <locsi.barbara@gmail.com>
parents:
diff
changeset
|
172 0.00000 -3.90043 2.57818 |
63b41167ef1e
gsvd: new function imported from Octave-Forge linear-algebra package.
Barbara Locsi <locsi.barbara@gmail.com>
parents:
diff
changeset
|
173 0.00000 0.00000 -2.52599 |
63b41167ef1e
gsvd: new function imported from Octave-Forge linear-algebra package.
Barbara Locsi <locsi.barbara@gmail.com>
parents:
diff
changeset
|
174 |
63b41167ef1e
gsvd: new function imported from Octave-Forge linear-algebra package.
Barbara Locsi <locsi.barbara@gmail.com>
parents:
diff
changeset
|
175 @end example |
63b41167ef1e
gsvd: new function imported from Octave-Forge linear-algebra package.
Barbara Locsi <locsi.barbara@gmail.com>
parents:
diff
changeset
|
176 |
63b41167ef1e
gsvd: new function imported from Octave-Forge linear-algebra package.
Barbara Locsi <locsi.barbara@gmail.com>
parents:
diff
changeset
|
177 The code is a wrapper to the corresponding Lapack dggsvd and zggsvd routines. |
63b41167ef1e
gsvd: new function imported from Octave-Forge linear-algebra package.
Barbara Locsi <locsi.barbara@gmail.com>
parents:
diff
changeset
|
178 |
63b41167ef1e
gsvd: new function imported from Octave-Forge linear-algebra package.
Barbara Locsi <locsi.barbara@gmail.com>
parents:
diff
changeset
|
179 @end deftypefn */) |
63b41167ef1e
gsvd: new function imported from Octave-Forge linear-algebra package.
Barbara Locsi <locsi.barbara@gmail.com>
parents:
diff
changeset
|
180 { |
63b41167ef1e
gsvd: new function imported from Octave-Forge linear-algebra package.
Barbara Locsi <locsi.barbara@gmail.com>
parents:
diff
changeset
|
181 octave_value_list retval; |
63b41167ef1e
gsvd: new function imported from Octave-Forge linear-algebra package.
Barbara Locsi <locsi.barbara@gmail.com>
parents:
diff
changeset
|
182 |
63b41167ef1e
gsvd: new function imported from Octave-Forge linear-algebra package.
Barbara Locsi <locsi.barbara@gmail.com>
parents:
diff
changeset
|
183 int nargin = args.length (); |
63b41167ef1e
gsvd: new function imported from Octave-Forge linear-algebra package.
Barbara Locsi <locsi.barbara@gmail.com>
parents:
diff
changeset
|
184 |
63b41167ef1e
gsvd: new function imported from Octave-Forge linear-algebra package.
Barbara Locsi <locsi.barbara@gmail.com>
parents:
diff
changeset
|
185 if (nargin < 2 || nargin > 2 || (nargout > 1 && (nargout < 5 || nargout > 6))) |
63b41167ef1e
gsvd: new function imported from Octave-Forge linear-algebra package.
Barbara Locsi <locsi.barbara@gmail.com>
parents:
diff
changeset
|
186 { |
63b41167ef1e
gsvd: new function imported from Octave-Forge linear-algebra package.
Barbara Locsi <locsi.barbara@gmail.com>
parents:
diff
changeset
|
187 print_usage (); |
63b41167ef1e
gsvd: new function imported from Octave-Forge linear-algebra package.
Barbara Locsi <locsi.barbara@gmail.com>
parents:
diff
changeset
|
188 return retval; |
63b41167ef1e
gsvd: new function imported from Octave-Forge linear-algebra package.
Barbara Locsi <locsi.barbara@gmail.com>
parents:
diff
changeset
|
189 } |
63b41167ef1e
gsvd: new function imported from Octave-Forge linear-algebra package.
Barbara Locsi <locsi.barbara@gmail.com>
parents:
diff
changeset
|
190 |
63b41167ef1e
gsvd: new function imported from Octave-Forge linear-algebra package.
Barbara Locsi <locsi.barbara@gmail.com>
parents:
diff
changeset
|
191 octave_value argA = args(0), argB = args(1); |
63b41167ef1e
gsvd: new function imported from Octave-Forge linear-algebra package.
Barbara Locsi <locsi.barbara@gmail.com>
parents:
diff
changeset
|
192 |
63b41167ef1e
gsvd: new function imported from Octave-Forge linear-algebra package.
Barbara Locsi <locsi.barbara@gmail.com>
parents:
diff
changeset
|
193 octave_idx_type nr = argA.rows (); |
63b41167ef1e
gsvd: new function imported from Octave-Forge linear-algebra package.
Barbara Locsi <locsi.barbara@gmail.com>
parents:
diff
changeset
|
194 octave_idx_type nc = argA.columns (); |
63b41167ef1e
gsvd: new function imported from Octave-Forge linear-algebra package.
Barbara Locsi <locsi.barbara@gmail.com>
parents:
diff
changeset
|
195 |
63b41167ef1e
gsvd: new function imported from Octave-Forge linear-algebra package.
Barbara Locsi <locsi.barbara@gmail.com>
parents:
diff
changeset
|
196 // octave_idx_type nn = argB.rows (); |
63b41167ef1e
gsvd: new function imported from Octave-Forge linear-algebra package.
Barbara Locsi <locsi.barbara@gmail.com>
parents:
diff
changeset
|
197 octave_idx_type np = argB.columns (); |
22236
065a44375723
gsvd: reduce code duplication with templates.
Barbara Locsi <locsi.barbara@gmail.com>
parents:
22235
diff
changeset
|
198 |
22235
63b41167ef1e
gsvd: new function imported from Octave-Forge linear-algebra package.
Barbara Locsi <locsi.barbara@gmail.com>
parents:
diff
changeset
|
199 if (nr == 0 || nc == 0) |
63b41167ef1e
gsvd: new function imported from Octave-Forge linear-algebra package.
Barbara Locsi <locsi.barbara@gmail.com>
parents:
diff
changeset
|
200 { |
63b41167ef1e
gsvd: new function imported from Octave-Forge linear-algebra package.
Barbara Locsi <locsi.barbara@gmail.com>
parents:
diff
changeset
|
201 if (nargout == 5) |
63b41167ef1e
gsvd: new function imported from Octave-Forge linear-algebra package.
Barbara Locsi <locsi.barbara@gmail.com>
parents:
diff
changeset
|
202 retval = ovl (identity_matrix (nc, nc), identity_matrix (nc, nc), |
63b41167ef1e
gsvd: new function imported from Octave-Forge linear-algebra package.
Barbara Locsi <locsi.barbara@gmail.com>
parents:
diff
changeset
|
203 Matrix (nr, nc), identity_matrix (nr, nr), |
63b41167ef1e
gsvd: new function imported from Octave-Forge linear-algebra package.
Barbara Locsi <locsi.barbara@gmail.com>
parents:
diff
changeset
|
204 identity_matrix (nr, nr)); |
63b41167ef1e
gsvd: new function imported from Octave-Forge linear-algebra package.
Barbara Locsi <locsi.barbara@gmail.com>
parents:
diff
changeset
|
205 else if (nargout == 6) |
63b41167ef1e
gsvd: new function imported from Octave-Forge linear-algebra package.
Barbara Locsi <locsi.barbara@gmail.com>
parents:
diff
changeset
|
206 retval = ovl (identity_matrix (nc, nc), identity_matrix (nc, nc), |
63b41167ef1e
gsvd: new function imported from Octave-Forge linear-algebra package.
Barbara Locsi <locsi.barbara@gmail.com>
parents:
diff
changeset
|
207 Matrix (nr, nc), identity_matrix (nr, nr), |
63b41167ef1e
gsvd: new function imported from Octave-Forge linear-algebra package.
Barbara Locsi <locsi.barbara@gmail.com>
parents:
diff
changeset
|
208 identity_matrix (nr, nr), |
63b41167ef1e
gsvd: new function imported from Octave-Forge linear-algebra package.
Barbara Locsi <locsi.barbara@gmail.com>
parents:
diff
changeset
|
209 identity_matrix (nr, nr)); |
63b41167ef1e
gsvd: new function imported from Octave-Forge linear-algebra package.
Barbara Locsi <locsi.barbara@gmail.com>
parents:
diff
changeset
|
210 else |
63b41167ef1e
gsvd: new function imported from Octave-Forge linear-algebra package.
Barbara Locsi <locsi.barbara@gmail.com>
parents:
diff
changeset
|
211 retval = ovl (Matrix (0, 1)); |
63b41167ef1e
gsvd: new function imported from Octave-Forge linear-algebra package.
Barbara Locsi <locsi.barbara@gmail.com>
parents:
diff
changeset
|
212 } |
63b41167ef1e
gsvd: new function imported from Octave-Forge linear-algebra package.
Barbara Locsi <locsi.barbara@gmail.com>
parents:
diff
changeset
|
213 else |
63b41167ef1e
gsvd: new function imported from Octave-Forge linear-algebra package.
Barbara Locsi <locsi.barbara@gmail.com>
parents:
diff
changeset
|
214 { |
63b41167ef1e
gsvd: new function imported from Octave-Forge linear-algebra package.
Barbara Locsi <locsi.barbara@gmail.com>
parents:
diff
changeset
|
215 if ((nc != np)) |
63b41167ef1e
gsvd: new function imported from Octave-Forge linear-algebra package.
Barbara Locsi <locsi.barbara@gmail.com>
parents:
diff
changeset
|
216 { |
63b41167ef1e
gsvd: new function imported from Octave-Forge linear-algebra package.
Barbara Locsi <locsi.barbara@gmail.com>
parents:
diff
changeset
|
217 print_usage (); |
63b41167ef1e
gsvd: new function imported from Octave-Forge linear-algebra package.
Barbara Locsi <locsi.barbara@gmail.com>
parents:
diff
changeset
|
218 return retval; |
63b41167ef1e
gsvd: new function imported from Octave-Forge linear-algebra package.
Barbara Locsi <locsi.barbara@gmail.com>
parents:
diff
changeset
|
219 } |
63b41167ef1e
gsvd: new function imported from Octave-Forge linear-algebra package.
Barbara Locsi <locsi.barbara@gmail.com>
parents:
diff
changeset
|
220 |
63b41167ef1e
gsvd: new function imported from Octave-Forge linear-algebra package.
Barbara Locsi <locsi.barbara@gmail.com>
parents:
diff
changeset
|
221 if (argA.is_real_type () && argB.is_real_type ()) |
63b41167ef1e
gsvd: new function imported from Octave-Forge linear-algebra package.
Barbara Locsi <locsi.barbara@gmail.com>
parents:
diff
changeset
|
222 { |
63b41167ef1e
gsvd: new function imported from Octave-Forge linear-algebra package.
Barbara Locsi <locsi.barbara@gmail.com>
parents:
diff
changeset
|
223 Matrix tmpA = argA.matrix_value (); |
63b41167ef1e
gsvd: new function imported from Octave-Forge linear-algebra package.
Barbara Locsi <locsi.barbara@gmail.com>
parents:
diff
changeset
|
224 Matrix tmpB = argB.matrix_value (); |
63b41167ef1e
gsvd: new function imported from Octave-Forge linear-algebra package.
Barbara Locsi <locsi.barbara@gmail.com>
parents:
diff
changeset
|
225 |
63b41167ef1e
gsvd: new function imported from Octave-Forge linear-algebra package.
Barbara Locsi <locsi.barbara@gmail.com>
parents:
diff
changeset
|
226 if (! error_state) |
63b41167ef1e
gsvd: new function imported from Octave-Forge linear-algebra package.
Barbara Locsi <locsi.barbara@gmail.com>
parents:
diff
changeset
|
227 { |
63b41167ef1e
gsvd: new function imported from Octave-Forge linear-algebra package.
Barbara Locsi <locsi.barbara@gmail.com>
parents:
diff
changeset
|
228 if (tmpA.any_element_is_inf_or_nan ()) |
63b41167ef1e
gsvd: new function imported from Octave-Forge linear-algebra package.
Barbara Locsi <locsi.barbara@gmail.com>
parents:
diff
changeset
|
229 { |
22236
065a44375723
gsvd: reduce code duplication with templates.
Barbara Locsi <locsi.barbara@gmail.com>
parents:
22235
diff
changeset
|
230 error ("gsvd: cannot take gsvd of matrix containing Inf or NaN values"); |
22235
63b41167ef1e
gsvd: new function imported from Octave-Forge linear-algebra package.
Barbara Locsi <locsi.barbara@gmail.com>
parents:
diff
changeset
|
231 return retval; |
63b41167ef1e
gsvd: new function imported from Octave-Forge linear-algebra package.
Barbara Locsi <locsi.barbara@gmail.com>
parents:
diff
changeset
|
232 } |
63b41167ef1e
gsvd: new function imported from Octave-Forge linear-algebra package.
Barbara Locsi <locsi.barbara@gmail.com>
parents:
diff
changeset
|
233 |
22236
065a44375723
gsvd: reduce code duplication with templates.
Barbara Locsi <locsi.barbara@gmail.com>
parents:
22235
diff
changeset
|
234 if (tmpB.any_element_is_inf_or_nan ()) |
065a44375723
gsvd: reduce code duplication with templates.
Barbara Locsi <locsi.barbara@gmail.com>
parents:
22235
diff
changeset
|
235 { |
065a44375723
gsvd: reduce code duplication with templates.
Barbara Locsi <locsi.barbara@gmail.com>
parents:
22235
diff
changeset
|
236 error ("gsvd: cannot take gsvd of matrix containing Inf or NaN values"); |
065a44375723
gsvd: reduce code duplication with templates.
Barbara Locsi <locsi.barbara@gmail.com>
parents:
22235
diff
changeset
|
237 return retval; |
065a44375723
gsvd: reduce code duplication with templates.
Barbara Locsi <locsi.barbara@gmail.com>
parents:
22235
diff
changeset
|
238 } |
065a44375723
gsvd: reduce code duplication with templates.
Barbara Locsi <locsi.barbara@gmail.com>
parents:
22235
diff
changeset
|
239 |
065a44375723
gsvd: reduce code duplication with templates.
Barbara Locsi <locsi.barbara@gmail.com>
parents:
22235
diff
changeset
|
240 gsvd<Matrix> result (tmpA, tmpB, gsvd_type<Matrix> (nargout)); |
22235
63b41167ef1e
gsvd: new function imported from Octave-Forge linear-algebra package.
Barbara Locsi <locsi.barbara@gmail.com>
parents:
diff
changeset
|
241 |
63b41167ef1e
gsvd: new function imported from Octave-Forge linear-algebra package.
Barbara Locsi <locsi.barbara@gmail.com>
parents:
diff
changeset
|
242 // DiagMatrix sigma = result.singular_values (); |
63b41167ef1e
gsvd: new function imported from Octave-Forge linear-algebra package.
Barbara Locsi <locsi.barbara@gmail.com>
parents:
diff
changeset
|
243 |
63b41167ef1e
gsvd: new function imported from Octave-Forge linear-algebra package.
Barbara Locsi <locsi.barbara@gmail.com>
parents:
diff
changeset
|
244 if (nargout == 0 || nargout == 1) |
63b41167ef1e
gsvd: new function imported from Octave-Forge linear-algebra package.
Barbara Locsi <locsi.barbara@gmail.com>
parents:
diff
changeset
|
245 { |
63b41167ef1e
gsvd: new function imported from Octave-Forge linear-algebra package.
Barbara Locsi <locsi.barbara@gmail.com>
parents:
diff
changeset
|
246 DiagMatrix sigA = result.singular_values_A (); |
63b41167ef1e
gsvd: new function imported from Octave-Forge linear-algebra package.
Barbara Locsi <locsi.barbara@gmail.com>
parents:
diff
changeset
|
247 DiagMatrix sigB = result.singular_values_B (); |
63b41167ef1e
gsvd: new function imported from Octave-Forge linear-algebra package.
Barbara Locsi <locsi.barbara@gmail.com>
parents:
diff
changeset
|
248 for (int i = sigA.rows() - 1; i >=0; i--) |
63b41167ef1e
gsvd: new function imported from Octave-Forge linear-algebra package.
Barbara Locsi <locsi.barbara@gmail.com>
parents:
diff
changeset
|
249 sigA.dgxelem(i) /= sigB.dgxelem(i); |
63b41167ef1e
gsvd: new function imported from Octave-Forge linear-algebra package.
Barbara Locsi <locsi.barbara@gmail.com>
parents:
diff
changeset
|
250 retval = ovl (sigA.diag()); |
63b41167ef1e
gsvd: new function imported from Octave-Forge linear-algebra package.
Barbara Locsi <locsi.barbara@gmail.com>
parents:
diff
changeset
|
251 } |
63b41167ef1e
gsvd: new function imported from Octave-Forge linear-algebra package.
Barbara Locsi <locsi.barbara@gmail.com>
parents:
diff
changeset
|
252 else |
22236
065a44375723
gsvd: reduce code duplication with templates.
Barbara Locsi <locsi.barbara@gmail.com>
parents:
22235
diff
changeset
|
253 { |
22235
63b41167ef1e
gsvd: new function imported from Octave-Forge linear-algebra package.
Barbara Locsi <locsi.barbara@gmail.com>
parents:
diff
changeset
|
254 if (nargout > 5) |
63b41167ef1e
gsvd: new function imported from Octave-Forge linear-algebra package.
Barbara Locsi <locsi.barbara@gmail.com>
parents:
diff
changeset
|
255 retval = ovl (result.left_singular_matrix_A (), |
63b41167ef1e
gsvd: new function imported from Octave-Forge linear-algebra package.
Barbara Locsi <locsi.barbara@gmail.com>
parents:
diff
changeset
|
256 result.left_singular_matrix_B (), |
63b41167ef1e
gsvd: new function imported from Octave-Forge linear-algebra package.
Barbara Locsi <locsi.barbara@gmail.com>
parents:
diff
changeset
|
257 result.singular_values_A (), |
63b41167ef1e
gsvd: new function imported from Octave-Forge linear-algebra package.
Barbara Locsi <locsi.barbara@gmail.com>
parents:
diff
changeset
|
258 result.singular_values_B (), |
63b41167ef1e
gsvd: new function imported from Octave-Forge linear-algebra package.
Barbara Locsi <locsi.barbara@gmail.com>
parents:
diff
changeset
|
259 result.right_singular_matrix (), |
63b41167ef1e
gsvd: new function imported from Octave-Forge linear-algebra package.
Barbara Locsi <locsi.barbara@gmail.com>
parents:
diff
changeset
|
260 result.R_matrix ()); |
63b41167ef1e
gsvd: new function imported from Octave-Forge linear-algebra package.
Barbara Locsi <locsi.barbara@gmail.com>
parents:
diff
changeset
|
261 else |
63b41167ef1e
gsvd: new function imported from Octave-Forge linear-algebra package.
Barbara Locsi <locsi.barbara@gmail.com>
parents:
diff
changeset
|
262 retval = ovl (result.left_singular_matrix_A (), |
63b41167ef1e
gsvd: new function imported from Octave-Forge linear-algebra package.
Barbara Locsi <locsi.barbara@gmail.com>
parents:
diff
changeset
|
263 result.left_singular_matrix_B (), |
63b41167ef1e
gsvd: new function imported from Octave-Forge linear-algebra package.
Barbara Locsi <locsi.barbara@gmail.com>
parents:
diff
changeset
|
264 result.singular_values_A (), |
63b41167ef1e
gsvd: new function imported from Octave-Forge linear-algebra package.
Barbara Locsi <locsi.barbara@gmail.com>
parents:
diff
changeset
|
265 result.singular_values_B (), |
63b41167ef1e
gsvd: new function imported from Octave-Forge linear-algebra package.
Barbara Locsi <locsi.barbara@gmail.com>
parents:
diff
changeset
|
266 result.right_singular_matrix ()); |
63b41167ef1e
gsvd: new function imported from Octave-Forge linear-algebra package.
Barbara Locsi <locsi.barbara@gmail.com>
parents:
diff
changeset
|
267 } |
63b41167ef1e
gsvd: new function imported from Octave-Forge linear-algebra package.
Barbara Locsi <locsi.barbara@gmail.com>
parents:
diff
changeset
|
268 } |
63b41167ef1e
gsvd: new function imported from Octave-Forge linear-algebra package.
Barbara Locsi <locsi.barbara@gmail.com>
parents:
diff
changeset
|
269 } |
63b41167ef1e
gsvd: new function imported from Octave-Forge linear-algebra package.
Barbara Locsi <locsi.barbara@gmail.com>
parents:
diff
changeset
|
270 else if (argA.is_complex_type () || argB.is_complex_type ()) |
63b41167ef1e
gsvd: new function imported from Octave-Forge linear-algebra package.
Barbara Locsi <locsi.barbara@gmail.com>
parents:
diff
changeset
|
271 { |
63b41167ef1e
gsvd: new function imported from Octave-Forge linear-algebra package.
Barbara Locsi <locsi.barbara@gmail.com>
parents:
diff
changeset
|
272 ComplexMatrix ctmpA = argA.complex_matrix_value (); |
63b41167ef1e
gsvd: new function imported from Octave-Forge linear-algebra package.
Barbara Locsi <locsi.barbara@gmail.com>
parents:
diff
changeset
|
273 ComplexMatrix ctmpB = argB.complex_matrix_value (); |
63b41167ef1e
gsvd: new function imported from Octave-Forge linear-algebra package.
Barbara Locsi <locsi.barbara@gmail.com>
parents:
diff
changeset
|
274 |
63b41167ef1e
gsvd: new function imported from Octave-Forge linear-algebra package.
Barbara Locsi <locsi.barbara@gmail.com>
parents:
diff
changeset
|
275 if (! error_state) |
63b41167ef1e
gsvd: new function imported from Octave-Forge linear-algebra package.
Barbara Locsi <locsi.barbara@gmail.com>
parents:
diff
changeset
|
276 { |
63b41167ef1e
gsvd: new function imported from Octave-Forge linear-algebra package.
Barbara Locsi <locsi.barbara@gmail.com>
parents:
diff
changeset
|
277 if (ctmpA.any_element_is_inf_or_nan ()) |
63b41167ef1e
gsvd: new function imported from Octave-Forge linear-algebra package.
Barbara Locsi <locsi.barbara@gmail.com>
parents:
diff
changeset
|
278 { |
22236
065a44375723
gsvd: reduce code duplication with templates.
Barbara Locsi <locsi.barbara@gmail.com>
parents:
22235
diff
changeset
|
279 error ("gsvd: cannot take gsvd of matrix containing Inf or NaN values"); |
22235
63b41167ef1e
gsvd: new function imported from Octave-Forge linear-algebra package.
Barbara Locsi <locsi.barbara@gmail.com>
parents:
diff
changeset
|
280 return retval; |
63b41167ef1e
gsvd: new function imported from Octave-Forge linear-algebra package.
Barbara Locsi <locsi.barbara@gmail.com>
parents:
diff
changeset
|
281 } |
63b41167ef1e
gsvd: new function imported from Octave-Forge linear-algebra package.
Barbara Locsi <locsi.barbara@gmail.com>
parents:
diff
changeset
|
282 if (ctmpB.any_element_is_inf_or_nan ()) |
63b41167ef1e
gsvd: new function imported from Octave-Forge linear-algebra package.
Barbara Locsi <locsi.barbara@gmail.com>
parents:
diff
changeset
|
283 { |
22236
065a44375723
gsvd: reduce code duplication with templates.
Barbara Locsi <locsi.barbara@gmail.com>
parents:
22235
diff
changeset
|
284 error ("gsvd: cannot take gsvd of matrix containing Inf or NaN values"); |
22235
63b41167ef1e
gsvd: new function imported from Octave-Forge linear-algebra package.
Barbara Locsi <locsi.barbara@gmail.com>
parents:
diff
changeset
|
285 return retval; |
63b41167ef1e
gsvd: new function imported from Octave-Forge linear-algebra package.
Barbara Locsi <locsi.barbara@gmail.com>
parents:
diff
changeset
|
286 } |
63b41167ef1e
gsvd: new function imported from Octave-Forge linear-algebra package.
Barbara Locsi <locsi.barbara@gmail.com>
parents:
diff
changeset
|
287 |
22236
065a44375723
gsvd: reduce code duplication with templates.
Barbara Locsi <locsi.barbara@gmail.com>
parents:
22235
diff
changeset
|
288 gsvd<ComplexMatrix> result (ctmpA, ctmpB, gsvd_type<ComplexMatrix> (nargout)); |
22235
63b41167ef1e
gsvd: new function imported from Octave-Forge linear-algebra package.
Barbara Locsi <locsi.barbara@gmail.com>
parents:
diff
changeset
|
289 |
63b41167ef1e
gsvd: new function imported from Octave-Forge linear-algebra package.
Barbara Locsi <locsi.barbara@gmail.com>
parents:
diff
changeset
|
290 // DiagMatrix sigma = result.singular_values (); |
63b41167ef1e
gsvd: new function imported from Octave-Forge linear-algebra package.
Barbara Locsi <locsi.barbara@gmail.com>
parents:
diff
changeset
|
291 |
63b41167ef1e
gsvd: new function imported from Octave-Forge linear-algebra package.
Barbara Locsi <locsi.barbara@gmail.com>
parents:
diff
changeset
|
292 if (nargout == 0 || nargout == 1) |
63b41167ef1e
gsvd: new function imported from Octave-Forge linear-algebra package.
Barbara Locsi <locsi.barbara@gmail.com>
parents:
diff
changeset
|
293 { |
63b41167ef1e
gsvd: new function imported from Octave-Forge linear-algebra package.
Barbara Locsi <locsi.barbara@gmail.com>
parents:
diff
changeset
|
294 DiagMatrix sigA = result.singular_values_A (); |
63b41167ef1e
gsvd: new function imported from Octave-Forge linear-algebra package.
Barbara Locsi <locsi.barbara@gmail.com>
parents:
diff
changeset
|
295 DiagMatrix sigB = result.singular_values_B (); |
63b41167ef1e
gsvd: new function imported from Octave-Forge linear-algebra package.
Barbara Locsi <locsi.barbara@gmail.com>
parents:
diff
changeset
|
296 for (int i = sigA.rows() - 1; i >=0; i--) |
63b41167ef1e
gsvd: new function imported from Octave-Forge linear-algebra package.
Barbara Locsi <locsi.barbara@gmail.com>
parents:
diff
changeset
|
297 sigA.dgxelem(i) /= sigB.dgxelem(i); |
63b41167ef1e
gsvd: new function imported from Octave-Forge linear-algebra package.
Barbara Locsi <locsi.barbara@gmail.com>
parents:
diff
changeset
|
298 retval = ovl (sigA.diag()); |
63b41167ef1e
gsvd: new function imported from Octave-Forge linear-algebra package.
Barbara Locsi <locsi.barbara@gmail.com>
parents:
diff
changeset
|
299 } |
63b41167ef1e
gsvd: new function imported from Octave-Forge linear-algebra package.
Barbara Locsi <locsi.barbara@gmail.com>
parents:
diff
changeset
|
300 else |
63b41167ef1e
gsvd: new function imported from Octave-Forge linear-algebra package.
Barbara Locsi <locsi.barbara@gmail.com>
parents:
diff
changeset
|
301 { |
63b41167ef1e
gsvd: new function imported from Octave-Forge linear-algebra package.
Barbara Locsi <locsi.barbara@gmail.com>
parents:
diff
changeset
|
302 if (nargout > 5) |
63b41167ef1e
gsvd: new function imported from Octave-Forge linear-algebra package.
Barbara Locsi <locsi.barbara@gmail.com>
parents:
diff
changeset
|
303 retval = ovl (result.left_singular_matrix_A (), |
63b41167ef1e
gsvd: new function imported from Octave-Forge linear-algebra package.
Barbara Locsi <locsi.barbara@gmail.com>
parents:
diff
changeset
|
304 result.left_singular_matrix_B (), |
63b41167ef1e
gsvd: new function imported from Octave-Forge linear-algebra package.
Barbara Locsi <locsi.barbara@gmail.com>
parents:
diff
changeset
|
305 result.singular_values_A (), |
63b41167ef1e
gsvd: new function imported from Octave-Forge linear-algebra package.
Barbara Locsi <locsi.barbara@gmail.com>
parents:
diff
changeset
|
306 result.singular_values_B (), |
63b41167ef1e
gsvd: new function imported from Octave-Forge linear-algebra package.
Barbara Locsi <locsi.barbara@gmail.com>
parents:
diff
changeset
|
307 result.right_singular_matrix (), |
63b41167ef1e
gsvd: new function imported from Octave-Forge linear-algebra package.
Barbara Locsi <locsi.barbara@gmail.com>
parents:
diff
changeset
|
308 result.R_matrix ()); |
63b41167ef1e
gsvd: new function imported from Octave-Forge linear-algebra package.
Barbara Locsi <locsi.barbara@gmail.com>
parents:
diff
changeset
|
309 else |
63b41167ef1e
gsvd: new function imported from Octave-Forge linear-algebra package.
Barbara Locsi <locsi.barbara@gmail.com>
parents:
diff
changeset
|
310 retval = ovl (result.left_singular_matrix_A (), |
63b41167ef1e
gsvd: new function imported from Octave-Forge linear-algebra package.
Barbara Locsi <locsi.barbara@gmail.com>
parents:
diff
changeset
|
311 result.left_singular_matrix_B (), |
63b41167ef1e
gsvd: new function imported from Octave-Forge linear-algebra package.
Barbara Locsi <locsi.barbara@gmail.com>
parents:
diff
changeset
|
312 result.singular_values_A (), |
63b41167ef1e
gsvd: new function imported from Octave-Forge linear-algebra package.
Barbara Locsi <locsi.barbara@gmail.com>
parents:
diff
changeset
|
313 result.singular_values_B (), |
63b41167ef1e
gsvd: new function imported from Octave-Forge linear-algebra package.
Barbara Locsi <locsi.barbara@gmail.com>
parents:
diff
changeset
|
314 result.right_singular_matrix ()); |
63b41167ef1e
gsvd: new function imported from Octave-Forge linear-algebra package.
Barbara Locsi <locsi.barbara@gmail.com>
parents:
diff
changeset
|
315 } |
63b41167ef1e
gsvd: new function imported from Octave-Forge linear-algebra package.
Barbara Locsi <locsi.barbara@gmail.com>
parents:
diff
changeset
|
316 } |
63b41167ef1e
gsvd: new function imported from Octave-Forge linear-algebra package.
Barbara Locsi <locsi.barbara@gmail.com>
parents:
diff
changeset
|
317 } |
63b41167ef1e
gsvd: new function imported from Octave-Forge linear-algebra package.
Barbara Locsi <locsi.barbara@gmail.com>
parents:
diff
changeset
|
318 else |
63b41167ef1e
gsvd: new function imported from Octave-Forge linear-algebra package.
Barbara Locsi <locsi.barbara@gmail.com>
parents:
diff
changeset
|
319 { |
22237
867b177af1fe
gsvd: replace deprecated gripe_wrong_type_arg with err_wrong_type_arg.
Carnë Draug <carandraug@octave.org>
parents:
22236
diff
changeset
|
320 err_wrong_type_arg ("gsvd", argA); |
867b177af1fe
gsvd: replace deprecated gripe_wrong_type_arg with err_wrong_type_arg.
Carnë Draug <carandraug@octave.org>
parents:
22236
diff
changeset
|
321 err_wrong_type_arg ("gsvd", argB); |
22235
63b41167ef1e
gsvd: new function imported from Octave-Forge linear-algebra package.
Barbara Locsi <locsi.barbara@gmail.com>
parents:
diff
changeset
|
322 return retval; |
63b41167ef1e
gsvd: new function imported from Octave-Forge linear-algebra package.
Barbara Locsi <locsi.barbara@gmail.com>
parents:
diff
changeset
|
323 } |
63b41167ef1e
gsvd: new function imported from Octave-Forge linear-algebra package.
Barbara Locsi <locsi.barbara@gmail.com>
parents:
diff
changeset
|
324 } |
63b41167ef1e
gsvd: new function imported from Octave-Forge linear-algebra package.
Barbara Locsi <locsi.barbara@gmail.com>
parents:
diff
changeset
|
325 |
63b41167ef1e
gsvd: new function imported from Octave-Forge linear-algebra package.
Barbara Locsi <locsi.barbara@gmail.com>
parents:
diff
changeset
|
326 return retval; |
63b41167ef1e
gsvd: new function imported from Octave-Forge linear-algebra package.
Barbara Locsi <locsi.barbara@gmail.com>
parents:
diff
changeset
|
327 } |
63b41167ef1e
gsvd: new function imported from Octave-Forge linear-algebra package.
Barbara Locsi <locsi.barbara@gmail.com>
parents:
diff
changeset
|
328 |
63b41167ef1e
gsvd: new function imported from Octave-Forge linear-algebra package.
Barbara Locsi <locsi.barbara@gmail.com>
parents:
diff
changeset
|
329 /* |
63b41167ef1e
gsvd: new function imported from Octave-Forge linear-algebra package.
Barbara Locsi <locsi.barbara@gmail.com>
parents:
diff
changeset
|
330 %# a few tests for gsvd.m |
63b41167ef1e
gsvd: new function imported from Octave-Forge linear-algebra package.
Barbara Locsi <locsi.barbara@gmail.com>
parents:
diff
changeset
|
331 %!shared A, A0, B, B0, U, V, C, S, X, R, D1, D2 |
63b41167ef1e
gsvd: new function imported from Octave-Forge linear-algebra package.
Barbara Locsi <locsi.barbara@gmail.com>
parents:
diff
changeset
|
332 |
63b41167ef1e
gsvd: new function imported from Octave-Forge linear-algebra package.
Barbara Locsi <locsi.barbara@gmail.com>
parents:
diff
changeset
|
333 %! A0=randn(5, 3); B0=diag([1 2 4]); |
63b41167ef1e
gsvd: new function imported from Octave-Forge linear-algebra package.
Barbara Locsi <locsi.barbara@gmail.com>
parents:
diff
changeset
|
334 %! A = A0; B = B0; |
63b41167ef1e
gsvd: new function imported from Octave-Forge linear-algebra package.
Barbara Locsi <locsi.barbara@gmail.com>
parents:
diff
changeset
|
335 %! # disp('Full rank, 5x3 by 3x3 matrices'); |
63b41167ef1e
gsvd: new function imported from Octave-Forge linear-algebra package.
Barbara Locsi <locsi.barbara@gmail.com>
parents:
diff
changeset
|
336 %! # disp([rank(A) rank(B) rank([A' B'])]); |
63b41167ef1e
gsvd: new function imported from Octave-Forge linear-algebra package.
Barbara Locsi <locsi.barbara@gmail.com>
parents:
diff
changeset
|
337 %! [U, V, C, S, X, R] = gsvd(A, B); |
63b41167ef1e
gsvd: new function imported from Octave-Forge linear-algebra package.
Barbara Locsi <locsi.barbara@gmail.com>
parents:
diff
changeset
|
338 %! D1 = zeros(5, 3); D1(1:3, 1:3) = C; |
63b41167ef1e
gsvd: new function imported from Octave-Forge linear-algebra package.
Barbara Locsi <locsi.barbara@gmail.com>
parents:
diff
changeset
|
339 %! D2 = S; |
63b41167ef1e
gsvd: new function imported from Octave-Forge linear-algebra package.
Barbara Locsi <locsi.barbara@gmail.com>
parents:
diff
changeset
|
340 %!assert(norm(diag(C).^2+diag(S).^2 - ones(3, 1)) <= 1e-6) |
63b41167ef1e
gsvd: new function imported from Octave-Forge linear-algebra package.
Barbara Locsi <locsi.barbara@gmail.com>
parents:
diff
changeset
|
341 %!assert(norm((U'*A*X)-D1*R) <= 1e-6) |
63b41167ef1e
gsvd: new function imported from Octave-Forge linear-algebra package.
Barbara Locsi <locsi.barbara@gmail.com>
parents:
diff
changeset
|
342 %!assert(norm((V'*B*X)-D2*R) <= 1e-6) |
63b41167ef1e
gsvd: new function imported from Octave-Forge linear-algebra package.
Barbara Locsi <locsi.barbara@gmail.com>
parents:
diff
changeset
|
343 |
63b41167ef1e
gsvd: new function imported from Octave-Forge linear-algebra package.
Barbara Locsi <locsi.barbara@gmail.com>
parents:
diff
changeset
|
344 %! # disp('A 5x3 full rank, B 3x3 rank deficient'); |
63b41167ef1e
gsvd: new function imported from Octave-Forge linear-algebra package.
Barbara Locsi <locsi.barbara@gmail.com>
parents:
diff
changeset
|
345 %! B(2, 2) = 0; |
63b41167ef1e
gsvd: new function imported from Octave-Forge linear-algebra package.
Barbara Locsi <locsi.barbara@gmail.com>
parents:
diff
changeset
|
346 %! [U, V, C, S, X, R] = gsvd(A, B); |
63b41167ef1e
gsvd: new function imported from Octave-Forge linear-algebra package.
Barbara Locsi <locsi.barbara@gmail.com>
parents:
diff
changeset
|
347 %! D1 = zeros(5, 3); D1(1, 1) = 1; D1(2:3, 2:3) = C; |
63b41167ef1e
gsvd: new function imported from Octave-Forge linear-algebra package.
Barbara Locsi <locsi.barbara@gmail.com>
parents:
diff
changeset
|
348 %! D2 = [zeros(2, 1) S; zeros(1, 3)]; |
63b41167ef1e
gsvd: new function imported from Octave-Forge linear-algebra package.
Barbara Locsi <locsi.barbara@gmail.com>
parents:
diff
changeset
|
349 %!assert(norm(diag(C).^2+diag(S).^2 - ones(2, 1)) <= 1e-6) |
63b41167ef1e
gsvd: new function imported from Octave-Forge linear-algebra package.
Barbara Locsi <locsi.barbara@gmail.com>
parents:
diff
changeset
|
350 %!assert(norm((U'*A*X)-D1*R) <= 1e-6) |
63b41167ef1e
gsvd: new function imported from Octave-Forge linear-algebra package.
Barbara Locsi <locsi.barbara@gmail.com>
parents:
diff
changeset
|
351 %!assert(norm((V'*B*X)-D2*R) <= 1e-6) |
63b41167ef1e
gsvd: new function imported from Octave-Forge linear-algebra package.
Barbara Locsi <locsi.barbara@gmail.com>
parents:
diff
changeset
|
352 |
63b41167ef1e
gsvd: new function imported from Octave-Forge linear-algebra package.
Barbara Locsi <locsi.barbara@gmail.com>
parents:
diff
changeset
|
353 %! # disp('A 5x3 rank deficient, B 3x3 full rank'); |
63b41167ef1e
gsvd: new function imported from Octave-Forge linear-algebra package.
Barbara Locsi <locsi.barbara@gmail.com>
parents:
diff
changeset
|
354 %! B = B0; |
63b41167ef1e
gsvd: new function imported from Octave-Forge linear-algebra package.
Barbara Locsi <locsi.barbara@gmail.com>
parents:
diff
changeset
|
355 %! A(:, 3) = 2*A(:, 1) - A(:, 2); |
63b41167ef1e
gsvd: new function imported from Octave-Forge linear-algebra package.
Barbara Locsi <locsi.barbara@gmail.com>
parents:
diff
changeset
|
356 %! [U, V, C, S, X, R] = gsvd(A, B); |
63b41167ef1e
gsvd: new function imported from Octave-Forge linear-algebra package.
Barbara Locsi <locsi.barbara@gmail.com>
parents:
diff
changeset
|
357 %! D1 = zeros(5, 3); D1(1:3, 1:3) = C; |
63b41167ef1e
gsvd: new function imported from Octave-Forge linear-algebra package.
Barbara Locsi <locsi.barbara@gmail.com>
parents:
diff
changeset
|
358 %! D2 = S; |
63b41167ef1e
gsvd: new function imported from Octave-Forge linear-algebra package.
Barbara Locsi <locsi.barbara@gmail.com>
parents:
diff
changeset
|
359 %!assert(norm(diag(C).^2+diag(S).^2 - ones(3, 1)) <= 1e-6) |
63b41167ef1e
gsvd: new function imported from Octave-Forge linear-algebra package.
Barbara Locsi <locsi.barbara@gmail.com>
parents:
diff
changeset
|
360 %!assert(norm((U'*A*X)-D1*R) <= 1e-6) |
63b41167ef1e
gsvd: new function imported from Octave-Forge linear-algebra package.
Barbara Locsi <locsi.barbara@gmail.com>
parents:
diff
changeset
|
361 %!assert(norm((V'*B*X)-D2*R) <= 1e-6) |
63b41167ef1e
gsvd: new function imported from Octave-Forge linear-algebra package.
Barbara Locsi <locsi.barbara@gmail.com>
parents:
diff
changeset
|
362 |
63b41167ef1e
gsvd: new function imported from Octave-Forge linear-algebra package.
Barbara Locsi <locsi.barbara@gmail.com>
parents:
diff
changeset
|
363 %! # disp("A 5x3, B 3x3, [A' B'] rank deficient"); |
63b41167ef1e
gsvd: new function imported from Octave-Forge linear-algebra package.
Barbara Locsi <locsi.barbara@gmail.com>
parents:
diff
changeset
|
364 %! B(:, 3) = 2*B(:, 1) - B(:, 2); |
63b41167ef1e
gsvd: new function imported from Octave-Forge linear-algebra package.
Barbara Locsi <locsi.barbara@gmail.com>
parents:
diff
changeset
|
365 %! [U, V, C, S, X, R] = gsvd(A, B); |
63b41167ef1e
gsvd: new function imported from Octave-Forge linear-algebra package.
Barbara Locsi <locsi.barbara@gmail.com>
parents:
diff
changeset
|
366 %! D1 = zeros(5, 2); D1(1:2, 1:2) = C; |
63b41167ef1e
gsvd: new function imported from Octave-Forge linear-algebra package.
Barbara Locsi <locsi.barbara@gmail.com>
parents:
diff
changeset
|
367 %! D2 = [S; zeros(1, 2)]; |
63b41167ef1e
gsvd: new function imported from Octave-Forge linear-algebra package.
Barbara Locsi <locsi.barbara@gmail.com>
parents:
diff
changeset
|
368 %!assert(norm(diag(C).^2+diag(S).^2 - ones(2, 1)) <= 1e-6) |
63b41167ef1e
gsvd: new function imported from Octave-Forge linear-algebra package.
Barbara Locsi <locsi.barbara@gmail.com>
parents:
diff
changeset
|
369 %!assert(norm((U'*A*X)-D1*[zeros(2, 1) R]) <= 1e-6) |
63b41167ef1e
gsvd: new function imported from Octave-Forge linear-algebra package.
Barbara Locsi <locsi.barbara@gmail.com>
parents:
diff
changeset
|
370 %!assert(norm((V'*B*X)-D2*[zeros(2, 1) R]) <= 1e-6) |
63b41167ef1e
gsvd: new function imported from Octave-Forge linear-algebra package.
Barbara Locsi <locsi.barbara@gmail.com>
parents:
diff
changeset
|
371 |
63b41167ef1e
gsvd: new function imported from Octave-Forge linear-algebra package.
Barbara Locsi <locsi.barbara@gmail.com>
parents:
diff
changeset
|
372 %! # now, A is 3x5 |
63b41167ef1e
gsvd: new function imported from Octave-Forge linear-algebra package.
Barbara Locsi <locsi.barbara@gmail.com>
parents:
diff
changeset
|
373 %! A = A0.'; B0=diag([1 2 4 8 16]); B = B0; |
63b41167ef1e
gsvd: new function imported from Octave-Forge linear-algebra package.
Barbara Locsi <locsi.barbara@gmail.com>
parents:
diff
changeset
|
374 %! # disp('Full rank, 3x5 by 5x5 matrices'); |
63b41167ef1e
gsvd: new function imported from Octave-Forge linear-algebra package.
Barbara Locsi <locsi.barbara@gmail.com>
parents:
diff
changeset
|
375 %! # disp([rank(A) rank(B) rank([A' B'])]); |
63b41167ef1e
gsvd: new function imported from Octave-Forge linear-algebra package.
Barbara Locsi <locsi.barbara@gmail.com>
parents:
diff
changeset
|
376 |
63b41167ef1e
gsvd: new function imported from Octave-Forge linear-algebra package.
Barbara Locsi <locsi.barbara@gmail.com>
parents:
diff
changeset
|
377 %! [U, V, C, S, X, R] = gsvd(A, B); |
63b41167ef1e
gsvd: new function imported from Octave-Forge linear-algebra package.
Barbara Locsi <locsi.barbara@gmail.com>
parents:
diff
changeset
|
378 %! D1 = [C zeros(3,2)]; |
22236
065a44375723
gsvd: reduce code duplication with templates.
Barbara Locsi <locsi.barbara@gmail.com>
parents:
22235
diff
changeset
|
379 %! D2 = [S zeros(3,2); zeros(2, 3) eye(2)]; |
22235
63b41167ef1e
gsvd: new function imported from Octave-Forge linear-algebra package.
Barbara Locsi <locsi.barbara@gmail.com>
parents:
diff
changeset
|
380 %!assert(norm(diag(C).^2+diag(S).^2 - ones(3, 1)) <= 1e-6) |
63b41167ef1e
gsvd: new function imported from Octave-Forge linear-algebra package.
Barbara Locsi <locsi.barbara@gmail.com>
parents:
diff
changeset
|
381 %!assert(norm((U'*A*X)-D1*R) <= 1e-6) |
63b41167ef1e
gsvd: new function imported from Octave-Forge linear-algebra package.
Barbara Locsi <locsi.barbara@gmail.com>
parents:
diff
changeset
|
382 %!assert(norm((V'*B*X)-D2*R) <= 1e-6) |
63b41167ef1e
gsvd: new function imported from Octave-Forge linear-algebra package.
Barbara Locsi <locsi.barbara@gmail.com>
parents:
diff
changeset
|
383 |
63b41167ef1e
gsvd: new function imported from Octave-Forge linear-algebra package.
Barbara Locsi <locsi.barbara@gmail.com>
parents:
diff
changeset
|
384 %! # disp('A 5x3 full rank, B 5x5 rank deficient'); |
63b41167ef1e
gsvd: new function imported from Octave-Forge linear-algebra package.
Barbara Locsi <locsi.barbara@gmail.com>
parents:
diff
changeset
|
385 %! B(2, 2) = 0; |
63b41167ef1e
gsvd: new function imported from Octave-Forge linear-algebra package.
Barbara Locsi <locsi.barbara@gmail.com>
parents:
diff
changeset
|
386 %! # disp([rank(A) rank(B) rank([A' B'])]); |
63b41167ef1e
gsvd: new function imported from Octave-Forge linear-algebra package.
Barbara Locsi <locsi.barbara@gmail.com>
parents:
diff
changeset
|
387 |
63b41167ef1e
gsvd: new function imported from Octave-Forge linear-algebra package.
Barbara Locsi <locsi.barbara@gmail.com>
parents:
diff
changeset
|
388 %! [U, V, C, S, X, R] = gsvd(A, B); |
63b41167ef1e
gsvd: new function imported from Octave-Forge linear-algebra package.
Barbara Locsi <locsi.barbara@gmail.com>
parents:
diff
changeset
|
389 %! D1 = zeros(3, 5); D1(1, 1) = 1; D1(2:3, 2:3) = C; |
63b41167ef1e
gsvd: new function imported from Octave-Forge linear-algebra package.
Barbara Locsi <locsi.barbara@gmail.com>
parents:
diff
changeset
|
390 %! D2 = zeros(5, 5); D2(1:2, 2:3) = S; D2(3:4, 4:5) = eye(2); |
63b41167ef1e
gsvd: new function imported from Octave-Forge linear-algebra package.
Barbara Locsi <locsi.barbara@gmail.com>
parents:
diff
changeset
|
391 %!assert(norm(diag(C).^2+diag(S).^2 - ones(2, 1)) <= 1e-6) |
63b41167ef1e
gsvd: new function imported from Octave-Forge linear-algebra package.
Barbara Locsi <locsi.barbara@gmail.com>
parents:
diff
changeset
|
392 %!assert(norm((U'*A*X)-D1*R) <= 1e-6) |
63b41167ef1e
gsvd: new function imported from Octave-Forge linear-algebra package.
Barbara Locsi <locsi.barbara@gmail.com>
parents:
diff
changeset
|
393 %!assert(norm((V'*B*X)-D2*R) <= 1e-6) |
63b41167ef1e
gsvd: new function imported from Octave-Forge linear-algebra package.
Barbara Locsi <locsi.barbara@gmail.com>
parents:
diff
changeset
|
394 |
63b41167ef1e
gsvd: new function imported from Octave-Forge linear-algebra package.
Barbara Locsi <locsi.barbara@gmail.com>
parents:
diff
changeset
|
395 %! # disp('A 3x5 rank deficient, B 5x5 full rank'); |
63b41167ef1e
gsvd: new function imported from Octave-Forge linear-algebra package.
Barbara Locsi <locsi.barbara@gmail.com>
parents:
diff
changeset
|
396 %! B = B0; |
63b41167ef1e
gsvd: new function imported from Octave-Forge linear-algebra package.
Barbara Locsi <locsi.barbara@gmail.com>
parents:
diff
changeset
|
397 %! A(3, :) = 2*A(1, :) - A(2, :); |
63b41167ef1e
gsvd: new function imported from Octave-Forge linear-algebra package.
Barbara Locsi <locsi.barbara@gmail.com>
parents:
diff
changeset
|
398 %! # disp([rank(A) rank(B) rank([A' B'])]); |
63b41167ef1e
gsvd: new function imported from Octave-Forge linear-algebra package.
Barbara Locsi <locsi.barbara@gmail.com>
parents:
diff
changeset
|
399 %! [U, V, C, S, X, R] = gsvd(A, B); |
63b41167ef1e
gsvd: new function imported from Octave-Forge linear-algebra package.
Barbara Locsi <locsi.barbara@gmail.com>
parents:
diff
changeset
|
400 %! D1 = zeros(3, 5); D1(1:3, 1:3) = C; |
63b41167ef1e
gsvd: new function imported from Octave-Forge linear-algebra package.
Barbara Locsi <locsi.barbara@gmail.com>
parents:
diff
changeset
|
401 %! D2 = zeros(5, 5); D2(1:3, 1:3) = S; D2(4:5, 4:5) = eye(2); |
63b41167ef1e
gsvd: new function imported from Octave-Forge linear-algebra package.
Barbara Locsi <locsi.barbara@gmail.com>
parents:
diff
changeset
|
402 %!assert(norm(diag(C).^2+diag(S).^2 - ones(3, 1)) <= 1e-6) |
63b41167ef1e
gsvd: new function imported from Octave-Forge linear-algebra package.
Barbara Locsi <locsi.barbara@gmail.com>
parents:
diff
changeset
|
403 %!assert(norm((U'*A*X)-D1*R) <= 1e-6) |
63b41167ef1e
gsvd: new function imported from Octave-Forge linear-algebra package.
Barbara Locsi <locsi.barbara@gmail.com>
parents:
diff
changeset
|
404 %!assert(norm((V'*B*X)-D2*R) <= 1e-6) |
63b41167ef1e
gsvd: new function imported from Octave-Forge linear-algebra package.
Barbara Locsi <locsi.barbara@gmail.com>
parents:
diff
changeset
|
405 |
63b41167ef1e
gsvd: new function imported from Octave-Forge linear-algebra package.
Barbara Locsi <locsi.barbara@gmail.com>
parents:
diff
changeset
|
406 %! # disp("A 5x3, B 5x5, [A' B'] rank deficient"); |
63b41167ef1e
gsvd: new function imported from Octave-Forge linear-algebra package.
Barbara Locsi <locsi.barbara@gmail.com>
parents:
diff
changeset
|
407 %! A = A0.'; B = B0.'; |
63b41167ef1e
gsvd: new function imported from Octave-Forge linear-algebra package.
Barbara Locsi <locsi.barbara@gmail.com>
parents:
diff
changeset
|
408 %! A(:, 3) = 2*A(:, 1) - A(:, 2); |
63b41167ef1e
gsvd: new function imported from Octave-Forge linear-algebra package.
Barbara Locsi <locsi.barbara@gmail.com>
parents:
diff
changeset
|
409 %! B(:, 3) = 2*B(:, 1) - B(:, 2); |
63b41167ef1e
gsvd: new function imported from Octave-Forge linear-algebra package.
Barbara Locsi <locsi.barbara@gmail.com>
parents:
diff
changeset
|
410 %! # disp([rank(A) rank(B) rank([A' B'])]); |
63b41167ef1e
gsvd: new function imported from Octave-Forge linear-algebra package.
Barbara Locsi <locsi.barbara@gmail.com>
parents:
diff
changeset
|
411 %! [U, V, C, S, X, R]=gsvd(A, B); |
63b41167ef1e
gsvd: new function imported from Octave-Forge linear-algebra package.
Barbara Locsi <locsi.barbara@gmail.com>
parents:
diff
changeset
|
412 %! D1 = zeros(3, 4); D1(1:3, 1:3) = C; |
63b41167ef1e
gsvd: new function imported from Octave-Forge linear-algebra package.
Barbara Locsi <locsi.barbara@gmail.com>
parents:
diff
changeset
|
413 %! D2 = eye(4); D2(1:3, 1:3) = S; D2(5,:) = 0; |
63b41167ef1e
gsvd: new function imported from Octave-Forge linear-algebra package.
Barbara Locsi <locsi.barbara@gmail.com>
parents:
diff
changeset
|
414 %!assert(norm(diag(C).^2+diag(S).^2 - ones(3, 1)) <= 1e-6) |
63b41167ef1e
gsvd: new function imported from Octave-Forge linear-algebra package.
Barbara Locsi <locsi.barbara@gmail.com>
parents:
diff
changeset
|
415 %!assert(norm((U'*A*X)-D1*[zeros(4, 1) R]) <= 1e-6) |
63b41167ef1e
gsvd: new function imported from Octave-Forge linear-algebra package.
Barbara Locsi <locsi.barbara@gmail.com>
parents:
diff
changeset
|
416 %!assert(norm((V'*B*X)-D2*[zeros(4, 1) R]) <= 1e-6) |
63b41167ef1e
gsvd: new function imported from Octave-Forge linear-algebra package.
Barbara Locsi <locsi.barbara@gmail.com>
parents:
diff
changeset
|
417 |
63b41167ef1e
gsvd: new function imported from Octave-Forge linear-algebra package.
Barbara Locsi <locsi.barbara@gmail.com>
parents:
diff
changeset
|
418 %! A0 = A0 +j * randn(5, 3); B0 = B0=diag([1 2 4]) + j*diag([4 -2 -1]); |
63b41167ef1e
gsvd: new function imported from Octave-Forge linear-algebra package.
Barbara Locsi <locsi.barbara@gmail.com>
parents:
diff
changeset
|
419 %! A = A0; B = B0; |
63b41167ef1e
gsvd: new function imported from Octave-Forge linear-algebra package.
Barbara Locsi <locsi.barbara@gmail.com>
parents:
diff
changeset
|
420 %! # disp('Complex: Full rank, 5x3 by 3x3 matrices'); |
63b41167ef1e
gsvd: new function imported from Octave-Forge linear-algebra package.
Barbara Locsi <locsi.barbara@gmail.com>
parents:
diff
changeset
|
421 %! # disp([rank(A) rank(B) rank([A' B'])]); |
63b41167ef1e
gsvd: new function imported from Octave-Forge linear-algebra package.
Barbara Locsi <locsi.barbara@gmail.com>
parents:
diff
changeset
|
422 %! [U, V, C, S, X, R] = gsvd(A, B); |
63b41167ef1e
gsvd: new function imported from Octave-Forge linear-algebra package.
Barbara Locsi <locsi.barbara@gmail.com>
parents:
diff
changeset
|
423 %! D1 = zeros(5, 3); D1(1:3, 1:3) = C; |
63b41167ef1e
gsvd: new function imported from Octave-Forge linear-algebra package.
Barbara Locsi <locsi.barbara@gmail.com>
parents:
diff
changeset
|
424 %! D2 = S; |
63b41167ef1e
gsvd: new function imported from Octave-Forge linear-algebra package.
Barbara Locsi <locsi.barbara@gmail.com>
parents:
diff
changeset
|
425 %!assert(norm(diag(C).^2+diag(S).^2 - ones(3, 1)) <= 1e-6) |
63b41167ef1e
gsvd: new function imported from Octave-Forge linear-algebra package.
Barbara Locsi <locsi.barbara@gmail.com>
parents:
diff
changeset
|
426 %!assert(norm((U'*A*X)-D1*R) <= 1e-6) |
63b41167ef1e
gsvd: new function imported from Octave-Forge linear-algebra package.
Barbara Locsi <locsi.barbara@gmail.com>
parents:
diff
changeset
|
427 %!assert(norm((V'*B*X)-D2*R) <= 1e-6) |
63b41167ef1e
gsvd: new function imported from Octave-Forge linear-algebra package.
Barbara Locsi <locsi.barbara@gmail.com>
parents:
diff
changeset
|
428 |
63b41167ef1e
gsvd: new function imported from Octave-Forge linear-algebra package.
Barbara Locsi <locsi.barbara@gmail.com>
parents:
diff
changeset
|
429 %! # disp('Complex: A 5x3 full rank, B 3x3 rank deficient'); |
63b41167ef1e
gsvd: new function imported from Octave-Forge linear-algebra package.
Barbara Locsi <locsi.barbara@gmail.com>
parents:
diff
changeset
|
430 %! B(2, 2) = 0; |
63b41167ef1e
gsvd: new function imported from Octave-Forge linear-algebra package.
Barbara Locsi <locsi.barbara@gmail.com>
parents:
diff
changeset
|
431 %! # disp([rank(A) rank(B) rank([A' B'])]); |
63b41167ef1e
gsvd: new function imported from Octave-Forge linear-algebra package.
Barbara Locsi <locsi.barbara@gmail.com>
parents:
diff
changeset
|
432 |
63b41167ef1e
gsvd: new function imported from Octave-Forge linear-algebra package.
Barbara Locsi <locsi.barbara@gmail.com>
parents:
diff
changeset
|
433 %! [U, V, C, S, X, R] = gsvd(A, B); |
63b41167ef1e
gsvd: new function imported from Octave-Forge linear-algebra package.
Barbara Locsi <locsi.barbara@gmail.com>
parents:
diff
changeset
|
434 %! D1 = zeros(5, 3); D1(1, 1) = 1; D1(2:3, 2:3) = C; |
63b41167ef1e
gsvd: new function imported from Octave-Forge linear-algebra package.
Barbara Locsi <locsi.barbara@gmail.com>
parents:
diff
changeset
|
435 %! D2 = [zeros(2, 1) S; zeros(1, 3)]; |
63b41167ef1e
gsvd: new function imported from Octave-Forge linear-algebra package.
Barbara Locsi <locsi.barbara@gmail.com>
parents:
diff
changeset
|
436 %!assert(norm(diag(C).^2+diag(S).^2 - ones(2, 1)) <= 1e-6) |
63b41167ef1e
gsvd: new function imported from Octave-Forge linear-algebra package.
Barbara Locsi <locsi.barbara@gmail.com>
parents:
diff
changeset
|
437 %!assert(norm((U'*A*X)-D1*R) <= 1e-6) |
63b41167ef1e
gsvd: new function imported from Octave-Forge linear-algebra package.
Barbara Locsi <locsi.barbara@gmail.com>
parents:
diff
changeset
|
438 %!assert(norm((V'*B*X)-D2*R) <= 1e-6) |
63b41167ef1e
gsvd: new function imported from Octave-Forge linear-algebra package.
Barbara Locsi <locsi.barbara@gmail.com>
parents:
diff
changeset
|
439 |
63b41167ef1e
gsvd: new function imported from Octave-Forge linear-algebra package.
Barbara Locsi <locsi.barbara@gmail.com>
parents:
diff
changeset
|
440 %! # disp('Complex: A 5x3 rank deficient, B 3x3 full rank'); |
63b41167ef1e
gsvd: new function imported from Octave-Forge linear-algebra package.
Barbara Locsi <locsi.barbara@gmail.com>
parents:
diff
changeset
|
441 %! B = B0; |
63b41167ef1e
gsvd: new function imported from Octave-Forge linear-algebra package.
Barbara Locsi <locsi.barbara@gmail.com>
parents:
diff
changeset
|
442 %! A(:, 3) = 2*A(:, 1) - A(:, 2); |
63b41167ef1e
gsvd: new function imported from Octave-Forge linear-algebra package.
Barbara Locsi <locsi.barbara@gmail.com>
parents:
diff
changeset
|
443 %! # disp([rank(A) rank(B) rank([A' B'])]); |
63b41167ef1e
gsvd: new function imported from Octave-Forge linear-algebra package.
Barbara Locsi <locsi.barbara@gmail.com>
parents:
diff
changeset
|
444 %! [U, V, C, S, X, R] = gsvd(A, B); |
63b41167ef1e
gsvd: new function imported from Octave-Forge linear-algebra package.
Barbara Locsi <locsi.barbara@gmail.com>
parents:
diff
changeset
|
445 %! D1 = zeros(5, 3); D1(1:3, 1:3) = C; |
63b41167ef1e
gsvd: new function imported from Octave-Forge linear-algebra package.
Barbara Locsi <locsi.barbara@gmail.com>
parents:
diff
changeset
|
446 %! D2 = S; |
63b41167ef1e
gsvd: new function imported from Octave-Forge linear-algebra package.
Barbara Locsi <locsi.barbara@gmail.com>
parents:
diff
changeset
|
447 %!assert(norm(diag(C).^2+diag(S).^2 - ones(3, 1)) <= 1e-6) |
63b41167ef1e
gsvd: new function imported from Octave-Forge linear-algebra package.
Barbara Locsi <locsi.barbara@gmail.com>
parents:
diff
changeset
|
448 %!assert(norm((U'*A*X)-D1*R) <= 1e-6) |
63b41167ef1e
gsvd: new function imported from Octave-Forge linear-algebra package.
Barbara Locsi <locsi.barbara@gmail.com>
parents:
diff
changeset
|
449 %!assert(norm((V'*B*X)-D2*R) <= 1e-6) |
63b41167ef1e
gsvd: new function imported from Octave-Forge linear-algebra package.
Barbara Locsi <locsi.barbara@gmail.com>
parents:
diff
changeset
|
450 |
63b41167ef1e
gsvd: new function imported from Octave-Forge linear-algebra package.
Barbara Locsi <locsi.barbara@gmail.com>
parents:
diff
changeset
|
451 %! # disp("Complex: A 5x3, B 3x3, [A' B'] rank deficient"); |
63b41167ef1e
gsvd: new function imported from Octave-Forge linear-algebra package.
Barbara Locsi <locsi.barbara@gmail.com>
parents:
diff
changeset
|
452 %! B(:, 3) = 2*B(:, 1) - B(:, 2); |
63b41167ef1e
gsvd: new function imported from Octave-Forge linear-algebra package.
Barbara Locsi <locsi.barbara@gmail.com>
parents:
diff
changeset
|
453 %! # disp([rank(A) rank(B) rank([A' B'])]); |
63b41167ef1e
gsvd: new function imported from Octave-Forge linear-algebra package.
Barbara Locsi <locsi.barbara@gmail.com>
parents:
diff
changeset
|
454 %! [U, V, C, S, X, R] = gsvd(A, B); |
63b41167ef1e
gsvd: new function imported from Octave-Forge linear-algebra package.
Barbara Locsi <locsi.barbara@gmail.com>
parents:
diff
changeset
|
455 %! D1 = zeros(5, 2); D1(1:2, 1:2) = C; |
63b41167ef1e
gsvd: new function imported from Octave-Forge linear-algebra package.
Barbara Locsi <locsi.barbara@gmail.com>
parents:
diff
changeset
|
456 %! D2 = [S; zeros(1, 2)]; |
63b41167ef1e
gsvd: new function imported from Octave-Forge linear-algebra package.
Barbara Locsi <locsi.barbara@gmail.com>
parents:
diff
changeset
|
457 %!assert(norm(diag(C).^2+diag(S).^2 - ones(2, 1)) <= 1e-6) |
63b41167ef1e
gsvd: new function imported from Octave-Forge linear-algebra package.
Barbara Locsi <locsi.barbara@gmail.com>
parents:
diff
changeset
|
458 %!assert(norm((U'*A*X)-D1*[zeros(2, 1) R]) <= 1e-6) |
63b41167ef1e
gsvd: new function imported from Octave-Forge linear-algebra package.
Barbara Locsi <locsi.barbara@gmail.com>
parents:
diff
changeset
|
459 %!assert(norm((V'*B*X)-D2*[zeros(2, 1) R]) <= 1e-6) |
63b41167ef1e
gsvd: new function imported from Octave-Forge linear-algebra package.
Barbara Locsi <locsi.barbara@gmail.com>
parents:
diff
changeset
|
460 |
63b41167ef1e
gsvd: new function imported from Octave-Forge linear-algebra package.
Barbara Locsi <locsi.barbara@gmail.com>
parents:
diff
changeset
|
461 %! # now, A is 3x5 |
22236
065a44375723
gsvd: reduce code duplication with templates.
Barbara Locsi <locsi.barbara@gmail.com>
parents:
22235
diff
changeset
|
462 %! A = A0.'; B0=diag([1 2 4 8 16])+j*diag([-5 4 -3 2 -1]); |
22235
63b41167ef1e
gsvd: new function imported from Octave-Forge linear-algebra package.
Barbara Locsi <locsi.barbara@gmail.com>
parents:
diff
changeset
|
463 %! B = B0; |
63b41167ef1e
gsvd: new function imported from Octave-Forge linear-algebra package.
Barbara Locsi <locsi.barbara@gmail.com>
parents:
diff
changeset
|
464 %! # disp('Complex: Full rank, 3x5 by 5x5 matrices'); |
63b41167ef1e
gsvd: new function imported from Octave-Forge linear-algebra package.
Barbara Locsi <locsi.barbara@gmail.com>
parents:
diff
changeset
|
465 %! # disp([rank(A) rank(B) rank([A' B'])]); |
63b41167ef1e
gsvd: new function imported from Octave-Forge linear-algebra package.
Barbara Locsi <locsi.barbara@gmail.com>
parents:
diff
changeset
|
466 %! [U, V, C, S, X, R] = gsvd(A, B); |
63b41167ef1e
gsvd: new function imported from Octave-Forge linear-algebra package.
Barbara Locsi <locsi.barbara@gmail.com>
parents:
diff
changeset
|
467 %! D1 = [C zeros(3,2)]; |
22236
065a44375723
gsvd: reduce code duplication with templates.
Barbara Locsi <locsi.barbara@gmail.com>
parents:
22235
diff
changeset
|
468 %! D2 = [S zeros(3,2); zeros(2, 3) eye(2)]; |
22235
63b41167ef1e
gsvd: new function imported from Octave-Forge linear-algebra package.
Barbara Locsi <locsi.barbara@gmail.com>
parents:
diff
changeset
|
469 %!assert(norm(diag(C).^2+diag(S).^2 - ones(3, 1)) <= 1e-6) |
63b41167ef1e
gsvd: new function imported from Octave-Forge linear-algebra package.
Barbara Locsi <locsi.barbara@gmail.com>
parents:
diff
changeset
|
470 %!assert(norm((U'*A*X)-D1*R) <= 1e-6) |
63b41167ef1e
gsvd: new function imported from Octave-Forge linear-algebra package.
Barbara Locsi <locsi.barbara@gmail.com>
parents:
diff
changeset
|
471 %!assert(norm((V'*B*X)-D2*R) <= 1e-6) |
63b41167ef1e
gsvd: new function imported from Octave-Forge linear-algebra package.
Barbara Locsi <locsi.barbara@gmail.com>
parents:
diff
changeset
|
472 |
63b41167ef1e
gsvd: new function imported from Octave-Forge linear-algebra package.
Barbara Locsi <locsi.barbara@gmail.com>
parents:
diff
changeset
|
473 %! # disp('Complex: A 5x3 full rank, B 5x5 rank deficient'); |
63b41167ef1e
gsvd: new function imported from Octave-Forge linear-algebra package.
Barbara Locsi <locsi.barbara@gmail.com>
parents:
diff
changeset
|
474 %! B(2, 2) = 0; |
63b41167ef1e
gsvd: new function imported from Octave-Forge linear-algebra package.
Barbara Locsi <locsi.barbara@gmail.com>
parents:
diff
changeset
|
475 %! # disp([rank(A) rank(B) rank([A' B'])]); |
63b41167ef1e
gsvd: new function imported from Octave-Forge linear-algebra package.
Barbara Locsi <locsi.barbara@gmail.com>
parents:
diff
changeset
|
476 %! [U, V, C, S, X, R] = gsvd(A, B); |
63b41167ef1e
gsvd: new function imported from Octave-Forge linear-algebra package.
Barbara Locsi <locsi.barbara@gmail.com>
parents:
diff
changeset
|
477 %! D1 = zeros(3, 5); D1(1, 1) = 1; D1(2:3, 2:3) = C; |
63b41167ef1e
gsvd: new function imported from Octave-Forge linear-algebra package.
Barbara Locsi <locsi.barbara@gmail.com>
parents:
diff
changeset
|
478 %! D2 = zeros(5,5); D2(1:2, 2:3) = S; D2(3:4, 4:5) = eye(2); |
63b41167ef1e
gsvd: new function imported from Octave-Forge linear-algebra package.
Barbara Locsi <locsi.barbara@gmail.com>
parents:
diff
changeset
|
479 %!assert(norm(diag(C).^2+diag(S).^2 - ones(2, 1)) <= 1e-6) |
63b41167ef1e
gsvd: new function imported from Octave-Forge linear-algebra package.
Barbara Locsi <locsi.barbara@gmail.com>
parents:
diff
changeset
|
480 %!assert(norm((U'*A*X)-D1*R) <= 1e-6) |
63b41167ef1e
gsvd: new function imported from Octave-Forge linear-algebra package.
Barbara Locsi <locsi.barbara@gmail.com>
parents:
diff
changeset
|
481 %!assert(norm((V'*B*X)-D2*R) <= 1e-6) |
63b41167ef1e
gsvd: new function imported from Octave-Forge linear-algebra package.
Barbara Locsi <locsi.barbara@gmail.com>
parents:
diff
changeset
|
482 |
63b41167ef1e
gsvd: new function imported from Octave-Forge linear-algebra package.
Barbara Locsi <locsi.barbara@gmail.com>
parents:
diff
changeset
|
483 %! # disp('Complex: A 3x5 rank deficient, B 5x5 full rank'); |
63b41167ef1e
gsvd: new function imported from Octave-Forge linear-algebra package.
Barbara Locsi <locsi.barbara@gmail.com>
parents:
diff
changeset
|
484 %! B = B0; |
63b41167ef1e
gsvd: new function imported from Octave-Forge linear-algebra package.
Barbara Locsi <locsi.barbara@gmail.com>
parents:
diff
changeset
|
485 %! A(3, :) = 2*A(1, :) - A(2, :); |
63b41167ef1e
gsvd: new function imported from Octave-Forge linear-algebra package.
Barbara Locsi <locsi.barbara@gmail.com>
parents:
diff
changeset
|
486 %! # disp([rank(A) rank(B) rank([A' B'])]); |
63b41167ef1e
gsvd: new function imported from Octave-Forge linear-algebra package.
Barbara Locsi <locsi.barbara@gmail.com>
parents:
diff
changeset
|
487 %! [U, V, C, S, X, R] = gsvd(A, B); |
63b41167ef1e
gsvd: new function imported from Octave-Forge linear-algebra package.
Barbara Locsi <locsi.barbara@gmail.com>
parents:
diff
changeset
|
488 %! D1 = zeros(3, 5); D1(1:3, 1:3) = C; |
63b41167ef1e
gsvd: new function imported from Octave-Forge linear-algebra package.
Barbara Locsi <locsi.barbara@gmail.com>
parents:
diff
changeset
|
489 %! D2 = zeros(5,5); D2(1:3, 1:3) = S; D2(4:5, 4:5) = eye(2); |
63b41167ef1e
gsvd: new function imported from Octave-Forge linear-algebra package.
Barbara Locsi <locsi.barbara@gmail.com>
parents:
diff
changeset
|
490 %!assert(norm(diag(C).^2+diag(S).^2 - ones(3, 1)) <= 1e-6) |
63b41167ef1e
gsvd: new function imported from Octave-Forge linear-algebra package.
Barbara Locsi <locsi.barbara@gmail.com>
parents:
diff
changeset
|
491 %!assert(norm((U'*A*X)-D1*R) <= 1e-6) |
63b41167ef1e
gsvd: new function imported from Octave-Forge linear-algebra package.
Barbara Locsi <locsi.barbara@gmail.com>
parents:
diff
changeset
|
492 %!assert(norm((V'*B*X)-D2*R) <= 1e-6) |
63b41167ef1e
gsvd: new function imported from Octave-Forge linear-algebra package.
Barbara Locsi <locsi.barbara@gmail.com>
parents:
diff
changeset
|
493 |
63b41167ef1e
gsvd: new function imported from Octave-Forge linear-algebra package.
Barbara Locsi <locsi.barbara@gmail.com>
parents:
diff
changeset
|
494 %! # disp("Complex: A 5x3, B 5x5, [A' B'] rank deficient"); |
63b41167ef1e
gsvd: new function imported from Octave-Forge linear-algebra package.
Barbara Locsi <locsi.barbara@gmail.com>
parents:
diff
changeset
|
495 %! A = A0.'; B = B0.'; |
63b41167ef1e
gsvd: new function imported from Octave-Forge linear-algebra package.
Barbara Locsi <locsi.barbara@gmail.com>
parents:
diff
changeset
|
496 %! A(:, 3) = 2*A(:, 1) - A(:, 2); |
63b41167ef1e
gsvd: new function imported from Octave-Forge linear-algebra package.
Barbara Locsi <locsi.barbara@gmail.com>
parents:
diff
changeset
|
497 %! B(:, 3) = 2*B(:, 1) - B(:, 2); |
63b41167ef1e
gsvd: new function imported from Octave-Forge linear-algebra package.
Barbara Locsi <locsi.barbara@gmail.com>
parents:
diff
changeset
|
498 %! # disp([rank(A) rank(B) rank([A' B'])]); |
63b41167ef1e
gsvd: new function imported from Octave-Forge linear-algebra package.
Barbara Locsi <locsi.barbara@gmail.com>
parents:
diff
changeset
|
499 %! [U, V, C, S, X, R]=gsvd(A, B); |
63b41167ef1e
gsvd: new function imported from Octave-Forge linear-algebra package.
Barbara Locsi <locsi.barbara@gmail.com>
parents:
diff
changeset
|
500 %! D1 = zeros(3, 4); D1(1:3, 1:3) = C; |
63b41167ef1e
gsvd: new function imported from Octave-Forge linear-algebra package.
Barbara Locsi <locsi.barbara@gmail.com>
parents:
diff
changeset
|
501 %! D2 = eye(4); D2(1:3, 1:3) = S; D2(5,:) = 0; |
63b41167ef1e
gsvd: new function imported from Octave-Forge linear-algebra package.
Barbara Locsi <locsi.barbara@gmail.com>
parents:
diff
changeset
|
502 %!assert(norm(diag(C).^2+diag(S).^2 - ones(3, 1)) <= 1e-6) |
63b41167ef1e
gsvd: new function imported from Octave-Forge linear-algebra package.
Barbara Locsi <locsi.barbara@gmail.com>
parents:
diff
changeset
|
503 %!assert(norm((U'*A*X)-D1*[zeros(4, 1) R]) <= 1e-6) |
63b41167ef1e
gsvd: new function imported from Octave-Forge linear-algebra package.
Barbara Locsi <locsi.barbara@gmail.com>
parents:
diff
changeset
|
504 %!assert(norm((V'*B*X)-D2*[zeros(4, 1) R]) <= 1e-6) |
63b41167ef1e
gsvd: new function imported from Octave-Forge linear-algebra package.
Barbara Locsi <locsi.barbara@gmail.com>
parents:
diff
changeset
|
505 |
22236
065a44375723
gsvd: reduce code duplication with templates.
Barbara Locsi <locsi.barbara@gmail.com>
parents:
22235
diff
changeset
|
506 */ |