移植Matlab的底层模糊逻辑控制库(C语言)

        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( 1sizeof(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
  • 14
    点赞
  • 44
    收藏
    觉得还不错? 一键收藏
  • 30
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 30
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值