Mercurial > hg > octave-nkf
annotate scripts/linear-algebra/rank.m @ 19840:c5270263d466 gui-release
close gui-release branch
author | John W. Eaton <jwe@octave.org> |
---|---|
date | Fri, 30 Jan 2015 17:41:50 -0500 |
parents | d63878346099 |
children | 4197fc428c7d |
rev | line source |
---|---|
17744
d63878346099
maint: Update copyright notices for release.
John W. Eaton <jwe@octave.org>
parents:
16952
diff
changeset
|
1 ## Copyright (C) 1993-2013 John W. Eaton |
2313 | 2 ## |
3 ## This file is part of Octave. | |
4 ## | |
5 ## Octave is free software; you can redistribute it and/or modify it | |
6 ## under the terms of the GNU General Public License as published by | |
7016 | 7 ## the Free Software Foundation; either version 3 of the License, or (at |
8 ## your option) any later version. | |
2313 | 9 ## |
10 ## Octave is distributed in the hope that it will be useful, but | |
11 ## WITHOUT ANY WARRANTY; without even the implied warranty of | |
12 ## MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU | |
13 ## General Public License for more details. | |
14 ## | |
15 ## You should have received a copy of the GNU General Public License | |
7016 | 16 ## along with Octave; see the file COPYING. If not, see |
17 ## <http://www.gnu.org/licenses/>. | |
245 | 18 |
3372 | 19 ## -*- texinfo -*- |
12584
7ef7e20057fa
Improve documentation strings in Linear Algebra chapter.
Rik <octave@nomad.inbox5.com>
parents:
11523
diff
changeset
|
20 ## @deftypefn {Function File} {} rank (@var{A}) |
7ef7e20057fa
Improve documentation strings in Linear Algebra chapter.
Rik <octave@nomad.inbox5.com>
parents:
11523
diff
changeset
|
21 ## @deftypefnx {Function File} {} rank (@var{A}, @var{tol}) |
16952 | 22 ## Compute the rank of matrix @var{A}, using the singular value decomposition. |
23 ## | |
11470
eb9e0b597d61
Use common names for variables in documentation and code for a few more m-script files.
Rik <octave@nomad.inbox5.com>
parents:
10549
diff
changeset
|
24 ## The rank is taken to be the number of singular values of @var{A} that |
3372 | 25 ## are greater than the specified tolerance @var{tol}. If the second |
26 ## argument is omitted, it is taken to be | |
3426 | 27 ## |
3372 | 28 ## @example |
11470
eb9e0b597d61
Use common names for variables in documentation and code for a few more m-script files.
Rik <octave@nomad.inbox5.com>
parents:
10549
diff
changeset
|
29 ## tol = max (size (@var{A})) * sigma(1) * eps; |
3372 | 30 ## @end example |
3426 | 31 ## |
3372 | 32 ## @noindent |
3600 | 33 ## where @code{eps} is machine precision and @code{sigma(1)} is the largest |
11470
eb9e0b597d61
Use common names for variables in documentation and code for a few more m-script files.
Rik <octave@nomad.inbox5.com>
parents:
10549
diff
changeset
|
34 ## singular value of @var{A}. |
16952 | 35 ## |
36 ## The rank of a matrix is the number of linearly independent rows or | |
37 ## columns and determines how many particular solutions exist to a system | |
38 ## of equations. Use @code{null} for finding the remaining homogenous | |
39 ## solutions. | |
40 ## | |
41 ## Example: | |
42 ## | |
43 ## @example | |
44 ## @group | |
45 ## x = [1 2 3 | |
46 ## 4 5 6 | |
47 ## 7 8 9]; | |
48 ## rank (x) | |
49 ## @result{} 2 | |
50 ## @end group | |
51 ## @end example | |
52 ## | |
53 ## @noindent | |
54 ## The number of linearly independent rows is only 2 because the final row | |
55 ## is a linear combination of -1*row1 + 2*row2. | |
56 ## | |
57 ## @seealso{null, sprank, svd} | |
3372 | 58 ## @end deftypefn |
4 | 59 |
2314 | 60 ## Author: jwe |
61 | |
2311 | 62 function retval = rank (A, tol) |
4 | 63 |
64 if (nargin == 1) | |
65 sigma = svd (A); | |
4706 | 66 if (isempty (sigma)) |
67 tolerance = 0; | |
68 else | |
7795
df9519e9990c
Handle single precision eps values
David Bateman <dbateman@free.fr>
parents:
7017
diff
changeset
|
69 if (isa (A, "single")) |
10549 | 70 tolerance = max (size (A)) * sigma (1) * eps ("single"); |
7795
df9519e9990c
Handle single precision eps values
David Bateman <dbateman@free.fr>
parents:
7017
diff
changeset
|
71 else |
10549 | 72 tolerance = max (size (A)) * sigma (1) * eps; |
7795
df9519e9990c
Handle single precision eps values
David Bateman <dbateman@free.fr>
parents:
7017
diff
changeset
|
73 endif |
4706 | 74 endif |
4 | 75 elseif (nargin == 2) |
262 | 76 sigma = svd (A); |
4 | 77 tolerance = tol; |
78 else | |
6046 | 79 print_usage (); |
4 | 80 endif |
4706 | 81 |
4 | 82 retval = sum (sigma > tolerance); |
83 | |
84 endfunction | |
12813
8c4605b4d0c8
codesprint: Wrote 6 tests for rank.m
David Wells <drwells@vt.edu>
parents:
12584
diff
changeset
|
85 |
14363
f3d52523cde1
Use Octave coding conventions in all m-file %!test blocks
Rik <octave@nomad.inbox5.com>
parents:
14138
diff
changeset
|
86 |
12813
8c4605b4d0c8
codesprint: Wrote 6 tests for rank.m
David Wells <drwells@vt.edu>
parents:
12584
diff
changeset
|
87 %!test |
13141
e81ddf9cacd5
maint: untabify and remove trailing whitespace from source files
John W. Eaton <jwe@octave.org>
parents:
12813
diff
changeset
|
88 %! A = [1 2 3 4 5 6 7; |
e81ddf9cacd5
maint: untabify and remove trailing whitespace from source files
John W. Eaton <jwe@octave.org>
parents:
12813
diff
changeset
|
89 %! 4 5 6 7 8 9 12; |
e81ddf9cacd5
maint: untabify and remove trailing whitespace from source files
John W. Eaton <jwe@octave.org>
parents:
12813
diff
changeset
|
90 %! 1 2 3.1 4 5 6 7; |
e81ddf9cacd5
maint: untabify and remove trailing whitespace from source files
John W. Eaton <jwe@octave.org>
parents:
12813
diff
changeset
|
91 %! 2 3 4 5 6 7 8; |
e81ddf9cacd5
maint: untabify and remove trailing whitespace from source files
John W. Eaton <jwe@octave.org>
parents:
12813
diff
changeset
|
92 %! 3 4 5 6 7 8 9; |
e81ddf9cacd5
maint: untabify and remove trailing whitespace from source files
John W. Eaton <jwe@octave.org>
parents:
12813
diff
changeset
|
93 %! 4 5 6 7 8 9 10; |
12813
8c4605b4d0c8
codesprint: Wrote 6 tests for rank.m
David Wells <drwells@vt.edu>
parents:
12584
diff
changeset
|
94 %! 5 6 7 8 9 10 11]; |
14363
f3d52523cde1
Use Octave coding conventions in all m-file %!test blocks
Rik <octave@nomad.inbox5.com>
parents:
14138
diff
changeset
|
95 %! assert (rank (A), 4); |
12813
8c4605b4d0c8
codesprint: Wrote 6 tests for rank.m
David Wells <drwells@vt.edu>
parents:
12584
diff
changeset
|
96 |
8c4605b4d0c8
codesprint: Wrote 6 tests for rank.m
David Wells <drwells@vt.edu>
parents:
12584
diff
changeset
|
97 %!test |
13141
e81ddf9cacd5
maint: untabify and remove trailing whitespace from source files
John W. Eaton <jwe@octave.org>
parents:
12813
diff
changeset
|
98 %! A = [1 2 3 4 5 6 7; |
e81ddf9cacd5
maint: untabify and remove trailing whitespace from source files
John W. Eaton <jwe@octave.org>
parents:
12813
diff
changeset
|
99 %! 4 5 6 7 8 9 12; |
e81ddf9cacd5
maint: untabify and remove trailing whitespace from source files
John W. Eaton <jwe@octave.org>
parents:
12813
diff
changeset
|
100 %! 1 2 3.0000001 4 5 6 7; |
e81ddf9cacd5
maint: untabify and remove trailing whitespace from source files
John W. Eaton <jwe@octave.org>
parents:
12813
diff
changeset
|
101 %! 4 5 6 7 8 9 12.00001; |
e81ddf9cacd5
maint: untabify and remove trailing whitespace from source files
John W. Eaton <jwe@octave.org>
parents:
12813
diff
changeset
|
102 %! 3 4 5 6 7 8 9; |
e81ddf9cacd5
maint: untabify and remove trailing whitespace from source files
John W. Eaton <jwe@octave.org>
parents:
12813
diff
changeset
|
103 %! 4 5 6 7 8 9 10; |
12813
8c4605b4d0c8
codesprint: Wrote 6 tests for rank.m
David Wells <drwells@vt.edu>
parents:
12584
diff
changeset
|
104 %! 5 6 7 8 9 10 11]; |
14363
f3d52523cde1
Use Octave coding conventions in all m-file %!test blocks
Rik <octave@nomad.inbox5.com>
parents:
14138
diff
changeset
|
105 %! assert (rank (A), 4); |
12813
8c4605b4d0c8
codesprint: Wrote 6 tests for rank.m
David Wells <drwells@vt.edu>
parents:
12584
diff
changeset
|
106 |
8c4605b4d0c8
codesprint: Wrote 6 tests for rank.m
David Wells <drwells@vt.edu>
parents:
12584
diff
changeset
|
107 %!test |
13141
e81ddf9cacd5
maint: untabify and remove trailing whitespace from source files
John W. Eaton <jwe@octave.org>
parents:
12813
diff
changeset
|
108 %! A = [1 2 3 4 5 6 7; |
e81ddf9cacd5
maint: untabify and remove trailing whitespace from source files
John W. Eaton <jwe@octave.org>
parents:
12813
diff
changeset
|
109 %! 4 5 6 7 8 9 12; |
e81ddf9cacd5
maint: untabify and remove trailing whitespace from source files
John W. Eaton <jwe@octave.org>
parents:
12813
diff
changeset
|
110 %! 1 2 3 4 5 6 7; |
e81ddf9cacd5
maint: untabify and remove trailing whitespace from source files
John W. Eaton <jwe@octave.org>
parents:
12813
diff
changeset
|
111 %! 4 5 6 7 8 9 12.00001; |
12813
8c4605b4d0c8
codesprint: Wrote 6 tests for rank.m
David Wells <drwells@vt.edu>
parents:
12584
diff
changeset
|
112 %! 3 4 5 6 7 8 9; |
13141
e81ddf9cacd5
maint: untabify and remove trailing whitespace from source files
John W. Eaton <jwe@octave.org>
parents:
12813
diff
changeset
|
113 %! 4 5 6 7 8 9 10; |
12813
8c4605b4d0c8
codesprint: Wrote 6 tests for rank.m
David Wells <drwells@vt.edu>
parents:
12584
diff
changeset
|
114 %! 5 6 7 8 9 10 11]; |
14363
f3d52523cde1
Use Octave coding conventions in all m-file %!test blocks
Rik <octave@nomad.inbox5.com>
parents:
14138
diff
changeset
|
115 %! assert (rank (A), 3); |
12813
8c4605b4d0c8
codesprint: Wrote 6 tests for rank.m
David Wells <drwells@vt.edu>
parents:
12584
diff
changeset
|
116 |
8c4605b4d0c8
codesprint: Wrote 6 tests for rank.m
David Wells <drwells@vt.edu>
parents:
12584
diff
changeset
|
117 %!test |
13141
e81ddf9cacd5
maint: untabify and remove trailing whitespace from source files
John W. Eaton <jwe@octave.org>
parents:
12813
diff
changeset
|
118 %! A = [1 2 3 4 5 6 7; |
12813
8c4605b4d0c8
codesprint: Wrote 6 tests for rank.m
David Wells <drwells@vt.edu>
parents:
12584
diff
changeset
|
119 %! 4 5 6 7 8 9 12; |
8c4605b4d0c8
codesprint: Wrote 6 tests for rank.m
David Wells <drwells@vt.edu>
parents:
12584
diff
changeset
|
120 %! 1 2 3 4 5 6 7; |
13141
e81ddf9cacd5
maint: untabify and remove trailing whitespace from source files
John W. Eaton <jwe@octave.org>
parents:
12813
diff
changeset
|
121 %! 4 5 6 7 8 9 12; |
e81ddf9cacd5
maint: untabify and remove trailing whitespace from source files
John W. Eaton <jwe@octave.org>
parents:
12813
diff
changeset
|
122 %! 3 4 5 6 7 8 9; |
e81ddf9cacd5
maint: untabify and remove trailing whitespace from source files
John W. Eaton <jwe@octave.org>
parents:
12813
diff
changeset
|
123 %! 4 5 6 7 8 9 10; |
12813
8c4605b4d0c8
codesprint: Wrote 6 tests for rank.m
David Wells <drwells@vt.edu>
parents:
12584
diff
changeset
|
124 %! 5 6 7 8 9 10 11]; |
14363
f3d52523cde1
Use Octave coding conventions in all m-file %!test blocks
Rik <octave@nomad.inbox5.com>
parents:
14138
diff
changeset
|
125 %! assert (rank (A), 3); |
12813
8c4605b4d0c8
codesprint: Wrote 6 tests for rank.m
David Wells <drwells@vt.edu>
parents:
12584
diff
changeset
|
126 |
8c4605b4d0c8
codesprint: Wrote 6 tests for rank.m
David Wells <drwells@vt.edu>
parents:
12584
diff
changeset
|
127 %!test |
14363
f3d52523cde1
Use Octave coding conventions in all m-file %!test blocks
Rik <octave@nomad.inbox5.com>
parents:
14138
diff
changeset
|
128 %! A = eye (100); |
f3d52523cde1
Use Octave coding conventions in all m-file %!test blocks
Rik <octave@nomad.inbox5.com>
parents:
14138
diff
changeset
|
129 %! assert (rank (A), 100); |
12813
8c4605b4d0c8
codesprint: Wrote 6 tests for rank.m
David Wells <drwells@vt.edu>
parents:
12584
diff
changeset
|
130 |
16952 | 131 %!assert (rank ([]), 0) |
132 %!assert (rank ([1:9]), 1) | |
133 %!assert (rank ([1:9]'), 1) | |
134 | |
12813
8c4605b4d0c8
codesprint: Wrote 6 tests for rank.m
David Wells <drwells@vt.edu>
parents:
12584
diff
changeset
|
135 %!test |
8c4605b4d0c8
codesprint: Wrote 6 tests for rank.m
David Wells <drwells@vt.edu>
parents:
12584
diff
changeset
|
136 %! A = [1, 2, 3; 1, 2.001, 3; 1, 2, 3.0000001]; |
14363
f3d52523cde1
Use Octave coding conventions in all m-file %!test blocks
Rik <octave@nomad.inbox5.com>
parents:
14138
diff
changeset
|
137 %! assert (rank (A), 3); |
f3d52523cde1
Use Octave coding conventions in all m-file %!test blocks
Rik <octave@nomad.inbox5.com>
parents:
14138
diff
changeset
|
138 %! assert (rank (A,0.0009), 1); |
f3d52523cde1
Use Octave coding conventions in all m-file %!test blocks
Rik <octave@nomad.inbox5.com>
parents:
14138
diff
changeset
|
139 %! assert (rank (A,0.0006), 2); |
f3d52523cde1
Use Octave coding conventions in all m-file %!test blocks
Rik <octave@nomad.inbox5.com>
parents:
14138
diff
changeset
|
140 %! assert (rank (A,0.00000002), 3); |
f3d52523cde1
Use Octave coding conventions in all m-file %!test blocks
Rik <octave@nomad.inbox5.com>
parents:
14138
diff
changeset
|
141 |