TOC | Abstract | (1) Intro | (2) Simplex | (3) Impl | (4) Test | (5) Results | (6) Concl | Scripts | Biblio | Author | Chairman |
Reids Method uses the same main method as the Sparse Bartels-Golub Method execept for the extra call to reidrotate. This is the code within the reidrotate method.
%% Find the singleton rows and columns of the bump csingles = zeros(bside-lside,1); cs = 0; rsingles = zeros(1, bside-lside); rs = 0; for z=lside+1:bside if (nnz(U(lside:bside, z))) == 1 cs = cs + 1; csingles(cs) = z; end; %if if (nnz(U(z-1, lside:bside))) == 1 rs = rs + 1; rsingles(rs) = z-1; end; %if end; %for %%%% Now, we need to loop until all the singletons have been rotated out. while (cs ~= 0 & rs ~= 0) %%% Column rotations %%% %%%% First see if the top column(s) have been eliminated already %%%% if (cs ~= 0) while (csingles(cs) == 0) cs = cs - 1; if (cs == 0) break; end; %if end; % while end; %if %%%% Then rotate the top column out. %%%% if (cs ~= 0) top = csingles(cs); shift = [1:lside-1 top lside:top-1 top+1:m]; U = U(shift,shift); Qinv = Qinv(shift); Ptemp = Ptemp(shift); %%%% Update the waiting columns and rows that have been shifted. %%%% for z = 1:cs if (csingles(z) < top & csingles(z) > 0) csingles(z) = csingles(z) + 1; elseif (csingles(z) == top) csingles(z) = 0; end; %if end; %for for z = 1:rs if (rsingles(z) < top & rsingles(z) > 0) rsingles(z) = rsingles(z) + 1; elseif (rsingles(z) == top) rsingles(z) = 0; end; %if end; %for %%%% Has the column shift created new singleton columns? %%%% for z = find(U(lside, lside+2:bside))' + lside + 1 if (nnz(U(lside+1:bside, z)) == 1) csingles(cs) = z; cs = cs + 1; end; %if end; %for %%%% And has it created OR REMOVED any singleton rows? %%%% for z = find(U(lside+1:bside, lside)) + lside if (nnz(U(z,lside+1:bside)) == 1) %%% New row singleton rs = rs + 1; rsingles(rs) = z; elseif (nnz(U(z,lside+1:bside)) == 0) %%% ELIMINATED singleton for y=1:rs if (rsingles(y) == z) rsingles(y) = 0; end; % if end; % for end; % if end; % for cs = cs - 1; lside = lside+1; end; %if %%% Row rotations %%% %%%% First see if the top row(s) have been eliminated already %%%% if (rs ~= 0) while (rsingles(rs) == 0) rs = rs - 1; if (rs == 0) break; end; %if end; % while end; %if %%%% Then rotate the top column out. %%%% if (rs ~= 0) top = rsingles(rs); shift = [1:top-1 top+1:bside top bside+1:m]; U = U(shift,shift); Qinv = Qinv(shift); Ptemp = Ptemp(shift); %%%% Update the waiting columns and rows that have been shifted. %%%% for z = 1:cs if (csingles(z) > top & csingles(z) > 0) csingles(z) = csingles(z) - 1; elseif (csingles(z) == top) csingles(z) = 0; end; %if end; %for for z = 1:rs if (rsingles(z) > top & rsingles(z) > 0) rsingles(z) = rsingles(z) - 1; elseif (rsingles(z) == top) rsingles(z) = 0; end; %if end; %for %%%% Has the column shift created new singleton rows? %%%% for z = find(U(lside:bside-1, bside))' + lside -1 if (nnz(U(z, lside:bside-1)) == 1) rsingles(rs) = z; rs = rs + 1; end; %if end; %for %%%% And has it created OR REMOVED any singleton columns? %%%% for z = find(U(bside, lside:bside-1)) + lside -1 if (nnz(U(lside:bside-1,z)) == 1) %%% New row singleton cs = cs + 1; csingles(cs) = z; elseif (nnz(U(lside:bside-1,z)) == 0) %%% ELIMINATED singleton for y=1:cs if (csingles(y) == z) csingles(y) = 0; end; % if end; % for end; % if end; % for rs = rs - 1; bside = bside - 1; end; %if end; %while