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

📄 ruleview.m

📁 最新模糊逻辑工具箱
💻 M
📖 第 1 页 / 共 4 页
字号:
                            '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 + -