Re: rcond, condest, and a block 1-norm estimator
David Bateman <[email protected]> Thu, 22 Nov 2007 01:39:51 +0100
| Newsgroups | gmane.comp.gnu.octave.sources |
|---|---|
| Organization | Motorola CRM |
| Message-ID | <[email protected]> |
I believe the rcond function should take rcond from the LAPACK
factorization, at least I believe is what matlab does. Matlab calls the
normest1 function, that is basically your block_onenorm_est, and then
multiples the estimated inverse norm by norm(A,1) to get the condition
number estimate.
condest is one of the annoying missing sparse functions in Octave and I
appreciate that your code treats sparse matrices as a special case. I'd
hesitate to include it though with the rcond function with its current
name...
D.
Jason Riedy wrote:
> Appended are the rcond(), condest(), and block_onenorm_est()
> routines I've been using. I don't think they exactly match the
> MATLAB(tm) routines, but I also don't care. ;) The files also
> are living at
> http://www.cs.berkeley.edu/~ejr/dev/linalg/
> for now.
> =
> They have been moderately beaten around, but there still may be
> bugs lurking. I'm not 100% sure I'm handling complex matrices
> correctly, but I also haven't run into any noticable problems.
> =
> Improvements and bug fixes gleefully accepted.
> =
> Jason
> =
> =
> =
> ------------------------------------------------------------------------
> =
> ## Copyright (C) 2007, Regents of the University of California
> ## -*- mode: octave; -*-
> ##
> ## This program is free software distributed under the "modified" or
> ## 3-clause BSD license appended to this file.
> =
> function [est, v, w] =3D rcond (varargin)
> ## -*- texinfo -*-
> ## @deftypefn {Function File} {[@var{est}, @var{v}] =3D } rcond (@var{A=
}, @var{t} =3D min (size (A, 1), 5)) =
> ## @deftypefnx {Function File} {[@var{est}, @var{v}] =3D } rcond (@var{=
A}, @var{SOLVE}, @var{SOVLE_T}, @var{t} =3D min (n, 5))
> ## @deftypefnx {Function File} {[@var{est}, @var{v}] =3D } rcond (@var{=
APPLY}, @var{APPLY_T}, @var{SOLVE}, @var{SOVLE_T}, @var{n}, @var{t} =3D min=
(n, 5))
> ##
> ## Estimate the inverse of the 1-norm condition number of a matrix
> ## matrix @var{A} using @var{t} test vectors pusing the randomized
> ## 1-norm estimator in block_onenorm_est. If the matrix is not
> ## explicit, e.g. when estimating the condition number of @var{A}
> ## given an LU factorization, rcond uses the following functions:
> ##
> ## @table @var
> ## @item APPLY
> ## @code{A*x} for a matrix @code{x} of size @var{n} by @var{t}.
> ## @item APPLY_T
> ## @code{A'*x} for a matrix @code{x} of size @var{n} by @var{t}.
> ## @item SOLVE
> ## @code{A \ b} for a matrix @code{b} of size @var{n} by @var{t}.
> ## @item SOLVE_T
> ## @code{A' \ b} for a matrix @code{b} of size @var{n} by @var{t}.
> ## @end table
> ##
> ## The implicit version requires an explicit dimension @var{n}.
> ##
> ## @code{rcond} uses a randomized algorithm to approximate
> ## the 1-norms.
> ##
> ## @code{rcond} returns the inverse of the 1-norm condition estimate
> ## @var{est} and a vector @var{v} satisfying @code{norm
> ## (@var{A}*@var{v}, 1) =3D=3D norm (@var{A}, 1) * norm (@var{v}, 1) *
> ## @var{est}}. When @var{est} is large, @var{v} is an approximate null
> ## vector.
> ##
> ## References: =
> ## @itemize
> ## @item Nicholas J. Higham and Fran=E7oise Tisseur, "A Block Algorithm
> ## for Matrix 1-Norm Estimation, with an Application to 1-Norm
> ## Pseudospectra." SIMAX vol 21, no 4, pp 1185-1201.
> ## http://dx.doi.org/10.1137/S0895479899356080
> ## @item Nicholas J. Higham and Fran=E7oise Tisseur, "A Block Algorithm
> ## for Matrix 1-Norm Estimation, with an Application to 1-Norm
> ## Pseudospectra." http://citeseer.ist.psu.edu/223007.html
> ## @end itemize
> ##
> ## @seealso{block_onenorm_est, condest, norm, cond}
> ##
> ## @end deftypefn
> =
> ## Author: Jason Riedy <[email protected]>
> ## Keywords: linear-algebra norm estimation
> ## Version: 0.2
> =
> %!demo
> %! N =3D 100;
> %! A =3D randn (N) + eye (N);
> %! rcond (A)
> %! [L,U,P] =3D lu (A);
> %! rcond (A, @(x) U\ (L\ (P*x)), @(x) P'*(L'\ (U'\x)))
> %! rcond (@(x) A*x, @(x) A'*x, @(x) U\ (L\ (P*x)), @(x) P'*(L'\ (U'\x)),=
N)
> %! 1 / (norm (inv (A), 1) * norm (A, 1))
> =
> if size (varargin, 2) < 1 || size (varargin, 2) > 5,
> usage("rcond: Incorrect arguments.");
> endif
> =
> DEFAULT_T =3D 5;
> ITMAX =3D 10;
> =
> if ismatrix (varargin{1}),
> n =3D size (varargin{1}, 1);
> if n !=3D size (varargin{1}, 2),
> usage("Matrix must be square.");
> endif
> A =3D varargin{1};
> =
> if size (varargin, 2) > 1,
> if isscalar (varargin{2}),
> t =3D varargin{2};
> else
> if size (varargin, 2) < 3,
> usage("Must supply both SOLVE and SOLVE_T.");
> else
> SOLVE =3D varargin{2};
> SOLVE_T =3D varargin{3};
> if size (varargin, 2) > 3,
> t =3D varargin{4};
> endif
> endif
> endif
> endif
> else
> if size (varargin, 2) < 5,
> usage("Implicit form of rcond requires at least 5 arguments.");
> endif
> APPLY =3D varargin{1};
> APPLY_T =3D varargin{2};
> SOLVE =3D varargin{3};
> SOLVE_T =3D varargin{4};
> n =3D varargin{5};
> if !isscalar (n),
> usage("Dimension argument of implicit form must be scalar.");
> endif
> if size (varargin, 2) > 5,
> t =3D varargin{6};
> endif
> endif
> =
> if !exist ("t", "var"),
> t =3D min (n, DEFAULT_T);
> endif
> =
> if !exist ("SOLVE", "var"),
> if issparse (A),
> colord =3D colamd(A);
> Pc =3D speye(n);
> Pc(:,colord) =3D Pc;
> [L,U,P] =3D lu(A(:,Pc));
> SOLVE =3D @(x) Pc' * (U\ (L\ (P*x)));
> SOLVE_T =3D @(x) P'*(L'\ (U'\ (Pc*x)));
> else
> [L,U,P] =3D lu(A);
> SOLVE =3D @(x) U\ (L\ (P*x));
> SOLVE_T =3D @(x) P' * (L'\ (U'\x));
> endif
> endif
> =
> if exist ("A", "var"),
> Anorm =3D norm(A, 1);
> else
> Anorm =3D block_onenorm_est(APPLY, APPLY_T, n, t);
> endif
> =
> [Ainv_norm, v, w] =3D block_onenorm_est(SOLVE, SOLVE_T, n, t);
> =
> est =3D 1/Anorm;
> est /=3D Ainv_norm;
> v =3D w / norm (w, 1);
> =
> endfunction
> =
> ## Yes, these test bounds are really loose. There's
> ## enough randomization to trigger odd cases with hilb().
> =
> %!test
> %! N =3D 6;
> %! A =3D hilb (N);
> %! cA =3D 1 / rcond (A);
> %! cA_test =3D norm (inv (A), 1) * norm (A, 1);
> %! assert (cA, cA_test, 2**-12);
> =
> %!test
> %! N =3D 6;
> %! A =3D hilb (N);
> %! SOLVE =3D @(x) A\x; SOLVE_T =3D @(x) A'\x;
> %! cA =3D 1 / rcond (A, SOLVE, SOLVE_T);
> %! cA_test =3D norm (inv (A), 1) * norm (A, 1);
> %! assert (cA, cA_test, 2**-12);
> =
> %!test
> %! N =3D 6;
> %! A =3D hilb (N);
> %! APPLY =3D @(x) A*x; APPLY_T =3D @(x) A'*x;
> %! SOLVE =3D @(x) A\x; SOLVE_T =3D @(x) A'\x;
> %! cA =3D 1 / rcond (APPLY, APPLY_T, SOLVE, SOLVE_T, N);
> %! cA_test =3D norm (inv (A), 1) * norm (A, 1);
> %! assert (cA, cA_test, 2**-6);
> =
> %!test
> %! N =3D 12;
> %! A =3D hilb (N);
> %! [rcondA, v] =3D rcond (A);
> %! x =3D A*v;
> %! assert (norm(x, inf), 0, eps);
> =
> ## Copyright (c) 2007, Regents of the University of California
> ## All rights reserved.
> ## Redistribution and use in source and binary forms, with or without
> ## modification, are permitted provided that the following conditions are=
met:
> ##
> ## * Redistributions of source code must retain the above copyright
> ## notice, this list of conditions and the following disclaimer.
> ## * Redistributions in binary form must reproduce the above copyright
> ## notice, this list of conditions and the following disclaimer in =
the
> ## documentation and/or other materials provided with the distribut=
ion.
> ## * Neither the name of the University of California, Berkeley nor t=
he
> ## names of its contributors may be used to endorse or promote prod=
ucts
> ## derived from this software without specific prior written permis=
sion.
> ##
> ## THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AN=
D ANY
> ## EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPL=
IED
> ## WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
> ## DISCLAIMED. IN NO EVENT SHALL THE REGENTS AND CONTRIBUTORS BE LIABLE F=
OR ANY
> ## DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAM=
AGES
> ## (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SER=
VICES;
> ## LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSE=
D AND
> ## ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR =
TORT
> ## (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE =
OF THIS
> ## SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
> =
> =
> ------------------------------------------------------------------------
> =
> ## Copyright (C) 2007, Regents of the University of California
> ## -*- mode: octave; -*-
> ##
> ## This program is free software distributed under the "modified" or
> ## 3-clause BSD license appended to this file.
> =
> function [est, v, w, iter] =3D block_onenorm_est (varargin)
> ## -*- texinfo -*-
> ## @deftypefn {Function File} {[@var{est}, @var{v}, @var{w}, @var{iter}=
] =3D } block_onenorm_est (@var{A}, @var{t} =3D min (size (A, 1), 5)) =
> ## @deftypefnx {Function File} {[@var{est}, @var{v}, @var{w}, @var{iter=
}] =3D } block_onenorm_est (@var{APPLY}, @var{APPLY_T}, @var{n}, @var{t} =
=3D min (n, 5))
> ##
> ## Apply Higham and Tisseur's randomized block 1-norm estimator to
> ## matrix @var{A} using @var{t} test vectors. If the matrix is not
> ## explicit, e.g. when estimating the norm of @code{inv(@var{A})} given=
an
> ## LU factorization, block_onenorm_est applies @var{A} and its conjugate
> ## transpose through a pair of functions @var{APPLY} and @var{APPLY_T},
> ## respectively, to a dense matrix of size @var{n} by @var{t}. The
> ## implicit version requires an explicit dimension @var{n}.
> ##
> ## Returns the norm estimate @var{est}, two vectors @var{v} and
> ## @var{w} related by norm
> ## @code{(@var{w}, 1) =3D @var{est} * norm (@var{v}, 1)},
> ## and the number of iterations @var{iter}. The number of
> ## iterations is limited to 10 and is at least 2.
> ##
> ## References: =
> ## @itemize
> ## @item Nicholas J. Higham and Fran=E7oise Tisseur, "A Block Algorithm
> ## for Matrix 1-Norm Estimation, with an Application to 1-Norm
> ## Pseudospectra." SIMAX vol 21, no 4, pp 1185-1201.
> ## http://dx.doi.org/10.1137/S0895479899356080
> ## @item Nicholas J. Higham and Fran=E7oise Tisseur, "A Block Algorithm
> ## for Matrix 1-Norm Estimation, with an Application to 1-Norm
> ## Pseudospectra." http://citeseer.ist.psu.edu/223007.html
> ## @end itemize
> ##
> ## @seealso{condest, norm, cond}
> ##
> ## @end deftypefn
> =
> ## Author: Jason Riedy <[email protected]>
> ## Keywords: linear-algebra norm estimation
> ## Version: 0.2
> =
> %!demo
> %! N =3D 100;
> %! A =3D randn(N) + eye(N);
> %! [L,U,P] =3D lu(A);
> %! nm1inv =3D block_onenorm_est(@(x) U\(L\(P*x)), @(x) P'*(L'\(U'\x)), \
> %! N, 30)
> %! norm(inv(A), 1)
> =
> if size (varargin, 2) < 1 || size (varargin, 2) > 4,
> print_usage();
> endif
> =
> DEFAULT_T =3D 5;
> ITMAX =3D 10;
> =
> if ismatrix (varargin{1}),
> n =3D size (varargin{1}, 1);
> if n !=3D size (varargin{1}, 2),
> error("Matrix must be square.");
> endif
> APPLY =3D @(x) varargin{1} * x;
> APPLY_T =3D @(x) varargin{1}' * x;
> if size (varargin) > 1,
> t =3D varargin{2};
> else
> t =3D min (n, DEFAULT_T);
> endif
> else
> if size (varargin, 2) < 3,
> print_usage();
> endif
> n =3D varargin{3};
> APPLY =3D varargin{1};
> APPLY_T =3D varargin{2};
> if size (varargin) > 3,
> t =3D varargin{4};
> else
> t =3D DEFAULT_T;
> endif
> endif
> =
> ## Initial test vectors X.
> X =3D rand (n, t);
> X =3D X ./ (ones (n,1) * sum (abs (X), 1));
> =
> been_there =3D zeros (n, 1); # Track if a vertex has been visited.
> est_old =3D 0; # To check if the estimate has increased.
> S =3D zeros (n, t); # Normalized vector of signs. The normalization is =
> =
> for iter=3D1:ITMAX+1,
> Y =3D feval (APPLY, X);
> =
> ## Find the initial estimate as the largest A*x.
> [est, ind_best] =3D max (sum (abs (Y), 1));
> if (est > est_old || iter =3D=3D 2),
> w =3D Y(:,ind_best);
> endif
> if (iter >=3D 2 && est < est_old),
> ## No improvement, so stop.
> est =3D est_old;
> break;
> endif
> =
> est_old =3D est;
> S_old =3D S;
> if (iter > ITMAX),
> ## Gone too far. Stop.
> break;
> endif
> =
> S =3D sign (Y);
> =
> ## Test if any of S are approximately parallel to previous S
> ## vectors or current S vectors. If everything is parallel,
> ## stop. Otherwise, replace any parallel vectors with
> ## rand{-1,+1}.
> partest =3D any (abs (S_old' * S - n) < 4*eps*n);
> if all (partest),
> ## All the current vectors are parallel to old vectors.
> ## We've hit a cycle, so stop.
> break;
> endif
> if any (partest),
> ## Some vectors are parallel to old ones and are cycling,
> ## but not all of them. Replace the parallel vectors with
> ## rand{-1,+1}.
> numpar =3D sum (partest);
> replacements =3D 2*(rand (n,numpar) < 0.5) - 1;
> S(:,partest) =3D replacements;
> endif
> ## Now test for parallel vectors within S.
> partest =3D any ( (S' * S - eye (t)) =3D=3D n );
> if any (partest),
> numpar =3D sum (partest);
> replacements =3D 2*(rand (n,numpar) < 0.5) - 1;
> S(:,partest) =3D replacements;
> endif
> =
> Z =3D feval (APPLY_T, S);
> =
> ## Now find the largest non-previously-visted index per
> ## vector.
> h =3D max (abs (Z),2);
> [mh, mhi] =3D max (h);
> if iter >=3D 2 && mhi =3D=3D ind_best,
> ## Hit a cycle, stop.
> break;
> endif
> [h, ind] =3D sort (h, 'descend');
> if t > 1,
> firstind =3D ind(1:t);
> if all (been_there(firstind)),
> ## Visited all these before, so stop.
> break;
> endif
> ind=3Dind(!been_there(ind));
> if length (ind) < t,
> ## There aren't enough new vectors, so we're practically
> ## in a cycle. Stop.
> break;
> endif
> endif
> =
> ## Visit the new indices.
> X =3D zeros (n, t);
> for zz =3D 1:t,
> X(ind(zz),zz) =3D 1;
> endfor
> been_there(ind(1:t)) =3D 1;
> =
> endfor
> =
> ## The estimate est and vector w are set in the loop above. The
> ## vector v selects the ind_best column of A.
> v =3D zeros (n, 1);
> v(ind_best) =3D 1;
> endfunction
> =
> %!test
> %! N =3D 10;
> %! A =3D ones (N);
> %! [nm1, v1, w1] =3D block_onenorm_est (A);
> %! [nminf, vinf, winf] =3D block_onenorm_est (A', 6);
> %! assert (nm1, N, -2*eps);
> %! assert (nminf, N, -2*eps);
> %! assert (norm (w1, 1), nm1 * norm (v1, 1), -2*eps)
> %! assert (norm (winf, 1), nminf * norm (vinf, 1), -2*eps)
> =
> %!test
> %! N =3D 10;
> %! A =3D ones (N);
> %! [nm1, v1, w1] =3D block_onenorm_est (@(x) A*x, @(x) A'*x, N, 3);
> %! [nminf, vinf, winf] =3D block_onenorm_est (@(x) A'*x, @(x) A*x, N, 3);
> %! assert (nm1, N, -2*eps);
> %! assert (nminf, N, -2*eps);
> %! assert (norm (w1, 1), nm1 * norm (v1, 1), -2*eps)
> %! assert (norm (winf, 1), nminf * norm (vinf, 1), -2*eps)
> =
> %!test
> %! N =3D 5;
> %! A =3D hilb (N);
> %! [nm1, v1, w1] =3D block_onenorm_est (A);
> %! [nminf, vinf, winf] =3D block_onenorm_est (A', 6);
> %! assert (nm1, norm (A, 1), -2*eps);
> %! assert (nminf, norm (A, inf), -2*eps);
> %! assert (norm (w1, 1), nm1 * norm (v1, 1), -2*eps)
> %! assert (norm (winf, 1), nminf * norm (vinf, 1), -2*eps)
> =
> ## Only likely to be within a factor of 10.
> %!test
> %! N =3D 100;
> %! A =3D rand (N);
> %! [nm1, v1, w1] =3D block_onenorm_est (A);
> %! [nminf, vinf, winf] =3D block_onenorm_est (A', 6);
> %! assert (nm1, norm (A, 1), -.1);
> %! assert (nminf, norm (A, inf), -.1);
> %! assert (norm (w1, 1), nm1 * norm (v1, 1), -2*eps)
> %! assert (norm (winf, 1), nminf * norm (vinf, 1), -2*eps)
> =
> ## Copyright (c) 2007, Regents of the University of California
> ## All rights reserved.
> ## Redistribution and use in source and binary forms, with or without
> ## modification, are permitted provided that the following conditions are=
met:
> ##
> ## * Redistributions of source code must retain the above copyright
> ## notice, this list of conditions and the following disclaimer.
> ## * Redistributions in binary form must reproduce the above copyright
> ## notice, this list of conditions and the following disclaimer in =
the
> ## documentation and/or other materials provided with the distribut=
ion.
> ## * Neither the name of the University of California, Berkeley nor t=
he
> ## names of its contributors may be used to endorse or promote prod=
ucts
> ## derived from this software without specific prior written permis=
sion.
> ##
> ## THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AN=
D ANY
> ## EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPL=
IED
> ## WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
> ## DISCLAIMED. IN NO EVENT SHALL THE REGENTS AND CONTRIBUTORS BE LIABLE F=
OR ANY
> ## DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAM=
AGES
> ## (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SER=
VICES;
> ## LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSE=
D AND
> ## ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR =
TORT
> ## (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE =
OF THIS
> ## SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
> =
> =
> ------------------------------------------------------------------------
> =
> ## Copyright (C) 2007, Regents of the University of California
> ## -*- mode: octave; -*-
> ##
> ## This program is free software distributed under the "modified" or
> ## 3-clause BSD license appended to this file.
> =
> function [est, v] =3D condest (varargin)
> ## -*- texinfo -*-
> ## @deftypefn {Function File} {[@var{est}, @var{v}] =3D } condest (@var=
{A}, @var{t} =3D min (size (A, 1), 5)) =
> ## @deftypefnx {Function File} {[@var{est}, @var{v}] =3D } condest (@va=
r{A}, @var{SOLVE}, @var{SOVLE_T}, @var{t} =3D min (n, 5))
> ## @deftypefnx {Function File} {[@var{est}, @var{v}] =3D } condest (@va=
r{APPLY}, @var{APPLY_T}, @var{SOLVE}, @var{SOVLE_T}, @var{n}, @var{t} =3D m=
in (n, 5))
> ##
> ## Estimate the 1-norm condition number of a matrix matrix @var{A}
> ## using @var{t} test vectors pusing the randomized 1-norm estimator in
> ## block_onenorm_est. If the matrix is not explicit, e.g. when
> ## estimating the condition number of @var{A} given an LU
> ## factorization, condest uses the following functions:
> ##
> ## @table @var
> ## @item APPLY
> ## @code{A*x} for a matrix @code{x} of size @var{n} by @var{t}.
> ## @item APPLY_T
> ## @code{A'*x} for a matrix @code{x} of size @var{n} by @var{t}.
> ## @item SOLVE
> ## @code{A \ b} for a matrix @code{b} of size @var{n} by @var{t}.
> ## @item SOLVE_T
> ## @code{A' \ b} for a matrix @code{b} of size @var{n} by @var{t}.
> ## @end table
> ##
> ## The implicit version requires an explicit dimension @var{n}.
> ##
> ## @code{condest} uses a randomized algorithm to approximate
> ## the 1-norms.
> ##
> ## @code{condest} returns the 1-norm condition estimate @var{est} and
> ## a vector @var{v} satisfying @code{norm (@var{A}*@var{v}, 1) =3D=3D n=
orm
> ## (@var{A}, 1) * norm (@var{v}, 1) / @var{est}}. When @var{est} is
> ## large, @var{v} is an approximate null vector.
> ##
> ## References: =
> ## @itemize
> ## @item Nicholas J. Higham and Fran=E7oise Tisseur, "A Block Algorithm
> ## for Matrix 1-Norm Estimation, with an Application to 1-Norm
> ## Pseudospectra." SIMAX vol 21, no 4, pp 1185-1201.
> ## http://dx.doi.org/10.1137/S0895479899356080
> ## @item Nicholas J. Higham and Fran=E7oise Tisseur, "A Block Algorithm
> ## for Matrix 1-Norm Estimation, with an Application to 1-Norm
> ## Pseudospectra." http://citeseer.ist.psu.edu/223007.html
> ## @end itemize
> ##
> ## @seealso{rcond, block_onenorm_est, norm, cond}
> ##
> ## @end deftypefn
> =
> ## Author: Jason Riedy <[email protected]>
> ## Keywords: linear-algebra norm estimation
> ## Version: 0.2
> =
> %!demo
> %! N =3D 100;
> %! A =3D randn (N) + eye (N);
> %! condest (A)
> %! [L,U,P] =3D lu (A);
> %! condest (A, @(x) U\ (L\ (P*x)), @(x) P'*(L'\ (U'\x)))
> %! condest (@(x) A*x, @(x) A'*x, @(x) U\ (L\ (P*x)), @(x) P'*(L'\ (U'\x)=
), N)
> %! norm (inv (A), 1) * norm (A, 1)
> =
> [est, v] =3D rcond(varargin{:});
> est =3D 1/est;
> endfunction
> =
> ## These tests are the same as in rcond().
> =
> %!test
> %! N =3D 6;
> %! A =3D hilb (N);
> %! cA =3D condest (A);
> %! rcA =3D 1 / rcond (A);
> %! assert (cA, rcA, 2**-12);
> =
> ## Copyright (c) 2007, Regents of the University of California
> ## All rights reserved.
> ## Redistribution and use in source and binary forms, with or without
> ## modification, are permitted provided that the following conditions are=
met:
> ##
> ## * Redistributions of source code must retain the above copyright
> ## notice, this list of conditions and the following disclaimer.
> ## * Redistributions in binary form must reproduce the above copyright
> ## notice, this list of conditions and the following disclaimer in =
the
> ## documentation and/or other materials provided with the distribut=
ion.
> ## * Neither the name of the University of California, Berkeley nor t=
he
> ## names of its contributors may be used to endorse or promote prod=
ucts
> ## derived from this software without specific prior written permis=
sion.
> ##
> ## THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AN=
D ANY
> ## EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPL=
IED
> ## WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
> ## DISCLAIMED. IN NO EVENT SHALL THE REGENTS AND CONTRIBUTORS BE LIABLE F=
OR ANY
> ## DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAM=
AGES
> ## (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SER=
VICES;
> ## LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSE=
D AND
> ## ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR =
TORT
> ## (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE =
OF THIS
> ## SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
> =
> =
> ------------------------------------------------------------------------
> =
> _______________________________________________
> Octave-sources mailing list
> [email protected]
> https://www.cae.wisc.edu/mailman/listinfo/octave-sources