www.gusucode.com > 模糊控制工具箱 fuzzy logic toolbox源码程序 > fuzzy/fuzzy/getfisold.m

    function out=getfisold(fis,arg1,arg2,arg3,arg4,arg5)
%getfisold Get fuzzy inference system properties.
%   OUT = getfisold(FIS) returns a list of general information about the
%   fuzzy inference system FIS. OUT = getfisold(FIS,'fisProp') returns 
%   the current value of the FIS property called 'fisProp'.
%
%   OUT = getfisold(FIS,'varType',varIndex) returns a list of general
%   information about the specified FIS variable.
%   OUT = getfisold(FIS,'varType',varIndex,'varProp') returns the current
%   value of the variable property called 'varProp'.
%
%   OUT = getfisold(FIS,'varType',varIndex,'mf',mfIndex) returns a list of
%   general information about the specified FIS membership function.
%   OUT = getfisold(FIS,'varType',varIndex,'mf',mfIndex,'mfProp') returns
%   the current value of the membership function property called 'mfProp'.
%
%   For example:
%
%           a=newfis('tipper');
%           a=addvar(a,'input','service',[0 10]);
%           a=addmf(a,'input',1,'poor','gaussmf',[1.5 0]);
%           a=addmf(a,'input',1,'excellent','gaussmf',[1.5 10]);
%           getfisold(a)
%           getfisold(a,'input',1)
%           getfisold(a,'input',1,'mf',2)
%
%   See also SETFIS, SHOWFIS.

%   Ned Gulley, 2-2-94
%   Copyright 1994-2002 The MathWorks, Inc. 
%   $Revision: 1.7 $  $Date: 2002/04/14 22:22:39 $

numInputs=fis(3,1);
numOutputs=fis(3,2);
numInputMFs=fis(4,1:min(numInputs,size(fis,2)));
totalInputMFs=sum(numInputMFs);
numOutputMFs=fis(5,1:min(numOutputs,size(fis,2)));
totalOutputMFs=sum(numOutputMFs);

% ===============================================
% Handle generic inquiries related to the whole fis
% ===============================================
if nargin==1,
    indent=32*ones(1,8);
    disp([indent,'Name = ',getfisold(fis,'Name')]);
    disp([indent,'Type = ',getfisold(fis,'Type')]);
    disp([indent,'NumInputs = ',num2str(numInputs)]);
    disp([indent,'InLabels = ']);
    if numInputs~=0,
        disp([32*ones(numInputs,16),getfisold(fis,'InLabels')]);
    end
    disp([indent,'NumOutputs = ',num2str(numOutputs)]);
    disp([indent,'OutLabels = ']);
    if numOutputs~=0,
        disp([32*ones(numOutputs,16),getfisold(fis,'OutLabels')]);
    end
    disp([indent,'NumRules = ',num2str(getfisold(fis,'NumRules'))]);
    disp([indent,'AndMethod = ',num2str(getfisold(fis,'AndMethod'))]);
    disp([indent,'OrMethod = ',num2str(getfisold(fis,'OrMethod'))]);
    disp([indent,'ImpMethod = ',num2str(getfisold(fis,'ImpMethod'))]);
    disp([indent,'AggMethod = ',num2str(getfisold(fis,'AggMethod'))]);
    disp([indent,'DefuzzMethod = ',num2str(getfisold(fis,'DefuzzMethod'))]);
    out=[];

% ===============================================
elseif nargin==2,
    propName=lower(arg1);

    if strcmp(propName,'name'),
        out=deblank(setstr(fis(1,:)));

    elseif strcmp(propName,'type'),
        out=deblank(setstr(fis(2,:)));

    elseif strcmp(propName,'numinputs'),
        out=numInputs;

    elseif strcmp(propName,'numoutputs'),
        out=numOutputs;

    elseif strcmp(propName,'numinputmfs'),
        out=numInputMFs;

    elseif strcmp(propName,'numoutputmfs'),
        out=numOutputMFs;

    elseif strcmp(propName,'numrules'),
        out=fis(6,1);

    elseif strcmp(propName,'andmethod'),
        out=deblank(setstr(fis(7,:)));

    elseif strcmp(propName,'ormethod'),
        out=deblank(setstr(fis(8,:)));

    elseif strcmp(propName,'impmethod'),
        out=deblank(setstr(fis(9,:)));

    elseif strcmp(propName,'aggmethod'),
        out=deblank(setstr(fis(10,:)));

    elseif strcmp(propName,'defuzzmethod'),
        out=deblank(setstr(fis(11,:)));

    elseif strcmp(propName,'inlabels'),
        firstRow=12;
        lastRow=firstRow+numInputs-1;
        out=fis(firstRow:lastRow,:);
        out=setstr(out);

    elseif strcmp(propName,'outlabels'),
        firstRow=12+numInputs;
        lastRow=firstRow+numOutputs-1;
        out=fis(firstRow:lastRow,:);
        out=setstr(out);

    elseif strcmp(propName,'inrange'),
        firstRow=12+numInputs+numOutputs;
        lastRow=firstRow+numInputs-1;
        out=fis(firstRow:lastRow,1:2);

    elseif strcmp(propName,'outrange'),
        firstRow=12+2*numInputs+numOutputs;
        lastRow=firstRow+numOutputs-1;
        out=fis(firstRow:lastRow,1:2);

    elseif strcmp(propName,'inmflabels'),
        firstRow=12+2*(numInputs+numOutputs);
        lastRow=firstRow+totalInputMFs-1;
        out=fis(firstRow:lastRow,:);
        out=setstr(out);

    elseif strcmp(propName,'outmflabels'),
        firstRow=12+2*(numInputs+numOutputs)+totalInputMFs;
        lastRow=firstRow+totalOutputMFs-1;
        out=fis(firstRow:lastRow,:);
        out=setstr(out);

    elseif strcmp(propName,'inmftypes'),
        firstRow=12+2*(numInputs+numOutputs)+totalInputMFs+totalOutputMFs;
        lastRow=firstRow+totalInputMFs-1;
        out=fis(firstRow:lastRow,:);
        out=setstr(out);

    elseif strcmp(propName,'outmftypes'),
        firstRow=12+2*(numInputs+numOutputs)+2*totalInputMFs+totalOutputMFs;
        lastRow=firstRow+totalOutputMFs-1;
        out=fis(firstRow:lastRow,:);
        out=setstr(out);

    elseif strcmp(propName,'inmfparams'),
        firstRow=12+2*(numInputs+numOutputs)+2*totalInputMFs+2*totalOutputMFs;
        lastRow=firstRow+totalInputMFs-1;
        fisType=deblank(setstr(fis(2,:)));
        lastCol=4;
        out=fis(firstRow:lastRow,1:lastCol);

    elseif strcmp(propName,'outmfparams'),
        firstRow=12+2*(numInputs+numOutputs)+3*totalInputMFs+2*totalOutputMFs;
        lastRow=firstRow+totalOutputMFs-1;
        fisType=deblank(setstr(fis(2,:)));
        if strcmp(fisType,'mamdani'),
            lastCol=4;
        else
            lastCol=numInputs+1;
        end
        out=fis(firstRow:lastRow,1:lastCol);

    elseif strcmp(propName,'rulelist'),
        numRules=abs(fis(6,1));
        if numRules==0,
            out=[];
        else
            numCols=numInputs+numOutputs+2;
            firstRow=12+2*(numInputs+numOutputs)+3*(totalInputMFs+totalOutputMFs);
            lastRow=firstRow+numRules-1;
            out=fis(firstRow:lastRow,1:numCols);
        end

    elseif strcmp(propName,'inputs'),
        indent=32*ones(1,8);
        disp([indent,'Name = ',getfisold(fis,'Name')]);
        disp([indent,'NumInputs = ',num2str(numInputs)]);
        disp([indent,'InLabels = ']);
        if numInputs~=0,
            disp([32*ones(numInputs,16),getfisold(fis,'InLabels')]);
        end
        out=[];

    elseif strcmp(propName,'outputs'),
        indent=32*ones(1,8);
        disp([indent,'Name = ',getfisold(fis,'Name')]);
        disp([indent,'NumOutputs = ',num2str(numOutputs)]);
        disp([indent,'OutLabels = ']);
        if numOutputs~=0,
            disp([32*ones(numOutputs,16),getfisold(fis,'OutLabels')]);
        end
        out=[];

    else
        error(['There is no FIS system property called ', propName]);

    end

% ===============================================
% Handle generic inquiries related to VARIABLES
% ===============================================
elseif nargin==3,
    if strcmp(arg1,'input') | strcmp(arg1,'output'),
        varType=lower(arg1);
        varIndex=arg2;

        indent=32*ones(1,8);
        numMFs=getfisold(fis,varType,varIndex,'NumMFs');
        disp([indent,'Name = ', ...
            getfisold(fis,varType,varIndex,'Name')]);
        disp([indent,'NumMFs = ',num2str(numMFs)]);
        disp([indent,'MFLabels = ']);
        if numMFs~=0,
            disp([32*ones(numMFs,16),getfisold(fis,varType,varIndex,'MFLabels')]);
        end
        range=getfisold(fis,varType,varIndex,'Range');
        disp([indent,'Range = ', ...
            '[',num2str(range(1)),' ',num2str(range(2)),']']);
        out=[];

    end

% ===============================================
% Handle specific inquiries related to VARIABLES
% ===============================================
elseif nargin==4,
    varType=lower(arg1);
    varIndex=arg2;
    varProp=lower(arg3);
    if strcmp(varType,'input'),
        if varIndex>numInputs,
            error(['There are not that many input variables.']);
        end

        if strcmp(varProp,'name'),
            varList=getfisold(fis,'inlabels');
            out=deblank(varList(varIndex,:));
        end

        if strcmp(varProp,'range'),
            varList=getfisold(fis,'inrange');
            out=varList(varIndex,:);
        end

        if strcmp(varProp,'nummfs'),
            varList=getfisold(fis,'numInputMFs');
            out=varList(varIndex);
        end

        if strcmp(varProp,'mflabels'),
            numMFs=getfisold(fis,'input',varIndex,'numMFs');
            MFList=getfisold(fis,'inMFlabels');
            MFIndexBegin=sum(numInputMFs(1:(varIndex-1)))+1;
            MFIndexEnd=MFIndexBegin+numMFs-1;
            out=MFList(MFIndexBegin:MFIndexEnd,:);
        end

    elseif strcmp(varType,'output'),
        if varIndex>numOutputs,
            error(['There are not that many output variables.']);
        end

        if strcmp(varProp,'name'),
            varList=getfisold(fis,'outlabels');
            out=deblank(varList(varIndex,:));
        end

        if strcmp(varProp,'range'),
            varList=getfisold(fis,'outrange');
            out=varList(varIndex,:);
        end

        if strcmp(varProp,'nummfs'),
            varList=getfisold(fis,'numOutputMFs');
            out=varList(varIndex);
        end

        if strcmp(varProp,'mflabels'),
            numMFs=getfisold(fis,'output',varIndex,'numMFs');
            MFList=getfisold(fis,'outMFlabels');
            MFIndexBegin=sum(numOutputMFs(1:(varIndex-1)))+1;
            MFIndexEnd=MFIndexBegin+numMFs-1;
            out=MFList(MFIndexBegin:MFIndexEnd,:);
        end

    else
        error(['Variable type must be either "input" or "output"']);

    end

    % Rip out zeros if the output is a string
    if isstr(out)&(size(out,1)==1),
        out(out==0)=[];
    end

% ===============================================
% Handle generic inquiries related to MEMBERSHIP FUNCTIONS
% ===============================================
elseif nargin==5,
    if strcmp(arg1,'input') | strcmp(arg1,'output'),
        varType=lower(arg1);
        varIndex=arg2;
        MFIndex=arg4;

        indent=32*ones(1,8);
        MFLabels=getfisold(fis,varType,varIndex,'MFLabels');
        disp([indent,'Name = ', ...
            getfisold(fis,varType,varIndex,'MF',MFIndex,'Name')]);
        disp([indent,'Type = ', ...
            getfisold(fis,varType,varIndex,'MF',MFIndex,'Type')]);
        params=getfisold(fis,varType,varIndex,'MF',MFIndex,'Params');
        disp([indent,'Params = '])
        disp(params);
%           '[',num2str(params(1)),' ',num2str(params(2)),' ', ...
%           num2str(params(3)),' ', num2str(params(4)),']']);
        out=[];

    end

% ===============================================
% Handle specific inquiries related to MEMBERSHIP FUNCTIONS
% ===============================================
elseif nargin==6,
    varType=lower(arg1);
    varIndex=arg2;
    MFIndex=arg4;
    MFProp=lower(arg5);

    if strcmp(varType,'input'),
        if varIndex>numInputs,
            error(['There are not that many input variables.']);
        end

        if MFIndex>numInputMFs(varIndex),
            errStr=['There are only ',int2str(numInputMFs(varIndex)), ...
                ' MFs associated with that variable'];
            error(errStr)
        end
        
        MFRowIndex=sum(numInputMFs(1:(varIndex-1)))+MFIndex;

        if strcmp(MFProp,'name'),
            MFList=getfisold(fis,'inMFlabels');
            out=deblank(MFList(MFRowIndex,:));
        end

        if strcmp(MFProp,'type'),
            MFTypeList=getfisold(fis,'inMFtypes');
            out=deblank(MFTypeList(MFRowIndex,:));
        end

        if strcmp(MFProp,'params'),
            MFTypeList=getfisold(fis,'inMFtypes');
            MFType=deblank(MFTypeList(MFRowIndex,:));
            MFParamsList=getfisold(fis,'inMFparams');
            if strcmp(MFType,'gaussmf') | strcmp(MFType,'sigmf') ...
                | strcmp(MFType,'smf'),
                out=MFParamsList(MFRowIndex,1:2);
            elseif strcmp(MFType,'trimf') | strcmp(MFType,'gbellmf'),
                out=MFParamsList(MFRowIndex,1:3);
            else
                out=MFParamsList(MFRowIndex,1:4);
            end
        end

    elseif strcmp(varType,'output'),
        if varIndex>numOutputs,
            error(['There are not that many output variables.']);
        end

        MFRowIndex=sum(numOutputMFs(1:(varIndex-1)))+MFIndex;

        if strcmp(MFProp,'name'),
            MFList=getfisold(fis,'outMFlabels');
            out=deblank(MFList(MFRowIndex,:));
        end

        if strcmp(MFProp,'type'),
            MFTypeList=getfisold(fis,'outMFtypes');
            out=deblank(MFTypeList(MFRowIndex,:));
        end

        if strcmp(MFProp,'params'),
            % Output MF params are complicated by the fact that they
            % look completely different for Sugeno and Mamdani systems
            MFParamsList=getfisold(fis,'outMFparams');
            out=MFParamsList(MFRowIndex,:);
            MFTypeList=getfisold(fis,'outMFtypes');
            MFType=deblank(MFTypeList(MFRowIndex,:));
            fisType=deblank(getfisold(fis,'type'));
            if strcmp(fisType,'mamdani'),
                if strcmp(MFType,'gaussmf') | strcmp(MFType,'sigmf') ...
                    | strcmp(MFType,'smf'),
                    out=MFParamsList(MFRowIndex,1:2);
                elseif strcmp(MFType,'trimf') | strcmp(MFType,'gbellmf'),
                    out=MFParamsList(MFRowIndex,1:3);
                else
                    out=MFParamsList(MFRowIndex,1:4);
                end
            elseif strcmp(fisType,'sugeno'),
                if strcmp(MFType,'constant'),
                    out=out(numInputs+1);
                elseif strcmp(MFType,'linear'),
                    out=out(1:numInputs+1);
                end
            end
        end

    end

end

% Rip out zeros if the output is a string
if (isstr(out)) & ~isempty(out),
    zeroIndex=find(sum(out)==0);
    out(:,zeroIndex)=[];
end