📄 ruleview.m
字号:
% Check to make sure each input is within its limits
if (inputVector(count) < xLims(1)),
inputVector(count)=xLims(1);
elseif (inputVector(count) > xLims(2)),
inputVector(count)=xLims(2);
end
set(indexLineHndl,'XData',inputVector(count)*[1 1]);
oldtext=get(textHndl,'String');
textn=find(oldtext=='=');
set(textHndl,'String',[oldtext(1:textn), ' ', num2str(inputVector(count),3)]);
end
set(inputDispHndl,'Value',inputVector);
set(inputDispHndl,'String',[' ' mat2str(inputVector,4)]);
end
% Get handles to axes for plotting
frameName='dataframe';
dataFrmHndl=findobj(figNumber,'Type','uicontrol', ...
'Style','frame','Tag',frameName);
MFHndlMat=get(dataFrmHndl,'UserData');
% Remove the button motion and button up functions
set(figNumber,'WindowButtonMotionFcn',' ');
set(figNumber,'WindowButtonUpFcn',' ');
numPts=101;
pthndl=findobj(gcf, 'Tag', 'numdisp');
temp=str2double(get(pthndl, 'String'));
if ~isempty(temp) & temp>=101
numPts=temp;
end
[v,IRR,ORR,ARR]=evalfis(inputVector,fis, numPts);
numRules=length(fis.rule);
fisType=fis.type;
%====================================
% Update INPUTS (we only need to update ONE of the inputs)
for ruleIndex=1:numRules,
for varIndex=1:numInputs,
% If the handle is zero, then the plot doesn't exist, so
% don't mess with anything
if MFHndlMat(ruleIndex,varIndex),
axHndl=get(MFHndlMat(ruleIndex,varIndex),'Parent');
lineHndl=findobj(axHndl,'Type','line');
yData=get(lineHndl,'YData');
yData=min(yData,IRR(ruleIndex,varIndex));
yData=[0 yData 0];
set(MFHndlMat(ruleIndex,varIndex), ...
'YData',yData);
end
end
end
%====================================
% Update OUTPUTS
if strcmp(fisType,'mamdani'),
% MAMDANI system
% Update individual rule output displays (implication)
for ruleIndex=1:numRules
for varIndex=(1:numOutputs)+numInputs,
yData=ORR(:,ruleIndex+(varIndex-numInputs-1)*numRules);
yData=[0 yData' 0];
lineHndl=MFHndlMat(ruleIndex,varIndex);
if ruleIndex==1
axHndl=findobj(gcbf, 'Tag', ['output' num2str(varIndex-numInputs)]);
titleHndl=get(axHndl,'Title');
oldtext=get(titleHndl,'String');
if ~isempty(oldtext)
textn=find(oldtext=='=');
else
textn=[];
end
set(titleHndl,'Visible', 'on', 'String',[oldtext(1:textn), ' ', num2str(v(varIndex-numInputs),3)], 'fontSize', 8);
end
if lineHndl,
% Don't update it if it doesn't exist
set(lineHndl,'YData',yData);
end
end
end
% Update aggregate output display
for varIndex=(1:numOutputs)+numInputs,
patchHndl=MFHndlMat(numRules+1,varIndex);
axHndl=get(patchHndl,'Parent');
yData=ARR(:,varIndex-numInputs);
yData=[0 yData' 0];
set(patchHndl, ...
'YData',yData);
lineHndl=findobj(axHndl,'Type','line');
set(lineHndl,'XData',v(varIndex-numInputs)*[1 1]);
end
else
% SUGENO system
for ruleIndex=1:numRules
for varIndex=(1:numOutputs)+numInputs,
thickLineHndl=MFHndlMat(ruleIndex,varIndex);
% Don't update it if it doesn't exist
if thickLineHndl,
thinLineHndl=get(MFHndlMat(ruleIndex,varIndex),'UserData');
xData2=[1 1]*ORR(ruleIndex,varIndex-numInputs);
set(thinLineHndl,'XData',xData2);
yData=[0 1]*ARR(ruleIndex,varIndex-numInputs);
set(MFHndlMat(ruleIndex,varIndex), ...
'XData',xData2,'YData',yData);
if ruleIndex==1
axHndl=get(thinLineHndl,'Parent');
titleHndl=get(axHndl,'Title');
oldtext=get(titleHndl,'String');
textn=find(oldtext=='=');
set(titleHndl,'Visible', 'on', 'String',[oldtext(1:textn), ' ', num2str(v(varIndex-numInputs),3)]);
end
end
end
end
% Update aggregate output display
for varIndex=(1:numOutputs)+numInputs,
xData=ORR(:,varIndex-numInputs)';
xData=[xData; xData; NaN*ones(size(xData))];
yData=ARR(:,varIndex-numInputs)';
yData=[zeros(size(yData)); yData; NaN*ones(size(yData))];
lineHndl1=MFHndlMat(numRules+1,varIndex);
set(lineHndl1, ...
'XData',xData(:),'YData',yData(:));
% Now reposition the output index line
lineHndl2=get(lineHndl1,'UserData');
xData2=v(varIndex-numInputs)*[1 1];
set(lineHndl2,'XData',xData2);
end
end
elseif strcmp(action,'#patchclick'),
%====================================
patchHndl=gco;
figNumber=gcf;
axHndl=get(patchHndl,'Parent');
lineHndl=findobj(axHndl,'Type','line');
set(figNumber,'CurrentObject',lineHndl);
ruleview #clickline
elseif strcmp(action,'#input'),
%====================================
inputHndl=gco;
figNumber=gcf;
elseif strcmp(action,'#disprule'),
%====================================
% Display the rule that the user has clicked on
txtHndl=gco;
figNumber=gcf;
selectColor=[1 0 0];
% Find and reset any previously highlighted rules
oldTxtHndl=findobj(figNumber,'Type','text','Tag','rulelabel','FontSize',14);
if length(oldTxtHndl)>0,
set(oldTxtHndl,'Color','black','FontSize',8,'FontWeight','normal');
end
set(txtHndl,'Color',selectColor,'FontSize',14,'FontWeight','bold');
% Find out what display format is preferred
formatHndl=findobj(figNumber,'Type','uimenu','Tag','dispformat');
dispFormat=get(findobj(formatHndl,'Checked','on'),'Tag');
oldfis=get(figNumber,'UserData');
fis=oldfis{1};
ruleIndexStr=get(txtHndl,'String');
ruleIndex=str2double(ruleIndexStr);
if strcmp(dispFormat,'indexed'),
ruleStr=['Rule ' num2str(ruleIndex) '. ' showrule(fis,ruleIndex,'indexed')];
else
ruleStr=['Rule ' showrule(fis,ruleIndex,dispFormat)];
end
% The next line is a hack to make sure that the "|" character will display
% properly in a text uicontrol
ruleStr=str2mat(ruleStr,' ');
statmsg(figNumber,ruleStr);
elseif strcmp(action,'#dispformat');
%====================================
figNumber=watchon;
currHndl=gcbo;
verHndl=findobj(figNumber,'Type','uimenu','Tag','verbose');
symHndl=findobj(figNumber,'Type','uimenu','Tag','symbolic');
indHndl=findobj(figNumber,'Type','uimenu','Tag','indexed');
set([verHndl symHndl indHndl],'Checked','off');
set(currHndl,'Checked','on');
watchoff(figNumber)
elseif strcmp(action, '#shiftleft')
axesHndl=findobj(gcbf, 'Type','axes');
pos=get(axesHndl, 'Position');
for i=1:length(pos)
set(axesHndl(i), 'Position', pos{i}-[.05 0 0 0]);
end
elseif strcmp(action, '#shiftright')
axesHndl=findobj(gcbf, 'Type','axes');
pos=get(axesHndl, 'Position');
for i=1:length(pos)
set(axesHndl(i), 'Position', pos{i}+[.05 0 0 0]);
end
elseif strcmp(action, '#shiftup')
axesHndl=findobj(gcbf, 'Type','axes');
pos=get(axesHndl, 'Position');
for i=1:length(pos)
set(axesHndl(i), 'Position', pos{i}+[0 0.05 0 0]);
end
elseif strcmp(action, '#shiftdown')
axesHndl=findobj(gcbf, 'Type','axes');
pos=get(axesHndl, 'Position');
for i=1:length(pos)
set(axesHndl(i), 'Position', pos{i}-[0 .05 0 0]);
end
elseif strcmp(action, '#slidehori')
Hndl=gcbo;
value=get(gcbo, 'Value');
axesHndl=findobj(gcbf, 'Type','axes');
pos=get(axesHndl, 'Position');
for i=1:length(pos)
newpos=pos{i};
newpos(1)=value;
set(axesHndl(i), 'Position', newpos);
end
elseif strcmp(action,'#help');
figNumber=watchon;
helpwin(mfilename);
watchoff(figNumber)
elseif strcmp(action,'#simulink');
% figNumber=gcf;
oldfis=get(figNumber,'UserData');
fis=oldfis{1};
if isfield(fis, 'input')
numInputs=length(fis.input);
else
numInputs=0;
end
if isfield(fis, 'output')
numOutputs=length(fis.output);
else
numOutputs=0;
end
% We're here because the input vector text field has been changed
% Error-checking
% The backupInputVector is the previous (or safety) value
% Use try-catch eval statement to keep out ASCII trash
inputVector=input;
for i=1:numInputs
inRange(i, 1:2)=fis.input(i).range;
end
for count=1:numInputs,
% Find the appropriate index line
indexLineHndl=findobj(figNumber, ...
'Type','line','Tag','indexline','UserData',count);
textHndl=get(get(indexLineHndl,'Parent'),'title');
xLims=inRange(count,:);
% Check to make sure each input is within its limits
if (inputVector(count) < xLims(1)),
inputVector(count)=xLims(1);
elseif (inputVector(count) > xLims(2)),
inputVector(count)=xLims(2);
end
set(indexLineHndl,'XData',inputVector(count)*[1 1]);
oldtext=get(textHndl,'String');
textn=find(oldtext=='=');
set(textHndl,'String',[oldtext(1:textn), ' ', num2str(inputVector(count),3)]);
set(indexLineHndl,'XData',inputVector(count)*[1 1]);
% set(textHndl,'String',num2str(inputVector(count),3), 'Visible', 'on');
end
inputDispHndl=findobj(figNumber, 'Tag', 'inputdisp');
set(inputDispHndl,'Value',inputVector);
set(inputDispHndl,'String',[' ' mat2str(inputVector,4)]);
% Get handles to axes for plotting
frameName='dataframe';
dataFrmHndl=findobj(figNumber,'Type','uicontrol', ...
'Style','frame','Tag',frameName);
MFHndlMat=get(dataFrmHndl,'UserData');
% Remove the button motion and button up functions
set(figNumber,'WindowButtonMotionFcn',' ');
set(figNumber,'WindowButtonUpFcn',' ');
numPts=101;
pthndl=findobj(gcf, 'Tag', 'numdisp');
tempstr=get(pthndl, 'String');
temp=[];
if ~isempty(tempstr)
temp=str2double(get(pthndl, 'String'));
end
if ~isempty(temp) & temp>=101
numPts=temp;
end
[v,IRR,ORR,ARR]=evalfis(inputVector,fis, numPts);
numRules=length(fis.rule);
fisType=fis.type;
%====================================
% Update INPUTS (we only need to update ONE of the inputs)
for ruleIndex=1:numRules,
for varIndex=1:numInputs,
% If the handle is zero, then the plot doesn't exist, so
% don't mess with anything
if MFHndlMat(ruleIndex,varIndex),
axHndl=get(MFHndlMat(ruleIndex,varIndex),'Parent');
lineHndl=findobj(axHndl,'Type','line');
yData=get(lineHndl,'YData');
yData=min(yData,IRR(ruleIndex,varIndex));
yData=[0 yData 0];
set(MFHndlMat(ruleIndex,varIndex), ...
'YData',yData);
end
end
end
%====================================
% Update OUTPUTS
if strcmp(fisType,'mamdani'),
% MAMDANI system
% Update individual rule output displays (implication)
for ruleIndex=1:numRules
for varIndex=(1:numOutputs)+numInputs,
yData=ORR(:,ruleIndex+(varIndex-numInputs-1)*numRules);
yData=[0 yData' 0];
lineHndl=MFHndlMat(ruleIndex,varIndex);
if ruleIndex==1
axHndl=get(lineHndl,'Parent');
titleHndl=get(axHndl,'Title');
oldtext=get(titleHndl,'String');
textn=find(oldtext=='=');
set(titleHndl, 'String',[oldtext(1:textn), ' ', num2str(v(varIndex-numInputs),3)], 'fontSize', 8);
end
if lineHndl,
% Don't update it if it doesn't exist
set(lineHndl,'YData',yData);
end
end
end
% Update aggregate output display
for varIndex=(1:numOutputs)+numInputs,
patchHndl=MFHndlMat(numRules+1,varIndex);
axHndl=get(patchHndl,'Parent');
yData=ARR(:,varIndex-numInputs);
yData=[0 yData' 0];
set(patchHndl, ...
'YData',yData);
lineHndl=findobj(axHndl,'Type','line');
set(lineHndl,'XData',v(varIndex-numInputs)*[1 1]);
end
else
% SUGENO system
for ruleIndex=1:numRules
for varIndex=(1:numOutputs)+numInputs,
thickLineHndl=MFHndlMat(ruleIndex,varIndex);
% Don't update it if it doesn't exist
if thickLineHndl,
thinLineHndl=get(MFHndlMat(ruleIndex,varIndex),'UserData');
xData2=[1 1]*ORR(ruleIndex,varIndex-numInputs);
set(thinLineHndl,'XData',xData2);
yData=[0 1]*ARR(ruleIndex,varIndex-numInputs);
set(MFHndlMat(ruleIndex,varIndex), ...
'XData',xData2,'YData',yData);
end
if ruleIndex==1
axHndl=get(thickLineHndl,'Parent');
titleHndl=get(axHndl,'Title');
oldtext=get(titleHndl,'String');
textn=find(oldtext=='=');
set(titleHndl, 'String',[oldtext(1:textn), ' ', num2str(v(varIndex-numInputs),3)], 'fontSize', 8);
end
end
end
% Update aggregate output display
for varIndex=(1:numOutputs)+numInputs,
xData=ORR(:,varIndex-numInputs)';
xData=[xData; xData; NaN*ones(size(xData))];
yData=ARR(:,varIndex-numInputs)';
yData=[zeros(size(yData)); yData; NaN*ones(size(yData))];
lineHndl1=MFHndlMat(numRules+1,varIndex);
set(lineHndl1, ...
'XData',xData(:),'YData',yData(:));
% Now reposition the output index line
lineHndl2=get(lineHndl1,'UserData');
xData2=v(varIndex-numInputs)*[1 1];
set(lineHndl2,'XData',xData2);
end
end
end; % if strcmp(action, ...
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -