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 --------------------------------------
% --------------------------------------------------------------------