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