精通VC與MATLAB聯合編程(十)

精通VC與MATLAB聯合編程<十>——綜合舉例二

作者:鄧科


本文使用的工具: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、關鍵代碼:

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 /r/n %f /r/n %f/r/n %f/r/n ",ET[0],ET[1],ET[2],ET[3]);
   }

}
else {MessageBox("COM組件調用失敗!","提示",MB_ICONHAND);exit(0);}//COM組件調用失敗
pclass->Release();
CoUninitialize();//結束COM
7、程序運行結果:


圖3



圖4


圖5


圖6



圖7


圖8

  本程序界面採用VC編寫,算法調用的是MATLAB神經網絡工具箱,通過打包,能在沒有安裝MATLAB的機器上安裝運行,安裝文件僅3M,雖MATLAB也有神經網絡GUI,但是不能脫離MATLAB環境,通過在VC中調用MATLAB,即能夠充分利用VC建立友好的界面,又可以利用MATLAB避免編寫複雜的算法,大大提高編程效率。本人的QQ:44760299。目前也還在學習中歡迎大家一起討論。 

發佈了23 篇原創文章 · 獲贊 4 · 訪問量 5萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章