找回密码
 注册
Simdroid-非首页
查看: 365|回复: 9

总结:VC+中调用matlab的神经网络方法

[复制链接]
发表于 2007-9-3 15:21:18 | 显示全部楼层 |阅读模式 来自 江苏苏州
因为一个项目要在vc中使用神经网络,当时不熟悉神经网络,所以要就准备在vc中调用matlab里的神经网络函数.
可是matlabcompiler对神经网络有限制,具体见


http://www.mathworks.com/products/compiler/compiler_support.html

VC+中调用matlab中的人工神经网络可以通过3种方法来实现

1  用调用matlab引擎库函数的方法
参考:matlab版的老帖子和taohe的书

2. 因为mathwork对其限制,不能编译.所以可以用absolete里的函数,这里以trainbpx为例,虽然算法过时,但是容易看懂.在编译时没有限制性.唯一的问题是有feval调用了purelin;deltalin;logsig;deltalog;tansig;deltatan;比如出现了error: Reference to unknow function 'purelin' from FEVAL in stand-alone mode可以用if switch将那几句其替换,对比一下运行的结果,最早就用的这种方法。但在最近的整理代码时发现有人有更聪明的做法.思路是可以提前调用使编译器编译那个函数。编译产生dll或是com组件调用的做法参考matlab的帖子或taohe的书。要注意二维数组变为variant时和调用时的行和列不要搞错.

比如下面的代码可以通过编译

A=[1,1];
purelin(A);
deltalin(A);
logsig(A);
deltalog(A);
tansig(A);
deltatan(A);%提前先把可能的函数调用一下让编译器识别
P = [0 1 2 3 4 5 6 7 8 9 10]';
T = [0 1 2 3 4 3 2 1 2 3 4]';
P=premnmx(P);
T=premnmx(T);
[R,Q] = size(P);
S1 = 12;
S2 = 12;
[S3,Q] = size(T);
W1 = rands(S1,R);B1 = rands(S1,1);
W2 = rands(S2,S1);B2 = rands(S2,1);
W3 = rands(S3,S2);B3 = rands(S3,1); %初始化
disp_freq = 20;max_epoch = 3000;err_goal = 0.1;lr = 0.01;
lr_inc = 1.05;lr_dec = 0.7;momentum = 0.95;err_ratio = 1.04;
TP = [disp_freq max_epoch err_goal lr lr_inc lr_dec momentum err_ratio];
[W1,B1,W2,B2,W3,B3] = trainbpx(W1,B1,'purelin',W2,B2,'logsig',W3,B3,'tansig',P,T,TP);
%Y=simuff(X1,W1,B1,'purelin'',W2,B2,'logsig',W3,B3,'tansig');

3. 通过rtw使用训练好的网络,在vc中使用产生的代码,在matlab版中搜索rtw有一个在vc中使用rtw产生代码的英文和中文教程,还谢谢stream大哥把代码发到我邮箱里。


以上三种做法都调试成功,

第一种不能脱离matlab.

第二种我一共花了两个月的课余时间调试成功(刚接触混编),感谢taohe.
另外不推荐这种方法,并不实用.真要在c中使用神经网络就用c编好了,也有现成的程序.当时想偷懒不想了解神经网络算法,结果花了更多时间。

第三种最简便(刚调试成功,比第二种要简单的多)。只能在外部训练网络就是唯一的缺点了.

[ 本帖最后由 hero1_1985 于 2007-10-18 11:11 编辑 ]

评分

1

查看全部评分

发表于 2007-9-3 19:22:10 | 显示全部楼层 来自 江苏南京
Simdroid开发平台
好强啊!牛

评分

1

查看全部评分

回复 不支持

使用道具 举报

发表于 2007-9-3 22:50:28 | 显示全部楼层 来自 新加坡
原帖由 hero1_1985 于 2007-9-3 15:21 发表 ...
第二种我一共花了两个月的课余时间调试成功(刚接触混编)
...


看来楼主很有耐心,这种脚踏实地的钻研精神值得我们学习。

另外,记得matlab的compiler对神经网络的支持只限于于使用训练好的网络,也就是说,运用上面说的第二种方法,也应该只能在外部训练好网络。请问是不是这样?
回复 不支持

使用道具 举报

 楼主| 发表于 2007-9-3 23:00:51 | 显示全部楼层 来自 江苏苏州

回复 #3 taohe 的帖子

谢谢taohe大哥的鼓励
第二种是自己修改了m文件,训练网络和使用网络都可以.
回复 不支持

使用道具 举报

发表于 2007-9-5 14:01:44 | 显示全部楼层 来自 北京
不错,学习

评分

1

查看全部评分

回复 不支持

使用道具 举报

发表于 2007-9-5 14:05:44 | 显示全部楼层 来自 北京
有具体的例子吗
回复 不支持

使用道具 举报

发表于 2007-9-6 22:37:24 | 显示全部楼层 来自 四川绵阳
希望lz能贴出具体的例子,或者说是关键代码,也让我们也乘乘凉
回复 不支持

使用道具 举报

发表于 2007-9-13 15:23:31 | 显示全部楼层 来自 江苏南京
请问也可以用引擎的方法调用模糊工具箱吗?
回复 不支持

使用道具 举报

发表于 2007-10-18 10:31:46 | 显示全部楼层 来自 天津

回复 #8 zhanrixin1983 的帖子

请问使用COM组件可以编译神经网络函数文件吗?
回复 不支持

使用道具 举报

发表于 2011-9-19 14:50:51 | 显示全部楼层 来自 四川成都
你好,我想用nntool来求解一个矛盾方程组,该如何实现呢??目标函数如何输入呢??谢谢
回复 不支持

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

Simapps系列直播

Archiver|小黑屋|联系我们|仿真互动网 ( 京ICP备15048925号-7 )

GMT+8, 2024-10-6 08:16 , Processed in 0.060342 second(s), 20 queries , Gzip On, MemCache On.

Powered by Discuz! X3.5 Licensed

© 2001-2024 Discuz! Team.

快速回复 返回顶部 返回列表