defuzz.m

Package [view]: fuzzy.rar
Upload User: hnchenxi
Upload Date: 2008-11-02
Package Size: 1083k
Code Size: 2k
Category: AI-NN-PR
Development Platform: Matlab
  1. function out = defuzz(x, mf, type)
  2. % DEFUZZ Defuzzify membership function.
  3. %   Synopsis
  4. %   out = defuzz(x,mf,type)
  5. %   Description
  6. %   defuzz(x,mf,type) returns a defuzzified value out, of a membership function
  7. %   mf positioned at associated variable value x, using one of several
  8. %   defuzzification strategies, according to the argument, type. The variable
  9. %   type can be one of the following.
  10. %   centroid: centroid of area method.
  11. %   bisector: bisector of area method.
  12. %   mom: mean of maximum method.
  13. %   som: smallest of maximum method.
  14. %   lom: largest of maximum method.
  15. %   If type is not one of the above, it is assumed to be a user-defined
  16. %   function. x and mf are passed to this function to generate the defuzzified
  17. %   output.
  18. %   Examples
  19. %   x = -10:0.1:10;
  20. %   mf = trapmf(x,[-10 -8 -4 7]);
  21. %   xx = defuzz(x,mf,'centroid');
  22. %
  23. %   Try DEFUZZDM for more examples.
  24. %   Roger Jang, 6-28-93 ,10-5-93, 9-29-94.
  25. %   Copyright 1994-2002 The MathWorks, Inc. 
  26. %   $Revision: 1.12 $  $Date: 2002/04/02 21:25:23 $
  27. x = x(:);
  28. mf = mf(:);
  29. if length(x) ~= length(mf),
  30.     error('Sizes mismatch!');
  31. end
  32. data_n = length(x);
  33.  
  34. if strcmp(type, 'centroid'),
  35.     total_area = sum(mf);
  36.     if total_area == 0,
  37.         error('Total area is zero in centroid defuzzification!');
  38.     end
  39.     out = sum(mf.*x)/total_area;
  40.     return;
  41. elseif strcmp(type, 'bisector'),
  42.         total_area = sum(mf);
  43.     if total_area == 0,
  44.         error('Total area is zero in bisector defuzzification!');
  45.     end
  46.         tmp = 0;
  47.         for k=1:data_n,
  48.                 tmp = tmp + mf(k);
  49.                 if tmp >= total_area/2,
  50.                         break;
  51.                 end
  52.         end
  53.     out = x(k);
  54.     return;
  55. elseif strcmp(type, 'mom'),
  56.         out = mean(x(find(mf==max(mf))));
  57.     return;
  58. elseif strcmp(type, 'som'),
  59.         tmp = x(find(mf == max(mf)));
  60.         [junk, which] = min(abs(tmp));
  61.     out = tmp(which); 
  62.     return;
  63. elseif strcmp(type, 'lom'),
  64.         tmp = x(find(mf == max(mf)));
  65.         [junk, which] = max(abs(tmp));
  66.     out = tmp(which); 
  67.     return;
  68. else
  69.     % defuzzification type is unknown
  70.     % We assume it is user-defined and evaluate it here
  71.     evalStr=[type '(x, mf)'];
  72.     out = eval(evalStr);
  73.     return;
  74. end