關於使用vc++調用matlab生成的dll傳遞數組的問題

 網絡上許多vc++調用matlab 的dll的方法使用的都是單值傳遞參數,但在許多情況下,我們並不能確定要傳遞的參數的大小,那麼這個問題如何解決那?我想大家一定想到了使用指針和動態數組,是的,就是這樣解決。
   第一步將你的matlab程序編譯生dll,這個過程有許多的參考資料,這裏我就不再贅述了。

   第二部貼一些實際的代碼來個大家分析一下:

     我做的是一個求農業上的期望產量與趨勢產量的實際應用,從1971年開始年序爲1,作爲x軸,產量作爲y軸,使用曲線擬合出產量的趨勢走向,雖然我的數值分析學的也很不錯,但是爲了減少開發成本,我還是使用了matlab作爲開發次擬合曲線的餓工具,即快又準,與農業專家使用其他工具擬合的曲線十分接近(一公頃的誤差在10公斤以下)。下面是一些具體的代碼:

    yy=Fun_NX(1971,year);//獲得用戶給定年的年序,1971年開始爲1
    double k=3;//上包絡產量要求三次是三次擬合函數
   double *x=new double[m];//聲明動態double數組x
 double *y=new double[m];//聲明動態double數組y
 //進行內存拷貝,這裏需要注意的是,我一開始使用的是首地址賦值的方式,雖然可以完成設計任務,但是在調試 //的時候發現內存泄露,delete無法很好地產出x,y變量
    memcpy(x,Fun_Year(1971,end_year,region),m*sizeof(double));//將獲得的上包絡年序數組頭指針賦值給x
    memcpy(y,Fun_Yield(1971,end_year,region),m*sizeof(double));//將獲得的上包絡年序數組頭指針賦值給y

  
 double result[4]={0,0,0,0};//用於記錄三次曲線擬合的四個參數
 CString str;
 
 mxArray *b_x=mclGetUninitializedArray();//年,1971是爲1每過一年加1,如1972年對應2
 mxArray *b_y=mclGetUninitializedArray();//該年產量
 mxArray *n=mclGetUninitializedArray();//線性擬合最高次,這裏將k複製給n
 mxArray *p=mclGetUninitializedArray();//期望用p獲得擬合函數mlfQxnh(b_x,b_y,n)的返回值
 
 mlfAssign(&b_x,mlfDoubleMatrix(1,m,x,NULL));//matlab與vc++混合編程將double類型的x數組轉化爲mxArray 類型的b_x,並賦值
 mlfAssign(&b_y,mlfDoubleMatrix(1,m,y,NULL));//matlab與vc++混合編程將double類型的y數組轉化爲mxArray 類型的b_y,並賦值
 mlfAssign(&n,mlfDoubleMatrix(1,1,&k,NULL));//matlab與vc++混合編程將double類型的k轉化爲mxArray 類型的n,並賦值

 //  將mlfQxnh(b_x,b_y,n)函數的返回值地址返回給指針p,此時的指針p爲mxArray,我們無法在一般數據類型中使 //用,所以,還要將其賦值給一個常規的類型,我這裏賦值給了double類型的指針pp
    mlfAssign(&p,mlfQxnh(b_x,b_y,n));

 //將mxArray類型p指針複製給指針pp
 double *pp=mxGetPr(p);
 

 //使用result獲得返回值擬合曲線的係數,三次方的係數爲:result[0],依次類推
    k=(int) k;//將k強制轉換爲整形
 for(i=0;i<=k;i++)
 result[i]=pp[i];//使用result[]記錄pp[]的值

 //釋放變量b_x,b_y,n,p,y,x
 mxDestroyArray(b_x);
 mxDestroyArray(b_y);
 mxDestroyArray(n);
 mxDestroyArray(p);
 delete y;
 delete x;

 //返回最終預測產量
 for(i=0;i<=k;i++)
  sum=sum+result[i]*pow(yy,k-i);
 return sum;

這樣,就調用了一個dll返回的動態數組。

該文章轉載自網絡大本營:http://www.xrss.cn/Dev/C/200782516050.Html

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章