Matlab模糊控制FIS移植(C语言)
写在前面
由于毕业设计需要将模糊控制在C++程序中实现,这个东西网上资料不多,找了一番
开发环境VS2015 C++
。
理论上来说可以直接使用fuzzy – toolbox中的fis.c
和fismain.c
但是未经修改的fis.c
在C++
程序中直接编译会报错,因此推荐使用上面的连接下载修改后的fis.c
使用fis.c
作为模糊控制的接口库,直接调用函数就可以
调用函数的范例可以参考
这里要注意一个问题
在fis.c
中定义了一个PRINTF
宏,在main()
中用于打印各种信息
但是亲测并不能打印,main()
直接改成printf
就行
关于测试数据
有几个输入变量,每行就写几个
要测试几组数据就写几行
保存成txt
放在程序目录就行
//主函数代码
#include "stdafx.h"
extern "C" {
#include "fis.c" //这里引用库文件fis.c
}
int main()
{
FIS *fis;
int i, j;
int debug = 1;
DOUBLE **dataMatrix, **fisMatrix, **outputMatrix;
char *fis_file, *data_file;
int data_row_n, data_col_n, fis_row_n, fis_col_n;
data_file = "dataMatrixFile.txt"; //测试用数据()
fis_file = "fisMatrixFile.fis"; //fis文件
/* 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);
fisFreeMatrix((void **)outputMatrix, data_row_n);
//exit(0);
getchar();
return 0;
}