当前位置: 首页 > news >正文

matlab模糊控制移值到c,C/C++实现模糊控制,借助MATLAB辅助设计和fis.c文件 | 学步园...

上一篇文章

typedef struct fis_node {

int handle;

int load_param;

char name[STR_LEN];

char type[STR_LEN];

char andMethod[STR_LEN];

char orMethod[STR_LEN];

char impMethod[STR_LEN];

char aggMethod[STR_LEN];

char defuzzMethod[STR_LEN];

int userDefinedAnd;

int userDefinedOr;

int userDefinedImp;

int userDefinedAgg;

int userDefinedDefuzz;

int in_n;

int out_n;

int rule_n;

int **rule_list;

DOUBLE *rule_weight;

int *and_or;/* AND-OR indicator */

DOUBLE *firing_strength;

DOUBLE *rule_output;

/* Sugeno: output for each rules */

/* Mamdani: constrained output MF values of rules */

struct io_node **input;

struct io_node **output;

DOUBLE (*andFcn)(DOUBLE, DOUBLE);

DOUBLE (*orFcn)(DOUBLE, DOUBLE);

DOUBLE (*impFcn)(DOUBLE, DOUBLE);

DOUBLE (*aggFcn)(DOUBLE, DOUBLE);

DOUBLE (*defuzzFcn)();

DOUBLE *BigOutMfMatrix;/* used for Mamdani system only */

DOUBLE *BigWeightMatrix;/* used for Mamdani system only */

DOUBLE *mfs_of_rule;/* MF values in a rule */

DOUBLE *bias; /*bias, to be tuned when no rules are fired*/

int isbias;

struct fis_node *next;

} FIS;

上述的定义中,defuzzFcn这个指针函数的定义没有参数,而后面的Defuzzification methods都是带参数的,甚至第一个参数就是FIS结构体本身,如:

static DOUBLE defuzzCentroid(FIS *fis, int m, DOUBLE *mf, int numofpoints)

所以要修改这个定义,如下:

typedef struct fis_node FIS;

typedef struct fis_node {

int handle;

int load_param;

char name[STR_LEN];

char type[STR_LEN];

char andMethod[STR_LEN];

char orMethod[STR_LEN];

char impMethod[STR_LEN];

char aggMethod[STR_LEN];

char defuzzMethod[STR_LEN];

int userDefinedAnd;

int userDefinedOr;

int userDefinedImp;

int userDefinedAgg;

int userDefinedDefuzz;

int in_n;

int out_n;

int rule_n;

int **rule_list;

DOUBLE *rule_weight;

int *and_or;/* AND-OR indicator */

DOUBLE *firing_strength;

DOUBLE *rule_output;

/* Sugeno: output for each rules */

/* Mamdani: constrained output MF values of rules */

struct io_node **input;

struct io_node **output;

DOUBLE (*andFcn)(DOUBLE, DOUBLE);

DOUBLE (*orFcn)(DOUBLE, DOUBLE);

DOUBLE (*impFcn)(DOUBLE, DOUBLE);

DOUBLE (*aggFcn)(DOUBLE, DOUBLE);

//DOUBLE (*defuzzFcn)(); hemmingway 2013/01/02

DOUBLE (*defuzzFcn)(FIS *fis, int m, DOUBLE *mf, int numofpoints);

DOUBLE *BigOutMfMatrix;/* used for Mamdani system only */

DOUBLE *BigWeightMatrix;/* used for Mamdani system only */

DOUBLE *mfs_of_rule;/* MF values in a rule */

DOUBLE *bias; /*bias, to be tuned when no rules are fired*/

int isbias;

struct fis_node *next;

} FIS;

接下来是printf和double的宏定义问题,原先针对的是控制台程序,或者Linux下控制台,如果要把模糊控制用到MFC环境,需要修改这个宏定义,方便用到MFC界面程序中,修改过后如下所示:

/* Define portable printf and double */

#if defined(MATLAB_MEX_FILE)

# define PRINTF mexPrintf

# define DOUBLE real_T

#elif defined(__SIMSTRUC__)

# define PRINTF ssPrintf

# define DOUBLE real_T

#elif defined(_MSC_VER)

#define PRINTF odprintf

#include

#include

int _cdecl odprintf(const char* fmt, ...)

{

char buf[4096], *p=buf;

va_listargs;

intret = -1;

va_start(args, fmt);

ret = vsnprintf_s(p, sizeof(buf), _TRUNCATE, fmt, args);

p +=ret;

va_end(args);

while (p>buf && isspace(*p))

{

*--p = '\0';

*p++ = '\r';

*p++ = '\n';

*p = '\0';

}

OutputDebugStringA(buf);

return(ret);

}

#else

# define PRINTF printf

# define DOUBLE double

#endif

接下来修改一下fisError这个函数,里有有个exit(1); 在MFC界面程序中不需要这个的,需要修改一下:

static void fisError(char *msg)

{

#ifdef MATLAB_MEX_FILE

mexErrMsgTxt(msg);

#else

PRINTF("%s\n",msg);

#ifndef _MSC_VER

exit(1);

#endif

#endif

}

还有一个函数封装了fopen()函数打开文件,里面有个多余的定义语句, FILE *fopen();  这个在C++中不支持,需要注释掉它:

/* an friendly interface to fopen() */

static FILE *fisOpenFile(char *file, char *mode)

{

FILE *fp /*, *fopen()*/;

if ((fp = fopen(file, mode)) == NULL){

PRINTF("The file %s cannot be opened.", file);

fisError("\n");

}

return(fp);

}

再就是fis.c文件后面的几个函数定义,使用 __STDC__ 宏支持了一种老旧的语法格式,如下所示:

/* return data matrix */

DOUBLE **

#ifdef __STDC__

returnDataMatrix(char *filename, int *row_n_p, int *col_n_p)

#else

returnDataMatrix(filename, row_n_p, col_n_p)

char *filename;

int *row_n_p;

int *col_n_p;

#endif

{

//code...

}

问题是MFC程序中 定义 __STDC__ 宏会出现错误的,而那种默认的老旧C语法格式C++中又不支持,所以所有这样定义的函数都要删掉那些多余的东西,如上面的函数改成这样:

/* return data matrix */

DOUBLE **returnDataMatrix(char *filename, int *row_n_p, int *col_n_p)

{

//code...

}

改完以后,没有错误了,用下面的语句将fis.c文件包含到一个CPP文件的时候,问题又来了,出现 fatal

error LNK1169: 找到一个或多个多重定义的符号,按照一般在网上搜索的解决方法是:在项目->属性->链接器->命令行->附加选项中加

/force这样没有错误了,但是还是有很多警告Warning Link 一大堆乱七八糟的警告,其实真正的方法是:在【解决方案资源管理器】中选中fis.c文件,单击右键的属性,打开fis.c属性页对话框,在【配置属性】->【常规】->【项类型】中,将这个配置为【C/C++

标头】,这样就没有什么问题了。

/*Start of the regular fis control*/

extern "C"{

#include "fis.c"

}

1357211536_7907.jpg

============================================

使用方法总结如下:

/*

* 这是修改过后的fis.c模糊推理系统库函数,可以移植C/C++环境使用,在VS2010的MFC环境经过测试

* 1、将fis.c文件拷贝到项目中;

* 2、修改VS2010的配置属性,项目->属性->C/C++->预处理器->预处理器定义,添加

* _CRT_SECURE_NO_WARNINGS

* 3、在【解决方案资源管理器】中选中fis.c文件,单击右键的属性

* 【配置属性】->【常规】->【项类型】,配置为【C/C++ 标头】

* 4、如果是C语言文件(*.c)使用

* #include "fis.c"

* 包含接口库文件;

* 5、如果是C++文件,使用

* extern "C"{

* #include "fis.c"

* }

* 包含库文件。

* 祝你使用愉快!

* hemmingway 2013/1/2

*/

修改过后的fis.c文件可以从这里下载:

http://download.csdn.net/detail/hemmingway/4953923

相关文章:

  • matlab 稳定系统,matlab分析系统的稳定性
  • PHP的continue语句,PHP中continue语句的应用
  • php判断区间数字,如何快速判断数字在那个区间?
  • 有限差分matlab工具箱,FDTD(时域有限差分法)算法的Matlab源程序
  • matlab实现主机通信,设置主机模型和目标模型之间的通信
  • php电脑网站,PHP网站在线人数的程序代码 -电脑资料
  • 电脑php的基本方法是什么,做文员的基本电脑操作是什么
  • php 抽象类和抽象方法,PHP中抽象类和抽象方法概念与用法实例分析
  • PHP二维数组中文排序,PHP 对二维数组排序
  • php中XML怎么创建,PHP创建XML文档
  • oracle 批量insert 锁,oracle nologging 和批量insert
  • oracle 外链接 加条件,Oracle外连接中对非连接条件使用(+)需要注意的地方
  • oracle通过trc查找死锁sql,从trc查找死锁的有关问题
  • PHP可以实现一对多,微信小程序实现一对多发消息
  • v820w安装linux系统,Linux系统基础-管理之用户、权限管理
  • [译] 怎样写一个基础的编译器
  • 【许晓笛】 EOS 智能合约案例解析(3)
  • 2019.2.20 c++ 知识梳理
  • Android框架之Volley
  • Bootstrap JS插件Alert源码分析
  • CentOS7 安装JDK
  • download使用浅析
  • EventListener原理
  • JSDuck 与 AngularJS 融合技巧
  • Koa2 之文件上传下载
  • python3 使用 asyncio 代替线程
  • Traffic-Sign Detection and Classification in the Wild 论文笔记
  • Vue 动态创建 component
  • Vue学习第二天
  • 阿里云应用高可用服务公测发布
  • 当SetTimeout遇到了字符串
  • 规范化安全开发 KOA 手脚架
  • 面试遇到的一些题
  • 如何正确配置 Ubuntu 14.04 服务器?
  • 扫描识别控件Dynamic Web TWAIN v12.2发布,改进SSL证书
  • 通过获取异步加载JS文件进度实现一个canvas环形loading图
  • 王永庆:技术创新改变教育未来
  • 文本多行溢出显示...之最后一行不到行尾的解决
  • 原创:新手布局福音!微信小程序使用flex的一些基础样式属性(一)
  • 扩展资源服务器解决oauth2 性能瓶颈
  • ​香农与信息论三大定律
  • ​业务双活的数据切换思路设计(下)
  • #NOIP 2014# day.1 T2 联合权值
  • #微信小程序(布局、渲染层基础知识)
  • (bean配置类的注解开发)学习Spring的第十三天
  • (Matlab)遗传算法优化的BP神经网络实现回归预测
  • (Pytorch框架)神经网络输出维度调试,做出我们自己的网络来!!(详细教程~)
  • (二)PySpark3:SparkSQL编程
  • (附源码)node.js知识分享网站 毕业设计 202038
  • (附源码)spring boot公选课在线选课系统 毕业设计 142011
  • (附源码)spring boot火车票售卖系统 毕业设计 211004
  • (附源码)ssm教材管理系统 毕业设计 011229
  • (三)docker:Dockerfile构建容器运行jar包
  • (转)Unity3DUnity3D在android下调试
  • (转)拼包函数及网络封包的异常处理(含代码)