Mercurial > matrix-functions
view matrixcomp/lse.m @ 0:8f23314345f4 draft
Create local repository for matrix toolboxes. Step #0 done.
author | Antonio Pino Robles <data.script93@gmail.com> |
---|---|
date | Wed, 06 May 2015 14:56:53 +0200 |
parents | |
children |
line wrap: on
line source
function x = lse(A, b, B, d, method) %LSE Solve the equality constrained least squares problem. % [x, flopcount] = LSE(A, b, B, d, METHOD) finds the least squares % solution of the system Ax = b subject to the constraint Bx = d. % METHOD = 1 (default), 2 or 3 specifies the variant of the null-space % method to be used. METHOD 3 is the most efficient. % Note: Should really apply Householder transformations in factored form. % Not done here. % % Reference: % A. J. Cox and N. J. Higham. Accuracy and stability of the null space % method for solving the equality constrained least squares problem. % BIT, 39(1):34-50, 1999. % N. J. Higham, Accuracy and Stability of Numerical Algorithms, % Second edition, Society for Industrial and Applied Mathematics, % Philadelphia, PA, 2002; sec. 20.9. b = b(:); d = d(:); [m n] = size(A); m2 = length(b); [p n2] = size(B); p2 = length(d); if m ~= m2 | p ~= p2 | n ~= n2 error('Dimensions do not match!') end if nargin < 5, method = 1; end partial = (method == 2 | method == 3); [U, Q, L, S] = gqr(A, B, partial); y1 = S(:,1:p)\d; L21 = L(m-n+p+1:m,1:p); L22 = L(m-n+p+1:m,p+1:n); if method == 1 c = U'*b; c3 = c(m-n+p+1:m); y2 = L22 \ (c3 - L21*y1); elseif method == 2 W1 = A*Q(:,1:p); g = U'*(b - W1*y1); g2 = g(m-n+p+1:m); y2 = L22\g2; elseif method == 3 W1y1 = A*(Q(:,1:p)*y1); g = U'*(b - W1y1); g2 = g(m-n+p+1:m); y2 = L22\g2; end y = [y1; y2]; x = Q*y;