annotate scripts/linear-algebra/condeig.m @ 22195:93ed9396f2c3

* condeig.m: fix Texinfo markup typo in condeig doc string (bug #48672)
author Mike Miller <mtmiller@octave.org>
date Mon, 01 Aug 2016 09:52:51 -0700
parents e859caa53399
children bac0d6f07a3e
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
22129
e859caa53399 condeig.m: New function imported from Octave-Forge linear-algebra package.
Rik <rik@octave.org>
parents:
diff changeset
1 ## Copyright (C) 2006, 2007 Arno Onken <asnelt@asnelt.org>
e859caa53399 condeig.m: New function imported from Octave-Forge linear-algebra package.
Rik <rik@octave.org>
parents:
diff changeset
2 ##
e859caa53399 condeig.m: New function imported from Octave-Forge linear-algebra package.
Rik <rik@octave.org>
parents:
diff changeset
3 ## This file is part of Octave.
e859caa53399 condeig.m: New function imported from Octave-Forge linear-algebra package.
Rik <rik@octave.org>
parents:
diff changeset
4 ##
e859caa53399 condeig.m: New function imported from Octave-Forge linear-algebra package.
Rik <rik@octave.org>
parents:
diff changeset
5 ## Octave is free software; you can redistribute it and/or modify it
e859caa53399 condeig.m: New function imported from Octave-Forge linear-algebra package.
Rik <rik@octave.org>
parents:
diff changeset
6 ## under the terms of the GNU General Public License as published by
e859caa53399 condeig.m: New function imported from Octave-Forge linear-algebra package.
Rik <rik@octave.org>
parents:
diff changeset
7 ## the Free Software Foundation; either version 3 of the License, or (at
e859caa53399 condeig.m: New function imported from Octave-Forge linear-algebra package.
Rik <rik@octave.org>
parents:
diff changeset
8 ## your option) any later version.
e859caa53399 condeig.m: New function imported from Octave-Forge linear-algebra package.
Rik <rik@octave.org>
parents:
diff changeset
9 ##
e859caa53399 condeig.m: New function imported from Octave-Forge linear-algebra package.
Rik <rik@octave.org>
parents:
diff changeset
10 ## Octave is distributed in the hope that it will be useful, but
e859caa53399 condeig.m: New function imported from Octave-Forge linear-algebra package.
Rik <rik@octave.org>
parents:
diff changeset
11 ## WITHOUT ANY WARRANTY; without even the implied warranty of
e859caa53399 condeig.m: New function imported from Octave-Forge linear-algebra package.
Rik <rik@octave.org>
parents:
diff changeset
12 ## MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
e859caa53399 condeig.m: New function imported from Octave-Forge linear-algebra package.
Rik <rik@octave.org>
parents:
diff changeset
13 ## General Public License for more details.
e859caa53399 condeig.m: New function imported from Octave-Forge linear-algebra package.
Rik <rik@octave.org>
parents:
diff changeset
14 ##
e859caa53399 condeig.m: New function imported from Octave-Forge linear-algebra package.
Rik <rik@octave.org>
parents:
diff changeset
15 ## You should have received a copy of the GNU General Public License
e859caa53399 condeig.m: New function imported from Octave-Forge linear-algebra package.
Rik <rik@octave.org>
parents:
diff changeset
16 ## along with Octave; see the file COPYING. If not, see
e859caa53399 condeig.m: New function imported from Octave-Forge linear-algebra package.
Rik <rik@octave.org>
parents:
diff changeset
17 ## <http://www.gnu.org/licenses/>.
e859caa53399 condeig.m: New function imported from Octave-Forge linear-algebra package.
Rik <rik@octave.org>
parents:
diff changeset
18
e859caa53399 condeig.m: New function imported from Octave-Forge linear-algebra package.
Rik <rik@octave.org>
parents:
diff changeset
19 ## -*- texinfo -*-
e859caa53399 condeig.m: New function imported from Octave-Forge linear-algebra package.
Rik <rik@octave.org>
parents:
diff changeset
20 ## @deftypefn {} {@var{c} =} condeig (@var{a})
e859caa53399 condeig.m: New function imported from Octave-Forge linear-algebra package.
Rik <rik@octave.org>
parents:
diff changeset
21 ## @deftypefnx {} {[@var{v}, @var{lambda}, @var{c}] =} condeig (@var{a})
e859caa53399 condeig.m: New function imported from Octave-Forge linear-algebra package.
Rik <rik@octave.org>
parents:
diff changeset
22 ## Compute condition numbers of a matrix with respect to eigenvalues.
e859caa53399 condeig.m: New function imported from Octave-Forge linear-algebra package.
Rik <rik@octave.org>
parents:
diff changeset
23 ##
e859caa53399 condeig.m: New function imported from Octave-Forge linear-algebra package.
Rik <rik@octave.org>
parents:
diff changeset
24 ## The condition numbers are the reciprocals of the cosines of the angles
e859caa53399 condeig.m: New function imported from Octave-Forge linear-algebra package.
Rik <rik@octave.org>
parents:
diff changeset
25 ## between the left and right eigenvectors; Large values indicate that the
e859caa53399 condeig.m: New function imported from Octave-Forge linear-algebra package.
Rik <rik@octave.org>
parents:
diff changeset
26 ## matrix has multiple distinct eigenvalues.
e859caa53399 condeig.m: New function imported from Octave-Forge linear-algebra package.
Rik <rik@octave.org>
parents:
diff changeset
27 ##
e859caa53399 condeig.m: New function imported from Octave-Forge linear-algebra package.
Rik <rik@octave.org>
parents:
diff changeset
28 ## The input @var{a} must be a square numeric matrix.
e859caa53399 condeig.m: New function imported from Octave-Forge linear-algebra package.
Rik <rik@octave.org>
parents:
diff changeset
29 ##
e859caa53399 condeig.m: New function imported from Octave-Forge linear-algebra package.
Rik <rik@octave.org>
parents:
diff changeset
30 ## The outputs are:
e859caa53399 condeig.m: New function imported from Octave-Forge linear-algebra package.
Rik <rik@octave.org>
parents:
diff changeset
31 ##
e859caa53399 condeig.m: New function imported from Octave-Forge linear-algebra package.
Rik <rik@octave.org>
parents:
diff changeset
32 ## @itemize @bullet
e859caa53399 condeig.m: New function imported from Octave-Forge linear-algebra package.
Rik <rik@octave.org>
parents:
diff changeset
33 ## @item
e859caa53399 condeig.m: New function imported from Octave-Forge linear-algebra package.
Rik <rik@octave.org>
parents:
diff changeset
34 ## @var{c} is a vector of condition numbers for the eigenvalues of
e859caa53399 condeig.m: New function imported from Octave-Forge linear-algebra package.
Rik <rik@octave.org>
parents:
diff changeset
35 ## @var{a}.
e859caa53399 condeig.m: New function imported from Octave-Forge linear-algebra package.
Rik <rik@octave.org>
parents:
diff changeset
36 ##
e859caa53399 condeig.m: New function imported from Octave-Forge linear-algebra package.
Rik <rik@octave.org>
parents:
diff changeset
37 ## @item
e859caa53399 condeig.m: New function imported from Octave-Forge linear-algebra package.
Rik <rik@octave.org>
parents:
diff changeset
38 ## @var{v} is the matrix of right eigenvectors of @var{a}. The result is
22195
93ed9396f2c3 * condeig.m: fix Texinfo markup typo in condeig doc string (bug #48672)
Mike Miller <mtmiller@octave.org>
parents: 22129
diff changeset
39 ## equivalent to calling @code{[@var{v}, @var{lambda}] = eig (@var{a})}.
22129
e859caa53399 condeig.m: New function imported from Octave-Forge linear-algebra package.
Rik <rik@octave.org>
parents:
diff changeset
40 ##
e859caa53399 condeig.m: New function imported from Octave-Forge linear-algebra package.
Rik <rik@octave.org>
parents:
diff changeset
41 ## @item
e859caa53399 condeig.m: New function imported from Octave-Forge linear-algebra package.
Rik <rik@octave.org>
parents:
diff changeset
42 ## @var{lambda} is the diagonal matrix of eigenvalues of @var{a}. The
e859caa53399 condeig.m: New function imported from Octave-Forge linear-algebra package.
Rik <rik@octave.org>
parents:
diff changeset
43 ## result is equivalent to calling
e859caa53399 condeig.m: New function imported from Octave-Forge linear-algebra package.
Rik <rik@octave.org>
parents:
diff changeset
44 ## @code{[@var{v}, @var{lambda}] = eig (@var{a})}.
e859caa53399 condeig.m: New function imported from Octave-Forge linear-algebra package.
Rik <rik@octave.org>
parents:
diff changeset
45 ## @end itemize
e859caa53399 condeig.m: New function imported from Octave-Forge linear-algebra package.
Rik <rik@octave.org>
parents:
diff changeset
46 ##
e859caa53399 condeig.m: New function imported from Octave-Forge linear-algebra package.
Rik <rik@octave.org>
parents:
diff changeset
47 ## Example
e859caa53399 condeig.m: New function imported from Octave-Forge linear-algebra package.
Rik <rik@octave.org>
parents:
diff changeset
48 ##
e859caa53399 condeig.m: New function imported from Octave-Forge linear-algebra package.
Rik <rik@octave.org>
parents:
diff changeset
49 ## @example
e859caa53399 condeig.m: New function imported from Octave-Forge linear-algebra package.
Rik <rik@octave.org>
parents:
diff changeset
50 ## @group
e859caa53399 condeig.m: New function imported from Octave-Forge linear-algebra package.
Rik <rik@octave.org>
parents:
diff changeset
51 ## a = [1, 2; 3, 4];
e859caa53399 condeig.m: New function imported from Octave-Forge linear-algebra package.
Rik <rik@octave.org>
parents:
diff changeset
52 ## c = condeig (a)
e859caa53399 condeig.m: New function imported from Octave-Forge linear-algebra package.
Rik <rik@octave.org>
parents:
diff changeset
53 ## @result{} [1.0150; 1.0150]
e859caa53399 condeig.m: New function imported from Octave-Forge linear-algebra package.
Rik <rik@octave.org>
parents:
diff changeset
54 ## @end group
e859caa53399 condeig.m: New function imported from Octave-Forge linear-algebra package.
Rik <rik@octave.org>
parents:
diff changeset
55 ## @end example
e859caa53399 condeig.m: New function imported from Octave-Forge linear-algebra package.
Rik <rik@octave.org>
parents:
diff changeset
56 ## @seealso{eig, cond, balance}
e859caa53399 condeig.m: New function imported from Octave-Forge linear-algebra package.
Rik <rik@octave.org>
parents:
diff changeset
57 ## @end deftypefn
e859caa53399 condeig.m: New function imported from Octave-Forge linear-algebra package.
Rik <rik@octave.org>
parents:
diff changeset
58
e859caa53399 condeig.m: New function imported from Octave-Forge linear-algebra package.
Rik <rik@octave.org>
parents:
diff changeset
59 function [v, lambda, c] = condeig (a)
e859caa53399 condeig.m: New function imported from Octave-Forge linear-algebra package.
Rik <rik@octave.org>
parents:
diff changeset
60
e859caa53399 condeig.m: New function imported from Octave-Forge linear-algebra package.
Rik <rik@octave.org>
parents:
diff changeset
61 if (nargin != 1)
e859caa53399 condeig.m: New function imported from Octave-Forge linear-algebra package.
Rik <rik@octave.org>
parents:
diff changeset
62 print_usage ();
e859caa53399 condeig.m: New function imported from Octave-Forge linear-algebra package.
Rik <rik@octave.org>
parents:
diff changeset
63 endif
e859caa53399 condeig.m: New function imported from Octave-Forge linear-algebra package.
Rik <rik@octave.org>
parents:
diff changeset
64
e859caa53399 condeig.m: New function imported from Octave-Forge linear-algebra package.
Rik <rik@octave.org>
parents:
diff changeset
65 if (! (isnumeric (a) && issquare (a)))
e859caa53399 condeig.m: New function imported from Octave-Forge linear-algebra package.
Rik <rik@octave.org>
parents:
diff changeset
66 error ("condeig: A must be a square numeric matrix");
e859caa53399 condeig.m: New function imported from Octave-Forge linear-algebra package.
Rik <rik@octave.org>
parents:
diff changeset
67 endif
e859caa53399 condeig.m: New function imported from Octave-Forge linear-algebra package.
Rik <rik@octave.org>
parents:
diff changeset
68
e859caa53399 condeig.m: New function imported from Octave-Forge linear-algebra package.
Rik <rik@octave.org>
parents:
diff changeset
69 if (issparse (a) && nargout <= 1)
e859caa53399 condeig.m: New function imported from Octave-Forge linear-algebra package.
Rik <rik@octave.org>
parents:
diff changeset
70 ## Try to use svds to calculate the condition number as it will typically
e859caa53399 condeig.m: New function imported from Octave-Forge linear-algebra package.
Rik <rik@octave.org>
parents:
diff changeset
71 ## be much faster than calling eig as only the smallest and largest
e859caa53399 condeig.m: New function imported from Octave-Forge linear-algebra package.
Rik <rik@octave.org>
parents:
diff changeset
72 ## eigenvalue are calculated.
e859caa53399 condeig.m: New function imported from Octave-Forge linear-algebra package.
Rik <rik@octave.org>
parents:
diff changeset
73
e859caa53399 condeig.m: New function imported from Octave-Forge linear-algebra package.
Rik <rik@octave.org>
parents:
diff changeset
74 ## FIXME: This calculates one condition number for the entire matrix.
e859caa53399 condeig.m: New function imported from Octave-Forge linear-algebra package.
Rik <rik@octave.org>
parents:
diff changeset
75 ## In the full case, separate condition numbers are calculated for every
e859caa53399 condeig.m: New function imported from Octave-Forge linear-algebra package.
Rik <rik@octave.org>
parents:
diff changeset
76 ## eigenvalue.
e859caa53399 condeig.m: New function imported from Octave-Forge linear-algebra package.
Rik <rik@octave.org>
parents:
diff changeset
77 try
e859caa53399 condeig.m: New function imported from Octave-Forge linear-algebra package.
Rik <rik@octave.org>
parents:
diff changeset
78 s0 = svds (a, 1, 0); # min eigenvalue
e859caa53399 condeig.m: New function imported from Octave-Forge linear-algebra package.
Rik <rik@octave.org>
parents:
diff changeset
79 v = svds (a, 1) / s0; # max eigenvalue
e859caa53399 condeig.m: New function imported from Octave-Forge linear-algebra package.
Rik <rik@octave.org>
parents:
diff changeset
80 catch
e859caa53399 condeig.m: New function imported from Octave-Forge linear-algebra package.
Rik <rik@octave.org>
parents:
diff changeset
81 ## Caught an error as there is a singular value exactly at zero!!
e859caa53399 condeig.m: New function imported from Octave-Forge linear-algebra package.
Rik <rik@octave.org>
parents:
diff changeset
82 v = Inf;
e859caa53399 condeig.m: New function imported from Octave-Forge linear-algebra package.
Rik <rik@octave.org>
parents:
diff changeset
83 end_try_catch
e859caa53399 condeig.m: New function imported from Octave-Forge linear-algebra package.
Rik <rik@octave.org>
parents:
diff changeset
84 return;
e859caa53399 condeig.m: New function imported from Octave-Forge linear-algebra package.
Rik <rik@octave.org>
parents:
diff changeset
85 endif
e859caa53399 condeig.m: New function imported from Octave-Forge linear-algebra package.
Rik <rik@octave.org>
parents:
diff changeset
86
e859caa53399 condeig.m: New function imported from Octave-Forge linear-algebra package.
Rik <rik@octave.org>
parents:
diff changeset
87 ## Right eigenvectors
e859caa53399 condeig.m: New function imported from Octave-Forge linear-algebra package.
Rik <rik@octave.org>
parents:
diff changeset
88 [v, lambda] = eig (a);
e859caa53399 condeig.m: New function imported from Octave-Forge linear-algebra package.
Rik <rik@octave.org>
parents:
diff changeset
89
e859caa53399 condeig.m: New function imported from Octave-Forge linear-algebra package.
Rik <rik@octave.org>
parents:
diff changeset
90 if (isempty (a))
e859caa53399 condeig.m: New function imported from Octave-Forge linear-algebra package.
Rik <rik@octave.org>
parents:
diff changeset
91 c = [];
e859caa53399 condeig.m: New function imported from Octave-Forge linear-algebra package.
Rik <rik@octave.org>
parents:
diff changeset
92 else
e859caa53399 condeig.m: New function imported from Octave-Forge linear-algebra package.
Rik <rik@octave.org>
parents:
diff changeset
93 ## Corresponding left eigenvectors
e859caa53399 condeig.m: New function imported from Octave-Forge linear-algebra package.
Rik <rik@octave.org>
parents:
diff changeset
94 vl = inv (v)';
e859caa53399 condeig.m: New function imported from Octave-Forge linear-algebra package.
Rik <rik@octave.org>
parents:
diff changeset
95 ## Normalize vectors
e859caa53399 condeig.m: New function imported from Octave-Forge linear-algebra package.
Rik <rik@octave.org>
parents:
diff changeset
96 vl ./= repmat (sqrt (sum (abs (vl .^ 2))), rows (vl), 1);
e859caa53399 condeig.m: New function imported from Octave-Forge linear-algebra package.
Rik <rik@octave.org>
parents:
diff changeset
97
e859caa53399 condeig.m: New function imported from Octave-Forge linear-algebra package.
Rik <rik@octave.org>
parents:
diff changeset
98 ## Condition numbers
e859caa53399 condeig.m: New function imported from Octave-Forge linear-algebra package.
Rik <rik@octave.org>
parents:
diff changeset
99 ## Definition: cos (angle) = (norm (v1) * norm (v2)) / dot (v1, v2)
e859caa53399 condeig.m: New function imported from Octave-Forge linear-algebra package.
Rik <rik@octave.org>
parents:
diff changeset
100 ## Eigenvectors have been normalized so `norm (v1) * norm (v2)' = 1
e859caa53399 condeig.m: New function imported from Octave-Forge linear-algebra package.
Rik <rik@octave.org>
parents:
diff changeset
101 c = abs (1 ./ dot (vl, v)');
e859caa53399 condeig.m: New function imported from Octave-Forge linear-algebra package.
Rik <rik@octave.org>
parents:
diff changeset
102 endif
e859caa53399 condeig.m: New function imported from Octave-Forge linear-algebra package.
Rik <rik@octave.org>
parents:
diff changeset
103
e859caa53399 condeig.m: New function imported from Octave-Forge linear-algebra package.
Rik <rik@octave.org>
parents:
diff changeset
104 if (nargout <= 1)
e859caa53399 condeig.m: New function imported from Octave-Forge linear-algebra package.
Rik <rik@octave.org>
parents:
diff changeset
105 v = c;
e859caa53399 condeig.m: New function imported from Octave-Forge linear-algebra package.
Rik <rik@octave.org>
parents:
diff changeset
106 endif
e859caa53399 condeig.m: New function imported from Octave-Forge linear-algebra package.
Rik <rik@octave.org>
parents:
diff changeset
107
e859caa53399 condeig.m: New function imported from Octave-Forge linear-algebra package.
Rik <rik@octave.org>
parents:
diff changeset
108 endfunction
e859caa53399 condeig.m: New function imported from Octave-Forge linear-algebra package.
Rik <rik@octave.org>
parents:
diff changeset
109
e859caa53399 condeig.m: New function imported from Octave-Forge linear-algebra package.
Rik <rik@octave.org>
parents:
diff changeset
110
e859caa53399 condeig.m: New function imported from Octave-Forge linear-algebra package.
Rik <rik@octave.org>
parents:
diff changeset
111 %!test
e859caa53399 condeig.m: New function imported from Octave-Forge linear-algebra package.
Rik <rik@octave.org>
parents:
diff changeset
112 %! a = [1, 2; 3, 4];
e859caa53399 condeig.m: New function imported from Octave-Forge linear-algebra package.
Rik <rik@octave.org>
parents:
diff changeset
113 %! c = condeig (a);
e859caa53399 condeig.m: New function imported from Octave-Forge linear-algebra package.
Rik <rik@octave.org>
parents:
diff changeset
114 %! expected_c = [1.0150; 1.0150];
e859caa53399 condeig.m: New function imported from Octave-Forge linear-algebra package.
Rik <rik@octave.org>
parents:
diff changeset
115 %! assert (c, expected_c, 0.001);
e859caa53399 condeig.m: New function imported from Octave-Forge linear-algebra package.
Rik <rik@octave.org>
parents:
diff changeset
116
e859caa53399 condeig.m: New function imported from Octave-Forge linear-algebra package.
Rik <rik@octave.org>
parents:
diff changeset
117 %!test
e859caa53399 condeig.m: New function imported from Octave-Forge linear-algebra package.
Rik <rik@octave.org>
parents:
diff changeset
118 %! a = [1, 3; 5, 8];
e859caa53399 condeig.m: New function imported from Octave-Forge linear-algebra package.
Rik <rik@octave.org>
parents:
diff changeset
119 %! [v, lambda, c] = condeig (a);
e859caa53399 condeig.m: New function imported from Octave-Forge linear-algebra package.
Rik <rik@octave.org>
parents:
diff changeset
120 %! [expected_v, expected_lambda] = eig (a);
e859caa53399 condeig.m: New function imported from Octave-Forge linear-algebra package.
Rik <rik@octave.org>
parents:
diff changeset
121 %! expected_c = [1.0182; 1.0182];
e859caa53399 condeig.m: New function imported from Octave-Forge linear-algebra package.
Rik <rik@octave.org>
parents:
diff changeset
122 %! assert (v, expected_v, 0.001);
e859caa53399 condeig.m: New function imported from Octave-Forge linear-algebra package.
Rik <rik@octave.org>
parents:
diff changeset
123 %! assert (lambda, expected_lambda, 0.001);
e859caa53399 condeig.m: New function imported from Octave-Forge linear-algebra package.
Rik <rik@octave.org>
parents:
diff changeset
124 %! assert (c, expected_c, 0.001);
e859caa53399 condeig.m: New function imported from Octave-Forge linear-algebra package.
Rik <rik@octave.org>
parents:
diff changeset
125
e859caa53399 condeig.m: New function imported from Octave-Forge linear-algebra package.
Rik <rik@octave.org>
parents:
diff changeset
126 # Test empty input
e859caa53399 condeig.m: New function imported from Octave-Forge linear-algebra package.
Rik <rik@octave.org>
parents:
diff changeset
127 %!assert (condeig ([]), [])
e859caa53399 condeig.m: New function imported from Octave-Forge linear-algebra package.
Rik <rik@octave.org>
parents:
diff changeset
128
e859caa53399 condeig.m: New function imported from Octave-Forge linear-algebra package.
Rik <rik@octave.org>
parents:
diff changeset
129 ## Test input validation
e859caa53399 condeig.m: New function imported from Octave-Forge linear-algebra package.
Rik <rik@octave.org>
parents:
diff changeset
130 %!error condeig ()
e859caa53399 condeig.m: New function imported from Octave-Forge linear-algebra package.
Rik <rik@octave.org>
parents:
diff changeset
131 %!error condeig (1,2)
e859caa53399 condeig.m: New function imported from Octave-Forge linear-algebra package.
Rik <rik@octave.org>
parents:
diff changeset
132 %!error <A must be a square numeric matrix> condeig ({1})
e859caa53399 condeig.m: New function imported from Octave-Forge linear-algebra package.
Rik <rik@octave.org>
parents:
diff changeset
133 %!error <A must be a square numeric matrix> condeig (ones (3,2))
e859caa53399 condeig.m: New function imported from Octave-Forge linear-algebra package.
Rik <rik@octave.org>
parents:
diff changeset
134 %!error <A must be a square numeric matrix> condeig (ones (2,2,2))
e859caa53399 condeig.m: New function imported from Octave-Forge linear-algebra package.
Rik <rik@octave.org>
parents:
diff changeset
135