小男孩‘自慰网亚洲一区二区,亚洲一级在线播放毛片,亚洲中文字幕av每天更新,黄aⅴ永久免费无码,91成人午夜在线精品,色网站免费在线观看,亚洲欧洲wwwww在线观看

分享

關于使用vc++調用matlab生成的dll傳遞數(shù)組的問題

 imelee 2017-09-27

網(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

    本站是提供個人知識管理的網(wǎng)絡存儲空間,所有內容均由用戶發(fā)布,不代表本站觀點。請注意甄別內容中的聯(lián)系方式、誘導購買等信息,謹防詐騙。如發(fā)現(xiàn)有害或侵權內容,請點擊一鍵舉報。
    轉藏 分享 獻花(0

    0條評論

    發(fā)表

    請遵守用戶 評論公約

    類似文章 更多