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

    function [outParams,errorStr]=strtchmf(inParams,inRange,outRange,inType)
%STRTCHMF Stretch membership functions.
%   outParams=STRTCHMF(inParams,inRange,outRange,inType) takes the 
%   original membership function parameters and range and returns 
%   parameters appropriate to the new membership function range. 
%
%   For example:
%
%           ri = [0 10]; ro = [-5 30];
%           xi = linspace(ri(1),ri(2));
%           xo = linspace(ro(1),ro(2));
%           pi = [0 5 8];
%           po = strtchmf(pi,ri,ro,'trimf');
%           yi = trimf(xi,pi);
%           yo = trimf(xo,po);
%           subplot(2,1,1), plot(xi,yi,'y');
%           subplot(2,1,2), plot(xo,yo,'c');
%           title('MF Stretching')
%
%   See also DSIGMF, GAUSSMF, GAUSS2MF, GBELLMF, EVALMF, PIMF, PSIGMF,
%   SIGMF, SMF, TRAPMF, TRIMF, ZMF.

%   Ned Gulley, 10-17-94
%   Copyright 1994-2002 The MathWorks, Inc. 
%   $Revision: 1.13 $  $Date: 2002/04/14 22:21:05 $
outParams=[];
errorStr=[];

diffInRange=diff(inRange);
diffOutRange=diff(outRange);
outParams=inParams;

if strcmp(inType,'trimf') | strcmp(inType,'trapmf') | strcmp(inType,'pimf') | ...
    strcmp(inType,'smf') | strcmp(inType,'smf'),
    outParams=(inParams-inRange(1))/diffInRange*diffOutRange+outRange(1);

elseif strcmp(inType,'gbellmf'),
    outParams(1)=inParams(1)/diffInRange*diffOutRange;
    outParams(2)=inParams(2);
    outParams(3)=(inParams(3)-inRange(1))/diffInRange*diffOutRange+outRange(1);

elseif strcmp(inType,'gaussmf'),
    outParams(1)=inParams(1)/diffInRange*diffOutRange;
    outParams(2)=(inParams(2)-inRange(1))/diffInRange*diffOutRange+outRange(1);

elseif strcmp(inType,'gauss2mf'),
    outParams([1 3])=inParams([1 3])/diffInRange*diffOutRange;
    outParams([2 4])=(inParams([2 4])-inRange(1))/diffInRange*diffOutRange+outRange(1);

elseif strcmp(inType,'sigmf'),
    outParams(1)=inParams(1)*diffInRange/diffOutRange;
    outParams(2)=(inParams(2)-inRange(1))/diffInRange*diffOutRange+outRange(1);

elseif strcmp(inType,'dsigmf') | strcmp(inType,'psigmf'),
    outParams([1 3])=inParams([1 3])*diffInRange/diffOutRange;
    outParams([2 4])=(inParams([2 4])-inRange(1))/diffInRange*diffOutRange+outRange(1);

else
    % Output MF type is unknown
    outParams=[];
    errorStr=['Cannot stretch MF type ' inType];
    if nargout<2, error(errorStr); end
    return
end

outParams=eval(mat2str(outParams,4));