evalfismex.c

Package [view]: fuzzy.rar
Upload User: hnchenxi
Upload Date: 2008-11-02
Package Size: 1083k
Code Size: 6k
Category: AI-NN-PR
Development Platform: Matlab
  1. /* Copyright 1994-2002 The MathWorks, Inc.  */
  2. /* $Revision: 1.12 $ */
  3. #include "mex.h" 
  4. #include "fis.h"
  5. #if (defined(MATLAB_MEX_FILE) && !defined(__SIMSTRUC__))
  6. # define FREE mxFree
  7. #else
  8. # define FREE free
  9. #endif
  10. #include "lib.c"
  11. #include "mf.c"
  12. #include "t_norm.c"
  13. #include "defuzz.c"
  14. #include "callml.c"
  15. #include "list.c"
  16. #include "list2.c"
  17. #include "evaluate.c"
  18. #include "matlab2c.c"
  19. #define INPUT prhs[0] /* input of FIS */
  20. #define FISMATRIX prhs[1] /* FIS matrix */
  21. #define NUMOFPOINT      prhs[2]         /* number of points */
  22. #define OUTPUT plhs[0] /* output */
  23. #define IRR plhs[1] /* input mf matrix */
  24. #define ORR plhs[2] /* output mf matrix */
  25. #define ARR plhs[3] /* aggregated output mf */
  26. /* void */
  27. void mexFunction(int nlhs, mxArray *plhs[], int nrhs, const mxArray *prhs[])
  28. {
  29. DOUBLE *input, *output, *irr, *orr, *arr;
  30. int i, j, m, n, data_n, in_n, numofpoints;
  31. FIS *fis;
  32.     DOUBLE *numofpointPt;
  33. int which_rule, which_output, which_mf;
  34. DOUBLE tmp, tmp_vec[2], mf_value;
  35. if (nrhs != 3)
  36. mexErrMsgTxt("Needs 3 input arguments.");
  37.     if (!mxIsDouble(INPUT))
  38. mexErrMsgTxt("The first input must be a defined DOUBLE matrix");
  39.     if (!mxIsStruct(FISMATRIX))
  40. mexErrMsgTxt("The Second input must be a structure.");
  41. /* Check the dimensions of input vector */
  42. /* This is permissive - granted as long as enough inputs
  43.    are there. So the user can pass the original training data
  44.    directly */
  45.     m=mxGetM(NUMOFPOINT);
  46.     numofpointPt=mxGetPr(NUMOFPOINT);
  47.     if (m > 0 && numofpointPt[0] > 101)  numofpoints=(int)numofpointPt[0];
  48.     else  numofpoints=101;
  49. m = mxGetM(INPUT);
  50. n = mxGetN(INPUT);
  51. /*=====================*/
  52.     fis=matlab2cStr(prhs[1], numofpoints);
  53. /*=====================*/
  54. if (!((n >= fis->in_n) || ((n == 1) && (m >= fis->in_n)))) {
  55. mexPrintf("The input vector is of size %dx%d,", m, n);
  56. mexPrintf("while expected input vector size is %d.n", fis->in_n);
  57. mexErrMsgTxt("Exiting ...");
  58. }
  59. if ((n == 1) && (m == fis->in_n))
  60. data_n = 1;
  61. else
  62. data_n = m;
  63. /* signal error if multiple input vectors and mutiple output arguments */
  64. /*
  65. if ((data_n > 1) && (nlhs > 1))
  66. mexErrMsgTxt("Multiple output arguments can only be used with a single input vector.");
  67. */
  68. /* Create matrices for returned arguments */
  69. OUTPUT = mxCreateDoubleMatrix(data_n, fis->out_n, mxREAL);
  70. for (i = 0; i < data_n; i++) {
  71.     /* Assign pointers to the various parameters */
  72. output = mxGetPr(OUTPUT);
  73. input = mxGetPr(INPUT);
  74. /* Dispatch the inputs */
  75. for (j = 0; j < fis->in_n; j++)
  76. fis->input[j]->value = input[j*data_n+i];
  77. /* Compute the output */
  78. fisEvaluate(fis, numofpoints);
  79. /* Collect the output */
  80. for (j = 0; j < fis->out_n; j++)
  81. output[j*data_n+i] = fis->output[j]->value;
  82. }
  83. /* take care of additonal output arguments */
  84. if (nlhs >= 2) {
  85. IRR = mxCreateDoubleMatrix(fis->rule_n, fis->in_n, mxREAL);
  86. irr = mxGetPr(IRR);
  87. for (i = 0; i < fis->rule_n; i++)
  88. for (j = 0; j < fis->in_n; j++) {
  89. which_mf = fis->rule_list[i][j];
  90. if (which_mf > 0)
  91. mf_value = fis->input[j]->mf[which_mf-1]->value;
  92. else if (which_mf == 0) {
  93. /* Don't care; mf_value depends on AND or OR */
  94. if (fis->and_or[i] == 1) /* AND */
  95. mf_value = 1;
  96. else
  97. mf_value = 0;
  98. }
  99. else            /* Linguistic hedge NOT */
  100. mf_value = 1 - fis->input[j]->mf[-which_mf-1]->value;
  101. irr[j*fis->rule_n+i] = mf_value;
  102. }
  103. }
  104. if (nlhs >= 3) {
  105. if (strcmp(fis->type, "mamdani") == 0) {
  106. ORR = mxCreateDoubleMatrix(numofpoints, (fis->rule_n)*(fis->out_n), mxREAL);
  107. orr = mxGetPr(ORR);
  108. for (i = 0; i < numofpoints; i++)
  109. for (j = 0; j < (fis->rule_n)*(fis->out_n); j++) {
  110. which_rule = j%(fis->rule_n); /* zero offset */
  111. which_output = j/(fis->rule_n); /* zero offset */
  112. which_mf = fis->rule_list[which_rule][fis->in_n+which_output];
  113. if (which_mf > 0)
  114. tmp = fis->output[which_output]->mf[which_mf-1]->value_array[i];
  115. else if (which_mf == 0)
  116. tmp = 0;
  117. else
  118. tmp = 1-fis->output[which_output]->mf[-which_mf-1]->value_array[i];
  119. /*
  120. mexPrintf("rule = %d, output = %d, mf = %dn", which_rule,
  121. which_output, which_mf);
  122. */
  123. if (!fis->userDefinedImp) 
  124. orr[j*numofpoints+i] = (*fis->impFcn)(tmp,
  125. fis->firing_strength[which_rule]);
  126. else {
  127. tmp_vec[0] = tmp;
  128. tmp_vec[1] = fis->firing_strength[which_rule];
  129. orr[j*numofpoints+i] = 
  130. fisCallMatlabFcn(tmp_vec, 2, fis->impMethod);
  131.          }
  132. }
  133. }
  134. if (strcmp(fis->type, "sugeno") == 0) {
  135. ORR = mxCreateDoubleMatrix(fis->rule_n, fis->out_n, mxREAL);
  136. orr = mxGetPr(ORR);
  137. for (i = 0; i < fis->rule_n; i++)
  138. for (j = 0; j < fis->out_n; j++) {
  139. which_mf = fis->rule_list[i][fis->in_n+j]-1;
  140. /*
  141. mexPrintf("mf = %dn", which_mf);
  142. */
  143. if (which_mf == -1) /* don't_care consequent */
  144. orr[j*fis->rule_n+i] = 0;
  145. else
  146. orr[j*fis->rule_n+i] = fis->output[j]->mf[which_mf]->value;
  147. }
  148. }
  149. }
  150. if (nlhs >= 4) {
  151. if (strcmp(fis->type, "mamdani") == 0) {
  152. ARR = mxCreateDoubleMatrix(numofpoints, fis->out_n, mxREAL);
  153. arr = mxGetPr(ARR);
  154. for (i = 0; i < numofpoints; i++)
  155. for (j = 0; j < fis->out_n; j++)
  156. arr[j*numofpoints+i] = fisFinalOutputMf(fis, j, i);
  157. }
  158. if (strcmp(fis->type, "sugeno") == 0) {
  159. ARR = mxCreateDoubleMatrix(fis->rule_n, fis->out_n, mxREAL);
  160. arr = mxGetPr(ARR);
  161. for (i = 0; i < fis->rule_n; i++)
  162. for (j = 0; j < fis->out_n; j++)
  163. arr[j*fis->rule_n+i] = fis->firing_strength[i];
  164. }
  165. }
  166. /* destroy FIS data structure */
  167. fisFreeFisNode(fis);
  168. }