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

來源:互聯網
上載者:User

       網路上許多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返回的動態數組。

 

    

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.