⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 ruleview.m

📁 交流 模糊控制 交流 模糊控制
💻 M
📖 第 1 页 / 共 3 页
字号:
            % 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 + -