gusucode.com > 模糊控制工具箱 fuzzy logic toolbox源码程序 > fuzzy/fuzzy/discfis.m
function [XI,YI,XO,YO,R] = discfis(fis,numPts) %DISCFIS Discretize a fuzzy inference system. % [XI,YI,XO,YO,R] = DISCFIS(fis,numPts) discretizes all the membership % functions for the input and output variables of the fuzzy inference % system called fis. The columns of XI and YI are the coordinates for the % input membership functions, and the columns of XO and YO are the % coordinates for the output membership functions. There are numPts rows % in each of XI, YI, XO, and YO. % % R is an indexed rule list where each element in R is a number that refers % to the column in XI and YI, or XO and YO, depending on whether the column % in question corresponds to an input variable or an output variable. % Ned Gulley, 9-15-94 % Copyright 1994-2002 The MathWorks, Inc. % $Revision: 1.19 $ $Date: 2002/04/14 22:20:26 $ if nargin<2, numPts=181; end XI=[]; YI=[]; XO=[]; YO=[]; R=[]; for i=1:length(fis.input) numInputMFs(i)=length(fis.input(i).mf); end numOutputMFs=[]; for i=1:length(fis.output) numOutputMFs(i)=length(fis.output(i).mf); end numInputs=length(numInputMFs); numOutputs=length(numOutputMFs); % Set up the rule matrix properly for high speed indexing ruleList=getfis(fis,'ruleList'); numRules=size(ruleList,1); if numRules==0, R=[]; else inputSumAdjust = cumsum(numInputMFs); outputSumAdjust = cumsum(numOutputMFs); % The last two zeros mask the last two columns of the rule list, % the and/or column and the rule weight column sumAdjust=[0 inputSumAdjust(1:numInputs-1) ... 0 outputSumAdjust(1:numOutputs-1) 0 0]; R=abs(ruleList)+sumAdjust(ones(numRules,1),:); % Reset all terms that were originally zero or negative back to that value % We have to make sure that any zeros or negatives in the rule list % remain undisturbed despite any of the transformations we performed R=R.*sign(ruleList); end % Here we're precalculating all MF x and y values for plotting later XI=zeros(numPts,sum(numInputMFs)); YI=zeros(numPts,sum(numInputMFs)); mfTypeList=getfis(fis,'inmftypes'); mfParamsList=getfis(fis,'inmfparams'); rangeList=getfis(fis,'inrange'); for varIndex=1:numInputs, range=rangeList(varIndex,:); xPts=linspace(range(1),range(2),numPts)'; for mfIndex=1:numInputMFs(varIndex), mfIndex2=sum(numInputMFs(1:(varIndex-1)))+mfIndex; mfType=deblank(mfTypeList(mfIndex2,:)); mfParams=mfParamsList(mfIndex2,:); XI(:,mfIndex2)=xPts; YI(:,mfIndex2)=evalmf(xPts,mfParams,mfType); end end % XO and YO will look completely different for Mamdani and Sugeno systems fisType=deblank(fis.type); if strcmp(fisType,'mamdani'), % System is Mamdani style XO=zeros(numPts,sum(numOutputMFs)); YO=zeros(numPts,sum(numOutputMFs)); mfTypeList=getfis(fis,'outmftypes'); mfParamsList=getfis(fis,'outmfparams'); rangeList=getfis(fis,'outrange'); for varIndex=1:numOutputs, range=fis.output(varIndex).range; range=rangeList(varIndex,:); xPts=linspace(range(1),range(2),numPts)'; for mfIndex=1:numOutputMFs(varIndex), mfIndex2=sum(numOutputMFs(1:(varIndex-1)))+mfIndex; mfType=deblank(mfTypeList(mfIndex2,:)); mfParams=mfParamsList(mfIndex2,:); XO(:,mfIndex2)=xPts; YO(:,mfIndex2)=evalmf(xPts,mfParams,mfType); end end else % System must be Sugeno style XO=zeros(3,sum(numOutputMFs)); mfTypeList=getfis(fis,'outmftypes'); mfParamsList=getfis(fis,'outmfparams'); for i=1:length(mfTypeList) if strcmp(mfTypeList(i), 'linear') XO=mfParamsList(:,1:(numInputs+1))'; else XO=mfParamsList(:,1)'; end end end