Mercurial > octave-nkf
comparison scripts/linear-algebra/condest.m @ 7312:1ebbf0924217
[project @ 2007-12-12 22:19:54 by jwe]
author | jwe |
---|---|
date | Wed, 12 Dec 2007 22:22:10 +0000 |
parents | 1b535aed87e2 |
children | fa78cb8d8a5c |
comparison
equal
deleted
inserted
replaced
7311:1b535aed87e2 | 7312:1ebbf0924217 |
---|---|
109 print_usage (); | 109 print_usage (); |
110 endif | 110 endif |
111 | 111 |
112 default_t = 5; | 112 default_t = 5; |
113 | 113 |
114 have_A = false; | |
115 have_t = false; | |
116 have_solve = false; | |
117 | |
114 if (ismatrix (varargin{1})) | 118 if (ismatrix (varargin{1})) |
115 A = varargin{1}; | 119 A = varargin{1}; |
116 n = issquare (A); | 120 n = issquare (A); |
117 if (! n) | 121 if (! n) |
118 error ("condest: matrix must be square."); | 122 error ("condest: matrix must be square."); |
119 endif | 123 endif |
120 | 124 have_A = true; |
121 if (nargin > 1 && isscalar (varargin{2})) | 125 |
122 t = varargin{2}; | 126 if (nargin > 1) |
123 elseif (nargin > 2) | 127 if (isscalar (varargin{2})) |
124 solve = varargin{2}; | 128 t = varargin{2}; |
125 solve_t = varargin{3}; | 129 have_t = true; |
126 if (nargin > 3) | 130 elseif (nargin > 2) |
127 t = varargin{4}; | 131 solve = varargin{2}; |
132 solve_t = varargin{3}; | |
133 have_solve = true; | |
134 if (nargin > 3) | |
135 t = varargin{4}; | |
136 have_t = true; | |
137 endif | |
138 else | |
139 error ("condest: must supply both solve and solve_t."); | |
128 endif | 140 endif |
129 else | |
130 error ("condest: must supply both solve and solve_t."); | |
131 endif | 141 endif |
132 elseif (nargin > 4) | 142 elseif (nargin > 4) |
133 apply = varargin{1}; | 143 apply = varargin{1}; |
134 apply_t = varargin{2}; | 144 apply_t = varargin{2}; |
135 solve = varargin{3}; | 145 solve = varargin{3}; |
136 solve_t = varargin{4}; | 146 solve_t = varargin{4}; |
147 have_solve = true; | |
137 n = varargin{5}; | 148 n = varargin{5}; |
138 if (! isscalar (n)) | 149 if (! isscalar (n)) |
139 error ("condest: dimension argument of implicit form must be scalar."); | 150 error ("condest: dimension argument of implicit form must be scalar."); |
140 endif | 151 endif |
141 if (nargin > 5) | 152 if (nargin > 5) |
142 t = varargin{6}; | 153 t = varargin{6}; |
154 have_t = true; | |
143 endif | 155 endif |
144 else | 156 else |
145 error ("condest: implicit form of condest requires at least 5 arguments."); | 157 error ("condest: implicit form of condest requires at least 5 arguments."); |
146 endif | 158 endif |
147 | 159 |
148 if (! exist ("t", "var")) | 160 if (! have_t) |
149 t = min (n, default_t); | 161 t = min (n, default_t); |
150 endif | 162 endif |
151 | 163 |
152 if (! exist ("solve", "var")) | 164 if (! have_solve) |
153 if (issparse (A)) | 165 if (issparse (A)) |
154 [L, U, P, Pc] = splu (A); | 166 [L, U, P, Pc] = splu (A); |
155 solve = @(x) Pc' * (U\ (L\ (P*x))); | 167 solve = @(x) Pc' * (U \ (L \ (P * x))); |
156 solve_t = @(x) P'*(L'\ (U'\ (Pc*x))); | 168 solve_t = @(x) P' * (L' \ (U' \ (Pc * x))); |
157 else | 169 else |
158 [L, U, P] = lu (A); | 170 [L, U, P] = lu (A); |
159 solve = @(x) U\ (L\ (P*x)); | 171 solve = @(x) U \ (L \ (P*x)); |
160 solve_t = @(x) P' * (L'\ (U'\x)); | 172 solve_t = @(x) P' * (L' \ (U' \ x)); |
161 endif | 173 endif |
162 endif | 174 endif |
163 | 175 |
164 if (exist ("A", "var")) | 176 if (have_A) |
165 Anorm = norm (A, 1); | 177 Anorm = norm (A, 1); |
166 else | 178 else |
167 Anorm = onenormest (apply, apply_t, n, t); | 179 Anorm = onenormest (apply, apply_t, n, t); |
168 endif | 180 endif |
169 | 181 |