annotate scripts/linear-algebra/qrhouse.m @ 3238:041ea33fbbf4

[project @ 1999-03-26 17:48:16 by jwe]
author jwe
date Fri, 26 Mar 1999 17:48:35 +0000
parents 737b219ab65a
children
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
3211
440b2b28e74a [project @ 1998-11-05 04:16:22 by jwe]
jwe
parents:
diff changeset
1 # Copyright (C) 1992, 1998 A. Scottedward Hodel
440b2b28e74a [project @ 1998-11-05 04:16:22 by jwe]
jwe
parents:
diff changeset
2 #
440b2b28e74a [project @ 1998-11-05 04:16:22 by jwe]
jwe
parents:
diff changeset
3 # This file is part of Octave.
440b2b28e74a [project @ 1998-11-05 04:16:22 by jwe]
jwe
parents:
diff changeset
4 #
440b2b28e74a [project @ 1998-11-05 04:16:22 by jwe]
jwe
parents:
diff changeset
5 # Octave is free software; you can redistribute it and/or modify it
440b2b28e74a [project @ 1998-11-05 04:16:22 by jwe]
jwe
parents:
diff changeset
6 # under the terms of the GNU General Public License as published by the
440b2b28e74a [project @ 1998-11-05 04:16:22 by jwe]
jwe
parents:
diff changeset
7 # Free Software Foundation; either version 2, or (at your option) any
440b2b28e74a [project @ 1998-11-05 04:16:22 by jwe]
jwe
parents:
diff changeset
8 # later version.
440b2b28e74a [project @ 1998-11-05 04:16:22 by jwe]
jwe
parents:
diff changeset
9 #
440b2b28e74a [project @ 1998-11-05 04:16:22 by jwe]
jwe
parents:
diff changeset
10 # Octave is distributed in the hope that it will be useful, but WITHOUT
440b2b28e74a [project @ 1998-11-05 04:16:22 by jwe]
jwe
parents:
diff changeset
11 # ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
440b2b28e74a [project @ 1998-11-05 04:16:22 by jwe]
jwe
parents:
diff changeset
12 # FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
440b2b28e74a [project @ 1998-11-05 04:16:22 by jwe]
jwe
parents:
diff changeset
13 # for more details.
440b2b28e74a [project @ 1998-11-05 04:16:22 by jwe]
jwe
parents:
diff changeset
14 #
440b2b28e74a [project @ 1998-11-05 04:16:22 by jwe]
jwe
parents:
diff changeset
15 # You should have received a copy of the GNU General Public License
440b2b28e74a [project @ 1998-11-05 04:16:22 by jwe]
jwe
parents:
diff changeset
16 # along with Octave; see the file COPYING. If not, write to the Free
440b2b28e74a [project @ 1998-11-05 04:16:22 by jwe]
jwe
parents:
diff changeset
17 # Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA.
440b2b28e74a [project @ 1998-11-05 04:16:22 by jwe]
jwe
parents:
diff changeset
18
440b2b28e74a [project @ 1998-11-05 04:16:22 by jwe]
jwe
parents:
diff changeset
19 function [hv,alph,kb] = qrhouse(VV,eps1)
3238
041ea33fbbf4 [project @ 1999-03-26 17:48:16 by jwe]
jwe
parents: 3237
diff changeset
20 # function [hv,alph,kb] = qrhouse(VV{,eps1})
3211
440b2b28e74a [project @ 1998-11-05 04:16:22 by jwe]
jwe
parents:
diff changeset
21 # construct orthogonal basis of span(VV) with Householder vectors
440b2b28e74a [project @ 1998-11-05 04:16:22 by jwe]
jwe
parents:
diff changeset
22 # Q R = VV; Q may be obtained via routine krygetq; R is upper triangular
440b2b28e74a [project @ 1998-11-05 04:16:22 by jwe]
jwe
parents:
diff changeset
23 # if all rows of VV are nonzero; otherwise it's a permuted uppert
440b2b28e74a [project @ 1998-11-05 04:16:22 by jwe]
jwe
parents:
diff changeset
24 # triangular matrix with zero rows matching those of VV.
440b2b28e74a [project @ 1998-11-05 04:16:22 by jwe]
jwe
parents:
diff changeset
25 # Inputs:
440b2b28e74a [project @ 1998-11-05 04:16:22 by jwe]
jwe
parents:
diff changeset
26 # VV: matrix
440b2b28e74a [project @ 1998-11-05 04:16:22 by jwe]
jwe
parents:
diff changeset
27 # eps1: zero threshhold; default: 0. Used to check if a column
440b2b28e74a [project @ 1998-11-05 04:16:22 by jwe]
jwe
parents:
diff changeset
28 # of reduced R is already upper triangular; entries with magnitude
440b2b28e74a [project @ 1998-11-05 04:16:22 by jwe]
jwe
parents:
diff changeset
29 # <= eps1 are considered to be 0.
440b2b28e74a [project @ 1998-11-05 04:16:22 by jwe]
jwe
parents:
diff changeset
30 # Outputs:
440b2b28e74a [project @ 1998-11-05 04:16:22 by jwe]
jwe
parents:
diff changeset
31 # hv: matrix of householder reflection vectors as returned by housh
440b2b28e74a [project @ 1998-11-05 04:16:22 by jwe]
jwe
parents:
diff changeset
32 # alpha: vector of householder reflection values as returned by housh
440b2b28e74a [project @ 1998-11-05 04:16:22 by jwe]
jwe
parents:
diff changeset
33 # kb: computed rank of matrix
440b2b28e74a [project @ 1998-11-05 04:16:22 by jwe]
jwe
parents:
diff changeset
34 # qrhouse is used in krylovb for block Arnoldi iteration
440b2b28e74a [project @ 1998-11-05 04:16:22 by jwe]
jwe
parents:
diff changeset
35 #
440b2b28e74a [project @ 1998-11-05 04:16:22 by jwe]
jwe
parents:
diff changeset
36 # Reference: Golub and Van Loan, MATRIX COMPUTATIONS, 2nd ed.
440b2b28e74a [project @ 1998-11-05 04:16:22 by jwe]
jwe
parents:
diff changeset
37
440b2b28e74a [project @ 1998-11-05 04:16:22 by jwe]
jwe
parents:
diff changeset
38 # Written by A. S. Hodel, 1992
440b2b28e74a [project @ 1998-11-05 04:16:22 by jwe]
jwe
parents:
diff changeset
39
3238
041ea33fbbf4 [project @ 1999-03-26 17:48:16 by jwe]
jwe
parents: 3237
diff changeset
40 if(nargin < 1 | nargin > 2)
041ea33fbbf4 [project @ 1999-03-26 17:48:16 by jwe]
jwe
parents: 3237
diff changeset
41 usage("[hv,alph,kb] = qrhouse(VV{,eps1})");
041ea33fbbf4 [project @ 1999-03-26 17:48:16 by jwe]
jwe
parents: 3237
diff changeset
42 elseif(nargin == 1) # default value for eps set to 0
041ea33fbbf4 [project @ 1999-03-26 17:48:16 by jwe]
jwe
parents: 3237
diff changeset
43 eps1 = 0;
3211
440b2b28e74a [project @ 1998-11-05 04:16:22 by jwe]
jwe
parents:
diff changeset
44 endif
440b2b28e74a [project @ 1998-11-05 04:16:22 by jwe]
jwe
parents:
diff changeset
45
3237
737b219ab65a [project @ 1999-03-06 07:44:55 by jwe]
jwe
parents: 3211
diff changeset
46
3211
440b2b28e74a [project @ 1998-11-05 04:16:22 by jwe]
jwe
parents:
diff changeset
47 # extract only those rows of VV that are nonzero
440b2b28e74a [project @ 1998-11-05 04:16:22 by jwe]
jwe
parents:
diff changeset
48 if(is_vector(VV)) nzidx = find(abs(VV') > 0);
3237
737b219ab65a [project @ 1999-03-06 07:44:55 by jwe]
jwe
parents: 3211
diff changeset
49 else nzidx = find(max(abs(VV')) > 0); endif
3211
440b2b28e74a [project @ 1998-11-05 04:16:22 by jwe]
jwe
parents:
diff changeset
50 VVlen = rows(VV); # remember original size
440b2b28e74a [project @ 1998-11-05 04:16:22 by jwe]
jwe
parents:
diff changeset
51
440b2b28e74a [project @ 1998-11-05 04:16:22 by jwe]
jwe
parents:
diff changeset
52 if(is_vector(VV)) VV = VV(nzidx);
3237
737b219ab65a [project @ 1999-03-06 07:44:55 by jwe]
jwe
parents: 3211
diff changeset
53 else VV = VV(nzidx,:); endif
3211
440b2b28e74a [project @ 1998-11-05 04:16:22 by jwe]
jwe
parents:
diff changeset
54
440b2b28e74a [project @ 1998-11-05 04:16:22 by jwe]
jwe
parents:
diff changeset
55 [Vr,Vc] = size(VV); nits = min(Vr,Vc);
440b2b28e74a [project @ 1998-11-05 04:16:22 by jwe]
jwe
parents:
diff changeset
56 for ii = 1:nits;
3237
737b219ab65a [project @ 1999-03-06 07:44:55 by jwe]
jwe
parents: 3211
diff changeset
57 # permute maximum row entry to (ii,ii) position
737b219ab65a [project @ 1999-03-06 07:44:55 by jwe]
jwe
parents: 3211
diff changeset
58 Vrowi = VV(ii,1:Vc); # pivot maximum entry in this row to lead position
737b219ab65a [project @ 1999-03-06 07:44:55 by jwe]
jwe
parents: 3211
diff changeset
59 Vrm = max(abs(Vrowi));
737b219ab65a [project @ 1999-03-06 07:44:55 by jwe]
jwe
parents: 3211
diff changeset
60 Vmidx = min(find(abs(Vrowi) == Vrm));
737b219ab65a [project @ 1999-03-06 07:44:55 by jwe]
jwe
parents: 3211
diff changeset
61 if(Vmidx > eps1)
737b219ab65a [project @ 1999-03-06 07:44:55 by jwe]
jwe
parents: 3211
diff changeset
62 kb = ii; # update computed rank
737b219ab65a [project @ 1999-03-06 07:44:55 by jwe]
jwe
parents: 3211
diff changeset
63 idx = kb-1;
737b219ab65a [project @ 1999-03-06 07:44:55 by jwe]
jwe
parents: 3211
diff changeset
64 if(Vmidx != ii)
737b219ab65a [project @ 1999-03-06 07:44:55 by jwe]
jwe
parents: 3211
diff changeset
65 [VV(:,kb),VV(:,Vmidx)] = swap(VV(:,kb),VV(:,Vmidx));
737b219ab65a [project @ 1999-03-06 07:44:55 by jwe]
jwe
parents: 3211
diff changeset
66 endif
737b219ab65a [project @ 1999-03-06 07:44:55 by jwe]
jwe
parents: 3211
diff changeset
67 hh = VV(:,ii); # extract next column of VV; ignore items 1:(ii-1).
3211
440b2b28e74a [project @ 1998-11-05 04:16:22 by jwe]
jwe
parents:
diff changeset
68 [hv(kb:Vr,kb),alph(kb),z] = housh(hh(kb:Vr),1,0);
440b2b28e74a [project @ 1998-11-05 04:16:22 by jwe]
jwe
parents:
diff changeset
69 if(kb>1)
3237
737b219ab65a [project @ 1999-03-06 07:44:55 by jwe]
jwe
parents: 3211
diff changeset
70 hv(1:idx,kb) = 0; # zero top of hv for safety
3211
440b2b28e74a [project @ 1998-11-05 04:16:22 by jwe]
jwe
parents:
diff changeset
71 endif
3237
737b219ab65a [project @ 1999-03-06 07:44:55 by jwe]
jwe
parents: 3211
diff changeset
72 # project off of current Householder vector
3211
440b2b28e74a [project @ 1998-11-05 04:16:22 by jwe]
jwe
parents:
diff changeset
73 VV = VV - alph(kb)*hv(:,kb)*(hv(:,kb)'*VV);
440b2b28e74a [project @ 1998-11-05 04:16:22 by jwe]
jwe
parents:
diff changeset
74 else
3237
737b219ab65a [project @ 1999-03-06 07:44:55 by jwe]
jwe
parents: 3211
diff changeset
75 break;
737b219ab65a [project @ 1999-03-06 07:44:55 by jwe]
jwe
parents: 3211
diff changeset
76 endif
3211
440b2b28e74a [project @ 1998-11-05 04:16:22 by jwe]
jwe
parents:
diff changeset
77 endfor
440b2b28e74a [project @ 1998-11-05 04:16:22 by jwe]
jwe
parents:
diff changeset
78 if(kb <=0)
440b2b28e74a [project @ 1998-11-05 04:16:22 by jwe]
jwe
parents:
diff changeset
79 hv = [];
440b2b28e74a [project @ 1998-11-05 04:16:22 by jwe]
jwe
parents:
diff changeset
80 alph = [];
440b2b28e74a [project @ 1998-11-05 04:16:22 by jwe]
jwe
parents:
diff changeset
81 else
440b2b28e74a [project @ 1998-11-05 04:16:22 by jwe]
jwe
parents:
diff changeset
82 hvs = hv(:,1:kb); # remove extraneous vectors, expand to original size
440b2b28e74a [project @ 1998-11-05 04:16:22 by jwe]
jwe
parents:
diff changeset
83 hv = zeros(VVlen,kb);
440b2b28e74a [project @ 1998-11-05 04:16:22 by jwe]
jwe
parents:
diff changeset
84 hv(nzidx,:) = hvs;
440b2b28e74a [project @ 1998-11-05 04:16:22 by jwe]
jwe
parents:
diff changeset
85 alph = alph(1:kb);
440b2b28e74a [project @ 1998-11-05 04:16:22 by jwe]
jwe
parents:
diff changeset
86 end
440b2b28e74a [project @ 1998-11-05 04:16:22 by jwe]
jwe
parents:
diff changeset
87 endfunction