📄 ruleview.m
字号:
'LineWidth',4, ...
'UserData',lineHndl, ...
'Color',[0 0 1]);
end
end
end
if (ruleIndex>numRules) & (varIndex<=numInputs),
%====================================
% MOVEABLE INDEX LINES
%====================================
% Draw in moveable input index lines
% This axes position covers all axes in this input column
% boxBtm= mainAxPos(2)+mainAxPos(4)-ruleIndex*(10*yInset+yInset2);
% axPos=[boxLft+xInset mainAxPos(2) boxWid-2*xInset mainAxPos(4)];
axPos=[boxLft+xInset boxBtm+yInset boxWid-2*xInset ruleIndex*(10*yInset+yInset2)];
colIndex=sum(numInputMFs(1:(varIndex-1)))+1;
xMin=inRange(varIndex,1);
xMax=inRange(varIndex,2);
inputVal=inputVector(varIndex);
set(gca, ...
'Units','pixel', ...
'Visible','off', ...
'XLim',[xMin xMax],'YLim',[0 1], ...
'Position',axPos);
line([1 1]*inputVal,[0.01 1], ...
'LineWidth',0.5, ...
'Color',[1 0 0], ...
'ButtonDownFcn','ruleview #clickline', ...
'UserData',varIndex, ...
'Tag','indexline', ...
'LineStyle','-');
% The following patch is used to allow click-anywhere
% positioning of the index line
patchHndl=patch([xMin xMax xMax xMin xMin],[0 0 1 1 0],'black');
set(patchHndl, ...
'ButtonDownFcn','ruleview #patchclick', ...
'FaceColor','none', ...
'EdgeColor','none');
if ruleIndex==numRules+1,
% Plot the variable name at the top of each column
varName=fis.input(varIndex).name;
title([varName ' = ' num2str(inputVal,3)], 'visible', 'on', 'fontSize', 8);
end
end
if (ruleIndex>numRules) & (varIndex>numInputs),
%====================================
% AGGREGATE MF PLOT
%====================================
varName=fis.output(varIndex-numInputs).name;
mfColIndex=sum(numOutputMFs(1:(varIndex-numInputs-1)))+1;
if mfColIndex<=size(xOut,2),
x=xOut(:,mfColIndex);
else
x=zeros(size(arr,1),1);
end
% compStr=computer;
% if compStr(1:2)=='PC',
% eraseMode='normal';
% else
% eraseMode='background';
% end
% xlabel(num2str(v(varIndex-numInputs),3), ...
% 'FontSize',8,'EraseMode',eraseMode);
if strcmp(fisType,'mamdani'),
% MAMDANI
xMin=outRange(varIndex-numInputs,1);
xMax=outRange(varIndex-numInputs,2);
set(gca, ...
'XLim',[xMin xMax],'YLim',[-0.1 1.1], ...
'XTick',[xMin xMax], ...
'FontSize',8, ...
'XColor','b','YColor','b')
xData=[xMin; x; xMax];
yData=[0; arr(:,varIndex-numInputs); 0];
MFHndlMat(ruleIndex,varIndex)=patch( ...
xData,yData,[.3 .3 1]);
line(v(varIndex-numInputs)*[1 1],[-0.05 1.05], ...
'Color',[1 0 0], ...
'MarkerSize',12, ...
'LineWidth',3)
else
% SUGENO system
set(gca, ...
'XLim',outRange, ...
'YLim',[-0.05 1.05], ...
'XTick',outRange, ...
'XColor','black','YColor','black')
lineHndl=line(v(varIndex-numInputs)*[1 1],[-0.05 1.05], ...
'Color',[1 0 0], ...
'MarkerSize',15, ...
'LineWidth',2);
xData=orr(:,varIndex-numInputs)';
xData=[xData; xData; NaN*ones(size(xData))];
yData=arr(:,varIndex-numInputs)';
yData=[zeros(size(yData)); yData; NaN*ones(size(yData))];
MFHndlMat(ruleIndex,varIndex)=line(xData(:),yData(:), ...
'LineWidth',4, ...
'UserData',lineHndl, ...
'Color',[.3 .3 1]);
end
end
end
end
% The UserData will contain the varIndex to simplify
% calculations later on.
set(inputDispHndl, ...
'Value',inputVector, ...
'String',[' ' mat2str(inputVector,4)]);
% Get handles to axes for plotting
frameName='dataframe';
dataFrmHndl=findobj(figNumber,'Type','uicontrol', ...
'Style','frame','Tag',frameName);
set(dataFrmHndl,'UserData',MFHndlMat);
% Normalize all coordinates
hndlList=findobj(figNumber,'Units','pixels');
set(hndlList,'Units','normalized');
set(inputDispHndl,'Enable','on');
watchoff(figNumber)
elseif strcmp(action,'#clickline'),
%====================================
figNumber=gcf;
set(figNumber,'WindowButtonMotionFcn','ruleview #dragline');
set(figNumber,'WindowButtonUpFcn','ruleview #updateinputs');
ruleview #dragline
elseif strcmp(action,'#dragline'),
%====================================
lineHndl=gco;
axHndl=get(lineHndl,'Parent');
textHndl1=get(axHndl,'Title');
ptMat=get(axHndl,'CurrentPoint');
x=ptMat(1,1);
xLims=get(axHndl,'XLim');
if (x < xLims(1)),
x=xLims(1);
elseif (x > xLims(2)),
x=xLims(2);
end
set(lineHndl,'XData',[x x]);
oldtext = get(textHndl1, 'String');
stopn=find(oldtext=='=');
set(textHndl1,'String',[oldtext(1:stopn),' ', num2str(x(1),3)]);
% Uncomment the following lines if you want to see continuous update
% during a line drag
% ruleview #updateinputs
% set(figNumber,'WindowButtonMotionFcn','ruleview #dragline');
% set(figNumber,'WindowButtonUpFcn','ruleview #updateinputs');
elseif strcmp(action,'#updateinputs'),
%====================================
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
if strcmp(get(gco,'Type'),'line'),
% We're here because the moveable line indices have been moved
lineHndl=gco;
xData=get(lineHndl,'XData');
varIndex=get(lineHndl,'UserData');
inputDispHndl=findobj(figNumber,'Type','uicontrol','Tag','inputdisp');
inputVector=get(inputDispHndl,'Value');
inputVector(varIndex)=xData(1);
set(inputDispHndl,'Value',inputVector);
set(inputDispHndl,'String',[' ' mat2str(inputVector,4)]);
else
% We're here because the input vector text field has been changed
inputDispHndl=gco;
% Error-checking
% The backupInputVector is the previous (or safety) value
backupInputVector=get(inputDispHndl,'Value');
% Use try-catch eval statement to keep out ASCII trash
newInputStr=get(inputDispHndl,'String');
% We'll put the brackets in later; no point in dealing with the hassle
index=[find(newInputStr=='[') find(newInputStr==']')];
newInputStr(index)=32*ones(size(index));
newInputStr=['[' newInputStr ']'];
% Use eval try-catch to prevent really weird stuff...
inputVector=eval(newInputStr,'backupInputVector');
if length(inputVector)<numInputs,
inputVector=backupInputVector;
else
inputVector=inputVector(1:numInputs);
end
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)]);
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=str2num(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=get(lineHndl,'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)], '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
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -