anfismex.c

Package [view]: fuzzy.rar
Upload User: hnchenxi
Upload Date: 2008-11-02
Package Size: 1083k
Code Size: 4k
Category: AI-NN-PR
Development Platform: Matlab
  1. /* Copyright 1994-2002 The MathWorks, Inc.  */
  2. /* $Revision: 1.15 $  $Date: 2002/06/05 13:17:15 $  $Author: eyarrow $ */
  3. /* V4 --> v5
  4. mxFreeMatrix --> mxDestroyArray
  5. Matrix --> mxArray;
  6. mxCreateFull(*, *, 0) --> mxCreateDoubleMatrix(*, *, mxREAL)
  7. REAL --> mxREAL
  8. mexFunction(*, *, *, mxArray *prhs[]) --> mexFunction(*, *, *, const mxArray *prhs[])
  9. */
  10. #include "mex.h" /* This contains declaration of mxCalloc */
  11. #include "anfis.h"
  12. /* anfis.h contains declaration of calloc, thus
  13.    it shouldn't be included below the following two lines */
  14. #include "lib.c"
  15. #include "mf.c"
  16. #include "t_norm.c"
  17. #include "defuzz.c"
  18. #include "callml.c"
  19. #include "list.c"
  20. #include "list2.c"
  21. #include "evaluate.c"
  22. #include "dmf_dp.c"
  23. #include "nodefun.c"
  24. #include "datstruc.c"
  25. /*
  26. #include "debug.c"
  27. */
  28. #include "io.c"
  29. #include "kalman.c"
  30. #include "stepsize.c"
  31. #include "learning.c"
  32. /*#include "fismat.c"*/
  33. #include "matlab2c.c"
  34. #include "c2matlab.c"
  35. /* alias for input arguments */
  36. #define TRN_DATA prhs[0] /* training data */
  37. #define IN_FISMAT prhs[1] /* FIS matrix */
  38. #define TP prhs[2] /* training parameters */
  39. #define DP prhs[3] /* display parameters */
  40. #define CHK_DATA prhs[4] /* checking data */
  41. #define METHOD          prhs[5]         /* which training method */
  42. /* alias for output arguments */
  43. #define TRN_OUT_FISMAT plhs[0] /* returned FIS matrix */
  44. #define TRN_ERROR plhs[1] /* training error */
  45. #define STEP_SIZE plhs[2] /* step size */
  46. #define CHK_OUT_FISMAT plhs[3] /* returned FIS matrix */
  47. #define CHK_ERROR plhs[4] /* checking error */
  48. /* void */
  49. void mexFunction(int nlhs, mxArray *plhs[], int nrhs, const mxArray *prhs[])
  50. {
  51. FIS *fis;
  52. int i;
  53. if (nrhs != 6)
  54. mexErrMsgTxt("Needs 6 input arguments.");
  55. fis = matlab2cStr(prhs[1],MF_POINT_N);
  56. /* check if the FIS is suitable for learning */
  57. anfisCheckFisForLearning(fis);
  58. /* build ANFIS */
  59. anfisBuildAnfis(fis);
  60. anfisAssignForwardFunction(fis);
  61. fis->trn_data = matlab2c(TRN_DATA);
  62. fis->trn_data_n = mxGetM(TRN_DATA);
  63. if (nlhs == 5) {
  64. fis->chk_data = matlab2c(CHK_DATA);
  65. fis->chk_data_n = mxGetM(CHK_DATA);
  66. }
  67. /* get training parameters */
  68. fis->epoch_n = mxGetPr(TP)[0];
  69. fis->trn_error_goal = mxGetPr(TP)[1];
  70. fis->ss = mxGetPr(TP)[2];
  71. fis->ss_dec_rate = mxGetPr(TP)[3];
  72. fis->ss_inc_rate = mxGetPr(TP)[4];
  73.         
  74. /* get display parameters */
  75. fis->display_anfis_info = (int) mxGetPr(DP)[0];
  76. fis->display_error = (int) mxGetPr(DP)[1];
  77. fis->display_ss = (int) mxGetPr(DP)[2];
  78. fis->display_final_result = (int) mxGetPr(DP)[3];
  79.         fis->method = (int) mxGetPr(METHOD)[0];
  80. anfisSetVariable(fis);
  81. anfisInitialMessage(fis);
  82. anfisLearning(fis);
  83. /* if (fis->display_final_result) {
  84. printf("Minimal training RMSE = %lfn", fis->min_trn_error);
  85. if (fis->chk_data_n != 0)
  86. printf("Minimal checking RMSE = %gn", fis->min_chk_error);
  87. }*/
  88. /* create TRN_OUT_FISMAT */
  89. if (nlhs >= 1) {
  90.                TRN_OUT_FISMAT =c2matlabStr(fis, 0);
  91. }
  92. /* create TRN_ERROR */
  93. if (nlhs >= 2) {
  94. TRN_ERROR = mxCreateDoubleMatrix(fis->epoch_n, 1, mxREAL);
  95. for (i = 0; i < fis->epoch_n; i++)
  96. mxGetPr(TRN_ERROR)[i] = fis->trn_error[i];
  97. }
  98. /* create STEP_SIZE */
  99. if (nlhs >= 3) {
  100. STEP_SIZE = mxCreateDoubleMatrix(fis->epoch_n, 1, mxREAL);
  101. for (i = 0; i < fis->epoch_n; i++)
  102. mxGetPr(STEP_SIZE)[i] = fis->ss_array[i];
  103. }
  104. /* create CHK_OUT_FISMAT */
  105. if (nlhs >= 4) {
  106. if (fis->chk_data_n != 0) {
  107.                         CHK_OUT_FISMAT =c2matlabStr(fis, 1);
  108. } else
  109. CHK_OUT_FISMAT = mxCreateDoubleMatrix(0, 0, mxREAL);
  110. }
  111. /* create CHK_ERROR */
  112. if (nlhs >= 5) {
  113. if (fis->chk_data_n != 0) {
  114. CHK_ERROR = mxCreateDoubleMatrix(fis->epoch_n, 1, mxREAL);
  115. for (i = 0; i < fis->epoch_n; i++)
  116. mxGetPr(CHK_ERROR)[i] = fis->chk_error[i];
  117. } else
  118. CHK_ERROR = mxCreateDoubleMatrix(0, 0, mxREAL);
  119. }
  120. /* free memory */
  121. /* FREEMAT((void **)in_fismat,      mxGetM(IN_FISMAT));
  122. FREEMAT((void **)trn_out_fismat, mxGetM(IN_FISMAT));
  123. if (fis->chk_data_n != 0)
  124. FREEMAT((void **)chk_out_fismat, mxGetM(IN_FISMAT));   */
  125. anfisFreeAnfis(fis);
  126. fisFreeFisNode(fis);
  127. }