Matlab拥有很多好用的Toolbox,如遗传算法,模糊逻辑控制(Fuzzy Logic Control,FLC),神经网络等等,一般都是大神写的,然后提交给Matlab公司,接着审核之后加入到新的版本中,大致的看了下Toolbox文件夹下面的各个库代码,大部分是用matlab语言写的,但是有些是采用C语言写的(貌似 Matlab程序本身就是采用C/C++写的,所以m语言和C语言之间可以很好的调用来调用去的。)
虽然说FLC不是太复杂,自己写一个也不会太难,但是当我看了matlab下面的FLC库文件的C语言实现,我觉得还是算了,因为他(就是ANFIS的发明者——
Jyh-Shing Roger Jang(張智星),Zadeh的学生)在对模糊的理解之上写的相当的完备。
Step 1. 进入Toolbox文件夹,找到如下两个C文件
Step 2. “fis.c”文件时FLC实现部分,一般不用动它。现在来看看“fismain.c”部分,它调用前者的API。
原版的fismain.c
1
2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 |
|
/* * Stand-alone codes for fuzzy inference systems. * J.-S. Roger Jang, 1994. * Copyright 1994-2002 The MathWorks, Inc. * $Revision: 1.12 $ $Date: 2002/06/17 12:47:24 $ */ /* This part is for MACs only */ #if defined(applec) || defined(__MWERKS__) || defined (THINK_C) || defined(powerc) #include <stdio.h> #include <stdarg.h> FILE *output_file; #define PRINTF macprintf int macprintf( char* format, ...) { va_list arg; int ret; va_start(arg, format); ret = vfprintf(output_file, format, arg); va_end(arg); return(ret); } #endif /* applec || __MWERKS__ || THINK_C || powerc */ /* Start of the regular fismain.c */ /* 这里要改,当然include还是展开,但是我们把它放在vs2008里面,方便管理,还是用.h头文件吧。 */ #include "fis.c" /*********************************************************************** Main routine **********************************************************************/ int main( int argc, char **argv) { FIS *fis; int i, j; int debug = 0; DOUBLE **dataMatrix, **fisMatrix, **outputMatrix; char *fis_file, *data_file; int data_row_n, data_col_n, fis_row_n, fis_col_n; /* 这里也要改,读取我们的配置文件——FLC有很多需要选择的参数以及方法 */ #if defined(applec) || defined(__MWERKS__) || defined (THINK_C) || defined(powerc) /* For MACs only */ data_file = "fismain.in"; fis_file = "fismain.fis"; output_file = fisOpenFile( "fismain.out", "w"); #else /* input arguments checking */ if (argc != 3) { PRINTF( "Usage: %s data_file fis_file\n", argv[ 0]); exit( 1); } data_file = argv[ 1]; fis_file = argv[ 2]; #endif /* applec || __MWERKS__ || THINK_C || powerc */ /* obtain data matrix and FIS matrix */ dataMatrix = returnDataMatrix(data_file, &data_row_n, &data_col_n); fisMatrix = returnFismatrix(fis_file, &fis_row_n, &fis_col_n); /* build FIS data structure */ fis = (FIS *)fisCalloc( 1, sizeof(FIS)); fisBuildFisNode(fis, fisMatrix, fis_col_n, MF_POINT_N); /* error checking */ if (data_col_n < fis->in_n) { PRINTF( "Given FIS is a %d-input %d-output system.\n", fis->in_n, fis->out_n); PRINTF( "Given data file does not have enough input entries.\n"); fisFreeMatrix(( void **)dataMatrix, data_row_n); fisFreeMatrix(( void **)fisMatrix, fis_row_n); fisFreeFisNode(fis); fisError( "Exiting ..."); } /* debugging */ if (debug) fisPrintData(fis); /* create output matrix */ outputMatrix = (DOUBLE **)fisCreateMatrix(data_row_n, fis->out_n, sizeof(DOUBLE)); /* evaluate FIS on each input vector */ for (i = 0; i < data_row_n; i++) getFisOutput(dataMatrix[i], fis, outputMatrix[i]); /* print output vector */ for (i = 0; i < data_row_n; i++) { for (j = 0; j < fis->out_n; j++) PRINTF( "%.12f ", outputMatrix[i][j]); PRINTF( "\n"); } /* clean up memory */ fisFreeFisNode(fis); fisFreeMatrix(( void **)dataMatrix, data_row_n); fisFreeMatrix(( void **)fisMatrix, fis_row_n); fisFreeMat |