精通VC与MATLAB联合编程——综合举例二

傲娇腐妹

傲娇腐妹

2016-01-29 12:27

精通VC与MATLAB联合编程——综合举例二,精通VC与MATLAB联合编程——综合举例二

精通VC与MATLAB联合编程<十>——综合举例二

作者:邓科

(本文来源于图老师网站,更多请访问http://m.tulaoshi.com/cyuyanjiaocheng/)


本文使用的工具:VC6.0+MATLAB6.5

  在本章中实现的是在VC中调用MATLAB神经网络工具箱,文章中用到的程序是一篇硕士论文的一部分,因此没有提供源程序,目的是通过这个例子介绍如何在VC中调用利用com组件,实现VC和MATLAB数据的交换。首先在MATLAB中完成两个神经网络函数,一个用来检验,一个用来预测。

1、检验函数:

function [w1,b1,w2,b2,ET,a2]=SJHSJY(P,T,me,eg,lr,P2,T2,S1)[Pn,meanp,stdp,Tn,meant,stdt]=prestd(P,T);   %预处理[w1,b1,w2,b2]=initff(Pn,S1,''tansig'',Tn,''purelin'');  %数据初始化df=10;   tp=[df me eg lr];[w1,b1,w2,b2,tp,tr]=trainbpx(w1,b1,''tansig''); %样本训练        P2n=trastd(P2,meanp,stdp);   ......后处理   %必须为非负
该函数的功能为BP神经网络检验误差,P,T,me,eg,lr,P2,T2,S1 为输入参数;w1,b1,w2,b2,ET,a2 为输出参数。

2、预测函数:

function [a2]=SJHSYC(P,T,P2,me,eg,lr,S1)[Pn,meanp,stdp,Tn,meant,stdt]=prestd(P,T); [w1,b1,w2,b2]=initff(Pn,S1,''tansig'',Tn,''purelin'');........参数输出
P,T,me,eg,lr,P2,T2,S1为输入参数a2为输出参数,即为所要的结果

3、在MATLAB中将该两个函数做成COM组件,具体方法可以参考浅析VC与MATLAB联合编程<三>。

4、新建基于对话框的VC工程,在VC中引入COM组件,具体方法可以参考浅析VC与MATLAB联合编程<三>,完成后可以在CLASSView中看到多了两个新类ISJHSJY和ISJHSYC,如图1所示,它们分别实现函数SJHSJY.m和SJHSYC.m的功能。


图1

仔细查看类ISJHSJY的参数,如图2所示


图2

在类ISJHSJY中 有调用函数格式说明:

 ISJHSJY __RPC_FAR * This,            /* [in] */ long nargout,            /* [out][in] */ VARIANT __RPC_FAR *w1,            /* [out][in] */ VARIANT __RPC_FAR *b1,            /* [out][in] */ VARIANT __RPC_FAR *w2,            /* [out][in] */ VARIANT __RPC_FAR *b2,            /* [out][in] */ VARIANT __RPC_FAR *ET,            /* [out][in] */ VARIANT __RPC_FAR *a2,            /* [in] */ VARIANT P,            /* [in] */ VARIANT T,            /* [in] */ VARIANT me,            /* [in] */ VARIANT eg,            /* [in] */ VARIANT lr,            /* [in] */ VARIANT P2,            /* [in] */ VARIANT T2,            /* [in] */ VARIANT S1);
  其中nargout 为输出参数的个数;w1,b1,w2,b2,ET,a2为 Variant型输出参数;P,T,me,eg,lr,P2,T2,S1为Variant型输入参数;
可以看出通过Variant型数据,可以很方便的在VC和MATLAB之间建立起数据交换,关于Variant数据类型可以查看MSDN帮助文档或VC类库手册。

5、关键代码:

(本文来源于图老师网站,更多请访问http://m.tulaoshi.com/cyuyanjiaocheng/)
SAFEARRAYBOUND rgsabound1[2];rgsabound1[0].lLbound=0;rgsabound1[1].lLbound=0;rgsabound1[0].cElements=4;    rgsabound1[1].cElements=6;VariantInit(&TTT);TTT.vt=VT_R8|VT_ARRAY;TTT.parray=SafeArrayCreate(VT_R8,2,rgsabound1);TTT.parray->pvData=HH2;
  以上代码用来在VC中将输入参数转换为Variant型,建立Variant型4×6二维数组,其中HH2为double型一维数组,TT为函数中的一个输入参数,为Variant型;程序中,输入参数和输出参数基本都为二维数组。

6、调用代码:

if(FAILED(CoInitialize(NULL)))//COM初始化{MessageBox("Error");}ISJHSJY *pclass=NULL;HRESULT hr=CoCreateInstance(CLSID_SJHSJY,NULL, CLSCTX_ALL, IID_ISJHSJY, (void **)&pclass);if(SUCCEEDED(hr)){long int u=6;HRESULT hr1=pclass->sjhsjy(u,&w1,&b1,&w2,&b2,&et,&a2,PP,TTT,me,eg,lr,P2,T2,S1);//函数调用   if(!SUCCEEDED(hr1)){MessageBox("请输入正确数据");return;}//函数调用失败   if(SUCCEEDED(hr1))   {   memcpy(W1,w1.parray->pvData,420*sizeof(double));//将Variant型结果数据转换成double型   memcpy(W2,w2.parray->pvData,240*sizeof(double));   memcpy(B1,b1.parray->pvData,60*sizeof(double));   memcpy(B2,b2.parray->pvData,4*sizeof(double));   memcpy(ET,et.parray->pvData,4*sizeof(double));   memcpy(A2,a2.parray->pvData,4*sizeof(double));      m_edit7.Format("%f rn %f rn %fr      
展开更多 50%)
分享

猜你喜欢

精通VC与MATLAB联合编程——综合举例二

C语言教程 C语言函数
精通VC与MATLAB联合编程——综合举例二

精通 VC 与 MATLAB 联合编程——综合举例一

C语言教程 C语言函数
精通 VC 与 MATLAB 联合编程——综合举例一

s8lol主宰符文怎么配

英雄联盟 网络游戏
s8lol主宰符文怎么配

精通VC与Matlab联合编程(五)

C语言教程 C语言函数
精通VC与Matlab联合编程(五)

精通VC与Matlab联合编程(六)

C语言教程 C语言函数
精通VC与Matlab联合编程(六)

lol偷钱流符文搭配推荐

英雄联盟 网络游戏
lol偷钱流符文搭配推荐

浅析VC与Matlab联合编程

C语言教程 C语言函数
浅析VC与Matlab联合编程

精通VC与MATLAB联合编程——编译器的使用

C语言教程 C语言函数
精通VC与MATLAB联合编程——编译器的使用

lolAD刺客新符文搭配推荐

英雄联盟
lolAD刺客新符文搭配推荐

《全民打怪兽》系统设置攻略

《全民打怪兽》系统设置攻略

《闪之轨迹2》料理手册与钓鱼手册全收集攻略

《闪之轨迹2》料理手册与钓鱼手册全收集攻略
下拉加载更多内容 ↓