home *** CD-ROM | disk | FTP | other *** search
- function [Q,R] = qrinsert(Q,R,j,x)
- %QRINSERT Insert a column in the QR factorization.
- % If [Q,R] = qr(A) is the original QR factorization of A,
- % then [Q,R] = qrinsert(Q,R,j,x) changes Q and R to be the
- % factorization of the matrix obtained by inserting an extra
- % column, x, before A(:,j). (If A has n columns and j = n+1,
- % then x is inserted after the last column of A.)
- %
- % See also QR, QRDELETE, PLANEROT.
-
- % C.B.Moler 5/1/92. Revised ACWG 6/15/92, CBM 9/11/92.
- % Copyright (c) 1984-93 by the MathWorks, Inc.
-
- [m,n] = size(R);
- if n == 0
- [Q,R] = qr(x);
- return;
- end
- % Make room and insert x before j-th column.
- R(:,j+1:n+1) = R(:,j:n);
- R(:,j) = Q'*x;
- n = n+1;
-
- % Now R has nonzeros below the diagonal in the j-th column,
- % and "extra" zeros on the diagonal in later columns.
- % R = [x x x x x
- % 0 x x x x
- % 0 0 + x x
- % 0 0 + 0 x
- % 0 0 + 0 0]
- % Use Givens rotations to zero the +'s, one at a time, from bottom to top.
-
- for k = m-1:-1:j
- p = k:k+1;
- [G,R(p,j)] = planerot(R(p,j));
- if k < n
- R(p,k+1:n) = G*R(p,k+1:n);
- end
- Q(:,p) = Q(:,p)*G';
- end
-