|
網(wǎng)絡上許多vc++調用matlab
的dll的方法使用的都是單值傳遞參數(shù),但在許多情況下,我們并不能確定要傳遞的參數(shù)的大小,那么這個問題如何解決那?我想大家一定想到了使用指針和動態(tài)數(shù)組,是的,就是這樣解決。
第一步將你的matlab程序編譯生dll,這個過程有許多的參考資料,這里我就不再贅述了。
第二部貼一些實際的代碼來個大家分析一下:
我做的是一個求農業(yè)上的期望產量與趨勢產量的實際應用,從1971年開始年序為1,作為x軸,產量作為y軸,使用曲線擬合出產量的趨勢走向,雖然我的數(shù)值分析學的也很不錯,但是為了減少開發(fā)成本,我還是使用了matlab作為開發(fā)次擬合曲線的餓工具,即快又準,與農業(yè)專家使用其他工具擬合的曲線十分接近(一公頃的誤差在10公斤以下)。下面是一些具體的代碼:
yy=Fun_NX(1971,year);//獲得用戶給定年的年序,1971年開始為1
double k=3;//上包絡產量要求三次是三次擬合函數(shù)
double *x=new double[m];//聲明動態(tài)double數(shù)組x
double *y=new double[m];//聲明動態(tài)double數(shù)組y
//進行內存拷貝,這里需要注意的是,我一開始使用的是首地址賦值的方式,雖然可以完成設計任務,但是在調試
//的時候發(fā)現(xiàn)內存泄露,delete無法很好地產出x,y變量
memcpy(x,Fun_Year(1971,end_year,region),m*sizeof(double));//將獲得的上包絡年序數(shù)組頭指針賦值給x
memcpy(y,Fun_Yield(1971,end_year,region),m*sizeof(double));//將獲得的上包絡年序數(shù)組頭指針賦值給y
double result[4]={0,0,0,0};//用于記錄三次曲線擬合的四個參數(shù)
CString str;
mxArray
*b_x=mclGetUninitializedArray();//年,1971是為1每過一年加1,如1972年對應2
mxArray *b_y=mclGetUninitializedArray();//該年產量
mxArray *n=mclGetUninitializedArray();//線性擬合最高次,這里將k復制給n
mxArray
*p=mclGetUninitializedArray();//期望用p獲得擬合函數(shù)mlfQxnh(b_x,b_y,n)的返回值
mlfAssign(&b_x,mlfDoubleMatrix(1,m,x,NULL));//matlab與vc++混合編程將double類型的x數(shù)組轉化為mxArray
類型的b_x,并賦值
mlfAssign(&b_y,mlfDoubleMatrix(1,m,y,NULL));//matlab與vc++混合編程將double類型的y數(shù)組轉化為mxArray
類型的b_y,并賦值
mlfAssign(&n,mlfDoubleMatrix(1,1,&k,NULL));//matlab與vc++混合編程將double類型的k轉化為mxArray
類型的n,并賦值
//
將mlfQxnh(b_x,b_y,n)函數(shù)的返回值地址返回給指針p,此時的指針p為mxArray,我們無法在一般數(shù)據(jù)類型中使
//用,所以,還要將其賦值給一個常規(guī)的類型,我這里賦值給了double類型的指針pp
mlfAssign(&p,mlfQxnh(b_x,b_y,n));
//將mxArray類型p指針復制給指針pp
double *pp=mxGetPr(p);
//使用result獲得返回值擬合曲線的系數(shù),三次方的系數(shù)為: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返回的動態(tài)數(shù)組。
該文章轉載自網(wǎng)絡大本營:http://www./Dev/C/200782516050.Html
|