No BSD License  

Highlights from
Gauss Triangularization Method

image thumbnail
from Gauss Triangularization Method by Anthony Zaganas
The vector of pivot elements during LU is formed for special matrices and equivalent ones.

determine(varargin)
function varargout = determine(varargin)
% DETERMINE Application M-file for determine.fig
%    FIG = DETERMINE launch determine GUI.
%    DETERMINE('callback_name', ...) invoke the named callback.

% Last Modified by GUIDE v2.0 09-Aug-2002 00:51:36

%varargin{1}: handles.WArray 'nxn' --> W
%varargin{2}: handles.diastasi --> n
%varargin{3}: handles.MArray '1x12' --> M
%varargin{4}: handles.XYArray '1xm'  --> XY
%varargin{5}: handles.ZWArray '1xo' --> ZW
%varargin{6}: handles.GaussOlikiMethod '1x1' --> GaussOlMet
%varargin{7}: handles.RArray '1xn' --> r
%varargin{7}: handles.SArray '1xn' --> s


if nargin == 10  % LAUNCH GUI
W=varargin{1};
n=varargin{2};
M=varargin{3};
XY=varargin{4};
ZW=varargin{5};
GaussOlMet=varargin{6};
r=varargin{7};
s=varargin{8};
MR=varargin{9};
MC=varargin{10};
WInitial=W;

	fig = openfig(mfilename,'reuse');
    movegui(fig,'center');

    if norm(XY,inf)~=0
        [xx,yy]=define_swaps_1(XY);
        k=length(xx);
        for i=1:k
            W=row_swap(W,n,xx(i),yy(i));
        end
        clear xx yy k;
        
    	[xx,yy]=define_swaps_1(ZW);
        k=length(xx);
        for i=1:k
            W=column_swap(W,n,xx(i),yy(i));
        end
        clear xx yy k;
        
        if norm(MR,inf)~=0
            helpdeiktis=1;
            while helpdeiktis<=n & MR(helpdeiktis)~=0
                W(MR(helpdeiktis),:)=(-1)*W(MR(helpdeiktis),:);
                helpdeiktis=helpdeiktis+1;
            end
        end

        if norm(MC,inf)~=0
            helpdeiktis=1;
            while helpdeiktis<=n  & MC(helpdeiktis)~=0
                W(:,MC(helpdeiktis))=(-1)*W(:,MC(helpdeiktis));
                helpdeiktis=helpdeiktis+1;
            end
        end
                
        
        WInitial=W;
    end
    
    if GaussOlMet==1
        [Z,m]=Gauss_Oliki(W,n);
    elseif GaussOlMet==2
        [Z,m]=Gauss_Oliki_Row(W,n);
    else
        [Z,m]=Gauss_Oliki_Random_Repeat(W,n,r,s); 
    end

        
    

    % Generate a structure of handles to pass to callbacks, and store it. 
	handles = guihandles(fig);
    handles.WArray=WInitial;
    handles.ZArray=Z;
    handles.MArray=M;
    handles.XYArray=XY;
    handles.ZWArray=ZW;
    handles.MinusRowArray=MR;
    handles.MinusColumnArray=MC;
    handles.RArray=r;
    handles.SArray=s;
    handles.diastasi=n;
    handles.GaussOlikiMethod=GaussOlMet;
	guidata(fig, handles);

    
    if get(handles.chkHideSavedMults,'Value')==1
        for k=1:n-1
            for j=k+1:n
                Z(j,k)=0;
            end
        end
    end
    
    set(handles.lsbResultArray,'String',num2str(rats(Z)));
    set(handles.txtPivotVector,'String',num2str(rats(M)));

    CLS_Array=cell(1,n);
    for i=1:n
        CLS_Array{1,i}=i;
    end
    
    set(handles.lstStepNumber,'String',CLS_Array,'Value',n);


	if nargout > 0
		varargout{1} = fig;
    end

elseif ischar(varargin{1}) % INVOKE NAMED SUBFUNCTION OR CALLBACK

	try
		[varargout{1:nargout}] = feval(varargin{:}); % FEVAL switchyard
	catch
		disp(lasterr);
	end

end


% --------------------------------------------------------------------
% ----------------- General Purpose Functions-------------------------
% --------------------------------------------------------------------
function [A,m]=Gauss_Oliki_Random_Repeat(B,n,r,s)
for k=1:n-1
    %[r(k),s(k)]=find_rand_max_indices(abs(B(k:n,k:n)));
    B=row_swap(B,n,k,r(k)+k-1);
    B=column_swap(B,n,k,s(k)+k-1);
    m(k)=abs(B(k,k));
    for j=k+1:n
        B(j,k)=B(j,k)/B(k,k);
    end
    for i=k+1:n
        for j=k+1:n
            B(i,j)=B(i,j)-B(i,k)*B(k,j);
        end
    end
end
m(n)=abs(B(n,n));
A=B;

function A=refmults(B)
deiktisA=1;
A(deiktisA)=B(1);
for i=2:length(B)
    vrethike=1;
    voithdeiktis=0;
    while vrethike==1 & voithdeiktis < deiktisA
        voithdeiktis=voithdeiktis+1;
        if abs(A(voithdeiktis)-B(i))<10^(-4)
            vrethike=0;
        end
    end
    if vrethike==1
        deiktisA=deiktisA+1;
        A(deiktisA)=B(i);
    end
end
A=sort(A);

% --------------------------------------------------------------------
function varargout = lsbResultArray_Callback(h, eventdata, handles, varargin)

function varargout = lstPosMults_Callback(h, eventdata, handles, varargin)

function varargout = chkHideSavedMults_Callback(h, eventdata, handles, varargin)

function varargout = edtPivot_Callback(h, eventdata, handles, varargin)

function varargout = chbSwapColumn_Callback(h, eventdata, handles, varargin)

function varargout = chbSwapRow_Callback(h, eventdata, handles, varargin)

% --------------------------------------------------------------------
% ------------------------- End --------------------------------------
% --------------------------------------------------------------------


% --------------------------------------------------------------------
function varargout = lstStepNumber_Callback(h, eventdata, handles, varargin)
i=get(gcbo,'Value');
set(handles.lsbResultArray,'Value',i);
set(handles.edtPivot,'String','');
set(handles.txtFindPivotRow,'String','-');
set(handles.txtFindPivotColumn,'String','-');
n=handles.diastasi;
W=handles.WArray;
R=handles.RArray;
S=handles.SArray;
%a=get(gcf,'SelectionType');
%if strcmp(a,'normal')
for k=1:i-1
    if handles.GaussOlikiMethod==1
        [r(k),s(k)]=find_max_indices(abs(W(k:n,k:n)));              
    elseif handles.GaussOlikiMethod==2
        [r(k),s(k)]=find_max_per_row_indices(abs(W(k:n,k:n)));    
    else 
        r(k)=R(k);
        s(k)=S(k);              
    end
    W=row_swap(W,n,k,r(k)+k-1);
    W=column_swap(W,n,k,s(k)+k-1);
    

    for j=k+1:n
        W(j,k)=W(j,k)/W(k,k);
    end

    m=abs(W(k,k));
    
    for q=k+1:n
        for j=k+1:n
            W(q,j)=W(q,j)-W(q,k)*W(k,j);
        end
    end
    
    if get(handles.chkHideSavedMults,'Value')==1
        for j=k+1:n
            W(j,k)=0;
        end
    end
end

if get(handles.chkRatFracAppr,'Value')==1
    set(handles.lsbResultArray,'String',num2str(rats(W)));
else
    set(handles.lsbResultArray,'String',num2str(W));
end

if i~=n
    A=refmults(handles.ZArray(i+1:n,i));
    n=length(A);
    CLS_Array=cell(1,n);
    for i=1:n
        if get(handles.chkRatFracAppr,'Value')==1
            CLS_Array{1,i}=rats(A(i));
        else
            CLS_Array{1,i}=A(i);
        end
    end
    set(handles.lstPosMults,'String',CLS_Array);
else
    set(handles.lstPosMults,'String','');
end
set(handles.psbSwapRowColumn,'Enable','off');
set(handles.chbSwapRow,'Enable','off');
set(handles.chbSwapColumn,'Enable','off');
%else
    %psbFindPivot_Callback(h, eventdata, handles)
    %end
% --------------------------------------------------------------------
function varargout = psbFindPivot_Callback(h, eventdata, handles, varargin)
i=get(handles.lstStepNumber,'Value');
n=handles.diastasi;
W=handles.WArray;
R=handles.RArray;
S=handles.SArray;
for k=1:i-1
    if handles.GaussOlikiMethod==1
        [r(k),s(k)]=find_max_indices(abs(W(k:n,k:n)));              
    elseif handles.GaussOlikiMethod==2
        [r(k),s(k)]=find_max_per_row_indices(abs(W(k:n,k:n)));    
    else 
        r(k)=R(k);
        s(k)=S(k);              
    end
    W=row_swap(W,n,k,r(k)+k-1);
    W=column_swap(W,n,k,s(k)+k-1);
    

    for j=k+1:n
        W(j,k)=W(j,k)/W(k,k);
    end

    m=abs(W(k,k));
    
    for q=k+1:n
        for j=k+1:n
            W(q,j)=W(q,j)-W(q,k)*W(k,j);
        end
    end
    
    if get(handles.chkHideSavedMults,'Value')==1
        for j=k+1:n
            W(j,k)=0;
        end
    end
end

if handles.GaussOlikiMethod==1
    [r(i),s(i)]=find_max_indices(abs(W(i:n,i:n)));             
elseif handles.GaussOlikiMethod==2
    [r(i),s(i)]=find_max_per_row_indices(abs(W(i:n,i:n)));    
else 
    r(i)=R(i);
    s(i)=S(i);             
end

if get(handles.chkRatFracAppr,'Value')==1
    set(handles.edtPivot,'String',num2str(rats(W(r(i)+i-1,s(i)+i-1))));
else
    set(handles.edtPivot,'String',num2str(W(r(i)+i-1,s(i)+i-1)));
end
set(handles.txtFindPivotRow,'String',num2str(r(i)+i-1));
set(handles.txtFindPivotColumn,'String',num2str(s(i)+i-1));
set(handles.psbSwapRowColumn,'Enable','on');
set(handles.chbSwapRow,'Enable','on');
set(handles.chbSwapColumn,'Enable','on');

% --------------------------------------------------------------------
function varargout = psbSwapRowColumn_Callback(h, eventdata, handles, varargin)
% Stub for Callback of the uicontrol handles.psbSwapRowColumn.
i=get(handles.lstStepNumber,'Value');
n=handles.diastasi;
W=handles.WArray;
R=handles.RArray;
S=handles.SArray;
for k=1:i-1
    if handles.GaussOlikiMethod==1
        [r(k),s(k)]=find_max_indices(abs(W(k:n,k:n)));              
    elseif handles.GaussOlikiMethod==2
        [r(k),s(k)]=find_max_per_row_indices(abs(W(k:n,k:n)));    
    else 
        r(k)=R(k);
        s(k)=S(k);              
    end
    W=row_swap(W,n,k,r(k)+k-1);
    W=column_swap(W,n,k,s(k)+k-1);
    

    for j=k+1:n
        W(j,k)=W(j,k)/W(k,k);
    end

    m=abs(W(k,k));
    
    for q=k+1:n
        for j=k+1:n
            W(q,j)=W(q,j)-W(q,k)*W(k,j);
        end
    end
    
    if get(handles.chkHideSavedMults,'Value')==1
        for j=k+1:n
            W(j,k)=0;
        end
    end
end

if handles.GaussOlikiMethod==1
    [r(i),s(i)]=find_max_indices(abs(W(i:n,i:n)));             
elseif handles.GaussOlikiMethod==2
    [r(i),s(i)]=find_max_per_row_indices(abs(W(i:n,i:n)));    
else 
    r(i)=R(i);
    s(i)=S(i);             
end
if get(handles.chbSwapRow,'Value')==1
    W=row_swap(W,n,i,r(i)+i-1);
end
if get(handles.chbSwapColumn,'Value')==1
    W=column_swap(W,n,i,s(i)+i-1);
end

if get(handles.chkRatFracAppr,'Value')==1
    set(handles.lsbResultArray,'String',num2str(rats(W)));
else
    set(handles.lsbResultArray,'String',num2str(W));
end

% --------------------------------------------------------------------
function varargout = psbRowSwaps_Callback(h, eventdata, handles, varargin)
XY=handles.XYArray;
if norm(XY,inf)==0
    msgbox('(0,0)','Row swaps','help','','','modal');
else
    [xx,yy]=define_swaps_1(XY);
    msgbox(define_swaps_2(xx,yy),'Row swaps','help','','','modal');
end

% --------------------------------------------------------------------
function varargout = psbColumnSwaps_Callback(h, eventdata, handles, varargin)
ZW=handles.ZWArray;
if norm(ZW,inf)==0
    msgbox('(0,0)','Column swaps','help','','','modal');
else
    [xx,yy]=define_swaps_1(ZW);
    msgbox(define_swaps_2(xx,yy),'Column swaps','help','','','modal');
end

% --------------------------------------------------------------------
function varargout = psbRowMults_Callback(h, eventdata, handles, varargin)
MR=handles.MinusRowArray;
msgbox(define_minusrow(MR),'Row multiplications','help','','','modal');


% --------------------------------------------------------------------
function varargout = psbColumnMults_Callback(h, eventdata, handles, varargin)
MC=handles.MinusColumnArray;
msgbox(define_minusrow(MC),'Row multiplications','help','','','modal');

% --------------------------------------------------------------------
function varargout = psbClose_Callback(h, eventdata, handles, varargin)
delete(handles.fgrDetermine)




% --------------------------------------------------------------------
function varargout = chkRatFracAppr_Callback(h, eventdata, handles, varargin)
M=handles.MArray;
if get(handles.chkRatFracAppr,'Value')==1
    set(handles.txtPivotVector,'String',num2str(rats(M)));
else
    set(handles.txtPivotVector,'String',num2str(M));
end    











function [x,y]=define_swaps_1(XY)
A=XY;

if norm(A,inf)==0
    x=0;
    y=0;
else
    vrethike=1;
    voithdeiktis=0;
    while vrethike==1
        voithdeiktis=voithdeiktis+1;
        if A(voithdeiktis)==-1
            vrethike=0;
        end
    end
    x=A(1:voithdeiktis-1);
    y=A(voithdeiktis+1:voithdeiktis+length(x));
end


function strSwaps=define_swaps_2(x,y)
h='';
for i=1:length(x)
    h=[h, ' ('];
    h=[h, num2str(x(i))];
    h=[h, ','];
    h=[h, num2str(y(i))];
    h=[h, ') '];
end

strSwaps=h;


function strmr=define_minusrow(MR);
A=MR;
i=1;
n=length(MR);
h=' ( ';
while i<=n & A(i)~=0
    h=[h, num2str(A(i))];
    h=[h, ', '];
    i=i+1;
end
templen=length(h);
if templen~=3
    h(templen-1:templen)='';
else
    h=[h, '0'];
end
h=[h,' ) '];
strmr=h;

function strmr=define_minuscolumn(MC);
A=MC;
i=1;
n=length(MC);
h=' ( ';
while i<=n & A(i)~=0
    h=[h, num2str(A(i))];
    h=[h, ', '];
    i=i+1;
end
templen=length(h);
if templen~=3
    h(templen-1:templen)='';
end
h=[h,' ) '];
strmr=h;

% --------------------------------------------------------------------
% ------------------------ General purpose functions -----------------
% --------------------------------------------------------------------

function A = column_swap(B,n,x,y)
A=B;
for j=1:n
    C(j)=A(j,x);
    A(j,x)=A(j,y);
    A(j,y)=C(j);
end

function A=cyclic_matrix_production(a,n)
for j=1:n
      A(j,:)=a;
      x=a(n);
      for i=n:-1:2
         a(i)=a(i-1);
      end
      a(1)=x;
end

function [i,j]=find_max_indices(B)
[y,r]=max(B);
[z,s]=max(y);
j=s;
i=r(s);

function [i,j]=find_max_per_row_indices(B)
[y,r]=max(B');
[z,s]=max(y);
i=s;
j=r(s);

function [i,j]=find_rand_max_indices(B)
[m,n]=find_max_indices(B);
[o,p]=find_max_per_row_indices(B);
a=B(m,n);
deiktisC=1;
C(deiktisC,1)=B(m,n);
C(deiktisC,2)=m;
C(deiktisC,3)=n;
deiktisC=deiktisC+1;
C(deiktisC,1)=B(o,p);
C(deiktisC,2)=o;
C(deiktisC,3)=p;
for deiktis1=1:length(B(:,1))
    for deiktis2=1:length(B(1,:))
        if B(deiktis1,deiktis2)==a
            if deiktis1~=m | deiktis2~=n
                if deiktis1~=o | deiktis2~=p
                    deiktisC=deiktisC+1;
                    C(deiktisC,1)=B(deiktis1,deiktis2);
                    C(deiktisC,2)=deiktis1;
                    C(deiktisC,3)=deiktis2;
                end
            end
        end
    end
end
if deiktisC==2
    i=o;
    j=p;
else
    w=round(rand*(deiktisC-3))+3;
    i=C(w,2);
    j=C(w,3);
end

function [A,m]=Gauss_Oliki(B,n)
for k=1:n-1
    [r(k),s(k)]=find_max_indices(abs(B(k:n,k:n)));
    B=row_swap(B,n,k,r(k)+k-1);
    B=column_swap(B,n,k,s(k)+k-1);
    m(k)=abs(B(k,k));
    for j=k+1:n
        B(j,k)=B(j,k)/B(k,k);
    end
    for i=k+1:n
        for j=k+1:n
            B(i,j)=B(i,j)-B(i,k)*B(k,j);
        end
    end
end
m(n)=abs(B(n,n));
A=B;

function [A,m]=Gauss_Oliki_Random(B,n)
for k=1:n-1
    [r(k),s(k)]=find_rand_max_indices(abs(B(k:n,k:n)));
    B=row_swap(B,n,k,r(k)+k-1);
    B=column_swap(B,n,k,s(k)+k-1);
    m(k)=abs(B(k,k));
    for j=k+1:n
        B(j,k)=B(j,k)/B(k,k);
    end
    for i=k+1:n
        for j=k+1:n
            B(i,j)=B(i,j)-B(i,k)*B(k,j);
        end
    end
end
m(n)=abs(B(n,n));
A=B;

function [A,m]=Gauss_Oliki_Row(B,n)
for k=1:n-1
    [r(k),s(k)]=find_max_per_row_indices(abs(B(k:n,k:n)));
    B=row_swap(B,n,k,r(k)+k-1);
    B=column_swap(B,n,k,s(k)+k-1);
    m(k)=abs(B(k,k));
    for j=k+1:n
        B(j,k)=B(j,k)/B(k,k);
    end
    for i=k+1:n
        for j=k+1:n
            B(i,j)=B(i,j)-B(i,k)*B(k,j);
        end
    end
end
m(n)=abs(B(n,n));
A=B;

function [A,x,y] = random_column_swap(B,n)
A=B;
x=round(rand*(n-1)+1);
y=round(rand*(n-1)+1);
while y==x
    y=round(rand*(n-1)+1);
end
for j=1:n
    C(j)=A(j,x);
    A(j,x)=A(j,y);
    A(j,y)=C(j);
end

function [A,x,y] = random_column_swaps(B,n,m)
A=B;
z=round((rand*(m-1))+1);
for i=1:z
    [A,x(i),y(i)] = random_column_swap(A,n);
end

function [A,x,y] = random_row_swap(B,n)
A=B;
x=round(rand*(n-1)+1);
y=round(rand*(n-1)+1);
while y==x
    y=round(rand*(n-1)+1);
end
for j=1:n
    C(j)=A(x,j);
    A(x,j)=A(y,j);
    A(y,j)=C(j);
end

function [A,x,y] = random_row_swaps(B,n,m)
A=B;
z=round((rand*(m-1))+1);
for i=1:z
    [A,x(i),y(i)] = random_row_swap(A,n);
end

function A=rev_cyclic_matrix_production(a,n)
for j=1:n
      A(j,:)=a;
      x=a(1);
      for i=2:n
         a(i-1)=a(i);
      end
      a(n)=x;
end

function A = row_swap(B,n,x,y)
A=B;
for j=1:n
    C(j)=A(x,j);
    A(x,j)=A(y,j);
    A(y,j)=C(j);
end


% --------------------------------------------------------------------
% ------------------------- End --------------------------------------
% --------------------------------------------------------------------






Contact us at files@mathworks.com