- 积分
- 5
- 注册时间
- 2007-2-23
- 仿真币
-
- 最后登录
- 1970-1-1
|
因为一个项目要在vc中使用神经网络,而当时不熟悉神经网络,所以要就准备在vc中调用matlab里的神经网络函数.
可是matlab的compiler对神经网络有限制,具体见
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
查看全部评分
-
|