📄 anfsedit.m
字号:
function anfisedit(action);
% anfisedit Make anfis interface.
%
% Kelly Liu, Dec. 96
% Copyright 1994-2001 The MathWorks, Inc.
% $Revision: 1.9 $ $Date: 2001/09/11 12:51:00 $
if nargin<1,
% Open up an untitled system.
newFis=newfis('Untitled', 'sugeno');
newFis=addvar(newFis,'input','input1',[0 1],'init');
newFis=addvar(newFis,'output','output1',[0 1],'init');
action=newFis;
end
if isstr(action),
if action(1)~='#',
% The string "action" is not a switch for this function,
% so it must be a disk file
fis=readfis(action);
fis.inNum=length(fis.input);
fis.outNum=length(fis.output);
action='#initialize';
end
else
% For initialization, the fis matrix is passed in as the parameter
fis=action;
action='#initialize';
end;
if strcmp(action,'#initialize'),
for i=1:length(fis.input)
numInputMFs(i)=length(fis.input(i).mf);
end
totalInputMFs=sum(numInputMFs);
fisnodenum=length(fis.input)+2*totalInputMFs+2*length(fis.rule)+2+1;
infoStr=['Number of nodes: ' num2str(fisnodenum)];
fisName=fis.name;
nameStr=['ANFIS TRAINING: ' fisName];
figNumber=figure( ...
'Name',nameStr, ...
'Units', 'pixels', ...
'NumberTitle','off', ...
'MenuBar','none', ...
'NumberTitle','off', ...
'Tag', 'anfisedit',...
'Userdata', fis,...
'Visible','off');
% 'Position', [232 118 560 420],...
%======= create the menus standard to every GUI
fisgui #initialize
editHndl=findobj(figNumber,'Type','uimenu','Tag','editmenu');
uimenu(editHndl,'Label','Undo', ...
'Enable','off');
axes( ...
'Units','normalized', ...
'Position',[0.10 0.55 0.65 0.415]);
%===================================
left=0.03;
right=0.75;
bottom=0.05;
labelHt=0.03;
spacing=0.005;
frmBorder=0.012;
%======Set up the text Window==========
top=0.5;
% First, the Text Window frame
frmPos=[.031 .115 .40 .361];
frmHandle=LocalBuildFrmTxt(frmPos, '', 'frame', '');
frmPos=[.449 .115 .52 .361];
frmHandle=LocalBuildFrmTxt(frmPos, '', 'frame', '');
frmPos=[.031 .0218 .756 .073];
frmHandle=LocalBuildFrmTxt(frmPos, '', 'frame', '');
% Then the text label
left=.052;
labelPos=[left .431 .360 .030];
lableHndl=LocalBuildFrmTxt(labelPos, 'ANFIS Information', 'text', 'lable2');
% Then the editable text field
mcwPos=[left .141 .361 .276];
textHndl=LocalBuildUi(mcwPos, 'text', 'anfisedit #changetext', infoStr, 'Comments');
%========Set up the Command Text Window ==================
% The text label
labelPos=[.481 .417 .275 .042];
lableHndl=LocalBuildFrmTxt(labelPos, 'data from workspace', 'text', 'lable2');
left=.464;
width=.126;
height=.046;
left1=.609;
width1=.144;
height1=.046;
labelPos=[left .325 width height];
mcwPos=[left1 .325 width1 height1];
lableHandle=LocalBuildFrmTxt(labelPos, 'trndatin', 'text', 'lable1');
% Then the editable text field
mcwHndl=LocalBuildUi(mcwPos, 'edit', 'anfisedit #trndatin', '', 'trndatin');
set(mcwHndl, 'Max', 1);
% ========trndtout
labelPos=[left .266 width height];
mcwPos=[left1 .266 width1 height1];
lableHandle=LocalBuildFrmTxt(labelPos, 'trndatout', 'text', 'lable1');
% Then the editable text field
mcwHndl=LocalBuildUi(mcwPos, 'edit', 'anfisedit #trndatout', '', 'trndatout');
set(mcwHndl, 'Max', 1);
% ========chkdatin
labelPos=[left .206 width height];
mcwPos=[left1 .206 width1 height1];
lableHandle=LocalBuildFrmTxt(labelPos, 'chkdatout', 'text', 'lable1');
% Then the editable text field
mcwHndl=LocalBuildUi(mcwPos, 'edit', 'anfisedit #chkdatin', '', 'chkdatin');
set(mcwHndl, 'Max', 1);
% ========chkdtout
labelPos=[left .143 width height];
mcwPos=[left1 .143 width1 height1];
lableHandle=LocalBuildFrmTxt(labelPos, 'chkdatout', 'text', 'lable1');
% Then the editable text field
mcwHndl=LocalBuildUi(mcwPos, 'edit', 'anfisedit #chkdatout', '', 'chkdatout');
set(mcwHndl, 'Max', 1);
%========Set up the Status Window ==================
% Then the status text field
mcwPos=[0.0491071428571429 0.0376984126984127 0.705357142857143 0.040];
mcwHndl=LocalBuildUi(mcwPos, 'text', '', '', 'status');
%====================================
% Information for all buttons
left=0.80;
btnWid=0.15;
top=.55;
%=========The Panel frame============
frmBorder=0.02;
frmPos=[left-frmBorder .524 btnWid+2*frmBorder .446];
frmHandle=LocalBuildFrmTxt(frmPos, '', 'frame', '');
%=========The Error frame=============
frmBorder=0.02;
btnHt=0.03;
yPos=top+.31;
btnPos=[0.78125 0.38492 0.15029 0.035];
slideHandle=LocalBuildFrmTxt(btnPos, 'Error Limit', 'text', 'slide');
%=========The Epoch frame=============
yPos=top+.22;
btnPos=[0.787202380952381 0.246031746031746 0.150297619047619 0.0376984126984127];
slideHandle=LocalBuildFrmTxt(btnPos, 'Epochs', 'text', 'slide');
%=========The tst frame=============
yPos=top-.23;
btnPos=[0.802083333333333 0.595 0.150297619047619 0.0297619047619048];
slideHandle=LocalBuildFrmTxt(btnPos, 'Test', 'text', 'slide');
%======Error Lim edit===================
mcwPos=[0.785714285714286 0.30952380952381 0.150297619047619 0.0615079365079365];
backHndl=LocalBuildUi(mcwPos, 'edit', 'anfisedit #errorlim','0', 'errlim');
%======The epoch edit==============
mcwPos=[0.790178571428571 0.16468253968254 0.150297619047619 0.0595238095238095];
LocalBuildUi(mcwPos, 'edit', 'anfisedit #reset', '3', 'epoch');
%=========The Start button============
callbackStr='anfisedit #start';
nextHndl=LocalBuildBtns('pushbutton', 3, 'Start', callbackStr, 'startbtn');
%======The Genfis button================
newHndl=LocalBuildBtns('popupmenu', 2, {'grid genfis', 'cluster genfis'}, 'anfisedit #genfis', 'genfis');
%======The New fis button=============
delHndl=LocalBuildBtns('pushbutton', 4, 'FIS Struc.', 'anfisedit #plotstruc', 'plotstrc');
%=======The Open Training set button==============
addHndl=LocalBuildBtns('pushbutton', 1, 'OpenTrn...', 'anfisedit #opentrn', 'opentrn');
%=======The Open test button==============
% saveHndl=LocalBuildBtns('pushbutton', 7, 'OpenTest...', 'anfisedit #opentst', 'opentst');
%=======The Test button==============
infoHndl=LocalBuildBtns('popupmenu', 5, {'Training', 'Testing'}, 'anfisedit #test', 'test');
%=======The Close button=============
closeHndl=LocalBuildBtns('pushbutton', 0, 'Close', 'fisgui #close', 'close');
%====================================
% The MENUBAR items
% First create the menus standard to every GUI
% Now uncover the figure
set(figNumber,'Visible','on');
LocalEnableBtns(fis);
elseif strcmp(action,'#update'),
%====================================
figNumber=watchon;
fis=get(figNumber,'UserData');
% Clear the current variable plots and redisplay
textHndl=findobj(gcf, 'Tag', 'Comments');
%textstr=get(textHndl, 'String');
textstr={['input number: ' num2str(length(fis.input)) 'output number: ' ...
num2str(length(fis.output)) 'input mfs: ' num2str(getfis(fis, 'inmfs'))]};
textstr={['input mfs: ' num2str(getfis(fis, 'inmfs'))]};
set(textHndl, 'String', textstr);
watchoff;
%========start to train anfis==============
elseif strcmp(action,'#start'),
fis=get(gcf, 'UserData');
% fis=fis(1);
if ~isfield(fis, 'trndata')| isempty(fis.trndata(1))
msgbox('no training data yet');
elseif isempty(fis.input(1).mf)
msgbox('No membership functions! Use mf editor or genfis button to generate membership functions');
elseif ~isfield(fis, 'rule') | isempty(fis.rule)
msgbox('No rules yet! Use rule editor or genfis button to generate rules.');
else
if isfield(fis, 'tstdata')
testdata=fis.tstdata;
else
testdata=[];
end
cla;
EpochHndl=findobj(gcf, 'Tag', 'epoch');
numEpochs=str2double(get(EpochHndl, 'String'));
if isempty(numEpochs)
numEpochs=0;
end
txtHndl=findobj(gcf, 'Tag', 'status');
stopHndl=findobj(gcf, 'Tag', 'startbtn');
stopflag=get(stopHndl, 'String');
if strcmp(stopflag, 'Start')
set(stopHndl, 'String', 'Stop');
errHndl=findobj(gcf, 'Tag', 'errline');
errLimHndl=findobj(gcf, 'Tag', 'errlim');
errlim=str2double(get(errLimHndl, 'String'));
if isempty(errlim)
errlim=0;
end
if isempty(errHndl)|length(get(errHndl, 'Xdata'))~=numEpochs
if length(get(errHndl, 'Xdata'))~=numEpochs
delete(errHndl)
end
errHndl=line([1:numEpochs], [1:numEpochs], 'linestyle', 'none',...
'marker', '*', 'Tag', 'errline');
end
errvector=zeros(numEpochs,1);
else
set(stopHndl, 'String', 'Start');
end
fismat1=fis;
if strcmp(stopflag, 'Start')
for i=1:numEpochs
[fismat1, trn_err]=anfis(fis.trndata, fismat1, 2, NaN, testdata, errHndl, stopHndl);
errvector(i)=trn_err(1);
set(errHndl, 'Ydata', errvector);
drawnow
txtStr={['Epoch ' num2str(i) ':error= ' num2str(trn_err(1))]};
set(txtHndl, 'String', txtStr);
stopflag=get(stopHndl, 'String');
if strcmp(stopflag, 'Start')| trn_err(1)<=errlim
break;
end
end %end of if Satrt
set(stopHndl, 'String', 'Start');
end % end of for loop
fismat1.trndata=fis.trndata;
if isfield(fis, 'tst.dat');
fismat1.tstdata=fis.tstdata;
end
% newfis(1)=fismat1;
% newfis(2)=fis;
set(gcf, 'UserData', fismat1);
figNumber=watchon;
updtfis(figNumber,fismat1,[6]);
watchoff;
end
%========take training input data from commandline workspace
elseif strcmp(action,'#trndatin'),
fis=get(gcf, 'UserData');
trndatinHndl=findobj(gcf, 'Tag', 'trndatin');
trndatinTxt=get(trndatinHndl, 'String');
trnData=[];
trnData=evalin('base', trndatinTxt, '[]');
if isempty(trnData),
msgbox('No such variable (or variable is empty)')
else
fis.trndata(:,1:length(fis.input))=trnData
end
%========take training output data from commandline workspace
elseif strcmp(action,'#trndatout'),
fis=get(gcf, 'UserData');
trndatinHndl=findobj(gcf, 'Tag', 'trndatout');
trndatinTxt=get(trndatinHndl, 'String');
trnData=[];
trnData=evalin('base', trndatinTxt, '[]');
if isempty(trnData)
msgbox(['no such variable ' trndatinTxt ' in workspace']);
else
fis.trndata(:,length(fis.input)+1)=trnData
end
%=======Auto generate anfis with gbell mf=====
elseif strcmp(action,'#genfis'),
figNumber=gcf;
fis=get(gcf,'UserData');
if ~isfield(fis, 'trndata');
msgbox('No Training Data for automatically generate fis membership functions');
else
trnData=fis.trndata;
genHndl=findobj(figNumber, 'Tag', 'genfis');
n=get(genHndl, 'Value');
if n==1
mfType=getfis(fis, 'inmftypes');
param=inputdlg({'input mfs:'});
inmflist=str2double(char(param));
if ~isempty(inmflist)&length(inmflist)~=length(fis.input)
inmflist(end+1:length(fis.input))=inmflist(end);
end
%mfType=questdlg('Mf type?', ...
% 'selece mf type', ...
% 'trimf','gbellm','gauss','trim');
%% figNumber=watchon;
%% dlgHndl=gfmfdlg(figNumber, fis, 'input', 1);
%% waitfor(dlgHndl)
%% watchoff(figNumber);
if isempty(inmflist)
inmflist=[2];
end
if isempty(mfType)|( size(mfType, 1)~=1 & size(mfType,1)~=size(fis.trndata,2)-1)
mfType='gbellmf';
end
mfType
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -