Mercurial > forge
changeset 2719:4e0bad669780 octave-forge
Initial commit into CVS.
author | whyly |
---|---|
date | Tue, 17 Oct 2006 22:18:07 +0000 |
parents | 78f956ba9369 |
children | d0b400de8b3f |
files | main/linear-algebra/INDEX main/linear-algebra/inst/condeig.m |
diffstat | 2 files changed, 113 insertions(+), 0 deletions(-) [+] |
line wrap: on
line diff
--- a/main/linear-algebra/INDEX Tue Oct 17 19:12:37 2006 +0000 +++ b/main/linear-algebra/INDEX Tue Oct 17 22:18:07 2006 +0000 @@ -1,5 +1,6 @@ matrix >> Linear Algebra Matrix functions + condeig funm thfm Matrix factorization
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/main/linear-algebra/inst/condeig.m Tue Oct 17 22:18:07 2006 +0000 @@ -0,0 +1,112 @@ +## Copyright (C) 2006 Arno Onken +## +## This program is free software; you can redistribute it and/or modify +## it under the terms of the GNU General Public License as published by +## the Free Software Foundation; either version 2 of the License, or +## (at your option) any later version. +## +## This program is distributed in the hope that it will be useful, +## but WITHOUT ANY WARRANTY; without even the implied warranty of +## MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +## GNU General Public License for more details. +## +## You should have received a copy of the GNU General Public License +## along with this program; if not, write to the Free Software +## Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + +## -*- texinfo -*- +## @deftypefn {Function File} {@var{c} =} condeig (@var{a}) +## @deftypefnx {Function File} {[@var{v}, @var{lambda}, @var{c}] =} condeig (@var{a}) +## Computes condition numbers for the eigenvalues of a matrix. The +## condition numbers are the reciprocals of the cosines of the angles +## between the left and right eigenvectors. +## +## Arguments are +## +## @itemize @bullet +## @item +## @var{a} must be a square numeric matrix. +## @end itemize +## +## Return values are +## +## @itemize @bullet +## @item +## @var{c} is a vector of condition numbers for the eigenvalue of +## @var{a}. +## +## @item +## @var{v} is the matrix of right eigenvectors of @var{a}. The result is +## the same as for @code{[v, lambda] = eig (a)}. +## +## @item +## @var{lambda} is the diagonal matrix of eigenvalues of @var{a}. The +## result is the same as for @code{[v, lambda] = eig (a)}. +## @end itemize +## +## Example: +## +## @example +## @group +## a = [1, 2; 3, 4]; +## c = condeig (a) +## @result{} [1.0150; 1.0150] +## @end group +## @end example +## @end deftypefn + +## Author: Arno Onken <whyly@gmx.net> +## Description: Condition numbers for eigenvalues + +function [v, lambda, c] = condeig (a) + + # Check arguments + if (nargin != 1 || nargout > 3) + usage ("[v, lambda, c] = condeig (a)"); + endif + + if (! isempty (a) && ! ismatrix (a)) + error ("condeig: a must be a numeric matrix"); + endif + + if (columns (a) != rows (a)) + error ("condeig: a must be a square matrix"); + endif + + # Right eigenvectors + [v, lambda] = eig (a); + + if (isempty (a)) + c = lambda; + else + # Corresponding left eigenvectors + vl = inv (v)'; + # Normalize vectors + vl = vl ./ repmat (sqrt (sum (abs (vl .^ 2))), rows (vl), 1); + + # Condition numbers + # cos (angle) = (norm (v1) * norm (v2)) / dot (v1, v2) + # Norm of the eigenvectors is 1 => norm (v1) * norm (v2) = 1 + c = abs (1 ./ dot (vl, v)'); + endif + + if (nargout == 0 || nargout == 1) + v = c; + endif + +endfunction + +%!test +%! a = [1, 2; 3, 4]; +%! c = condeig (a); +%! expected_c = [1.0150; 1.0150]; +%! assert (c, expected_c, 0.001); + +%!test +%! a = [1, 3; 5, 8]; +%! [v, lambda, c] = condeig (a); +%! [expected_v, expected_lambda] = eig (a); +%! expected_c = [1.0182; 1.0182]; +%! assert (v, expected_v, 0.001); +%! assert (lambda, expected_lambda, 0.001); +%! assert (c, expected_c, 0.001);