C++ Builder 與 MATLAB 混合編程 |
尚未結案
|
s2323528
一般會員 發表:5 回覆:3 積分:1 註冊:2004-07-07 發送簡訊給我 |
|
zilch
中階會員 發表:5 回覆:87 積分:78 註冊:2002-09-24 發送簡訊給我 |
在對岸看到的..希望有幫助
------------------
Borland C++Builder是一种新?的可?化?程?言。在工程?用中,我?一般用C++Builder?言???用程序,??交互界面、?据采集和端口操作等,但C++Builder在?值?理分析和算法工具等方面,其效率??低于Matlab?言。在准确方便地?制?据?形方面,Matlab?言更具有?可比?的优?。此外,Matlab?提供功能?大的工具箱。但Matlab的缺?是不能??端口操作和??控制。因此,若能??者?合?用,??优?互?,??得极大的效益。
本文?合??介?了?用Borland C++Builder3.0??的Windos?用程序中,?Matlab的?用方法。
一、C++Builder?用Matlab的??方案
1. ??思路
在高版本的Matlab中(如Matlab V4.2)提供了DDE接口,用?可以通?Windows的DDE通信基制??外部?用。?种??方式比???,但?增大主程序代?,影??行速度。
在Windows系?中,DLL是一种很特?的可?行文件,可以被多?Windows?用程序同???,具有固定的共享?据段。??据段的?据在DLL被Windows下?前?一直保留在?存中,因此可以通?DLL??用?程序与Matlab之?的?据??和函??用。
具体地?,就是利用Matlab的32位???接?(DLL),生成相?的可以被C++Builder?用的DLL,用?提供二者之?的基本支??境。只需在用?程序中加??DLL,即可??其?据段的共享。然后在用?程序中操作DLL?据段的?据,并通?某种方式在用?程序中使Matlab?行?DLL,就可??用?程序?Matlab的?用。其形式可以是混合?程或函??用,非常方便而高效。
2. ??方式
Matlab提供了可外部?接的DLL文件,通??其???相?的Lib文件,并加以必要的?置,就可以在C++Builder中直接?行Matlab函??用,??C++ Builder?言与Matlab?言的混合?程。
(1) ?行?境要求
由于Matlab提供的是32位的DLL。其?行?境要求是Matlab V4.2或更高版本。C++Builder可以?行32位?程,?里我?采用的是V3.0版本。
(2) C++Builder下LIB文件的生成
Matlab提供的Def文件允?用?通?Implib命令生成相?的Lib文件。其命令格式?
Implib ???.lib ???.def
在
|
s2323528
一般會員 發表:5 回覆:3 積分:1 註冊:2004-07-07 發送簡訊給我 |
|
senlin
一般會員 發表:0 回覆:2 積分:0 註冊:2004-10-27 發送簡訊給我 |
如上的語法可改一行即可
Engine *eng;
char buffer[200];
int array[6]={1,2,3,4,5,6};
mxArray *S=NULL,*T=NULL;
eng = engOpen(NULL);//--------------------這一行 將engOpen指定給eng
S=mxCreateDoubleMatrix(1,6,mxREAL);
mxSetName(S,"S");
memcpy((char*)mxGetPr(S),(char*)array,6*sizeof(int));
engPutArray(eng,S);
engEvalString(eng,"T=S/S.^2;");
engEvalString(eng,"plot(S,T);");
engOutputBuffer(eng,buffer,200);
T=engGetArray(eng,"T"); Form1->Memo1->Lines->Add(T);
engClose(eng);
mxDestroyArray(S);
mxDestroyArray(T); 若相關的資訊可以在r12以上版本的
|
cowbjt
一般會員 發表:11 回覆:30 積分:8 註冊:2004-07-16 發送簡訊給我 |
請問一下 在T=engGetArray(eng,"T");
是把matlab裡算好的T回傳回來
但這個的T是 mxArray 這種型態的
要怎麼把這種型態轉成,c++ 裡面的陣列型態呢?? 謝謝 我試過
int array[4][4]; engEvalString(eng, "T=rand(4,4);"); T = engGetArray(eng, "V"); memcpy((char *) array, (char*) mxGetPr(T), 16*sizeof(int));結果印出來的值很怪很大,而且都執行很次內容都一樣(我的V是用rand 得到的應該會不一樣而且在0~1阿) 發表人 - cowbjt 於 2005/05/21 00:15:30 |
peterfrog
一般會員 發表:0 回覆:2 積分:0 註冊:2005-03-25 發送簡訊給我 |
|
conundrum
尊榮會員 發表:893 回覆:1272 積分:643 註冊:2004-01-06 發送簡訊給我 |
|
dragonhippopdc
一般會員 發表:45 回覆:51 積分:19 註冊:2005-01-15 發送簡訊給我 |
各位大大~我看了板上的教學但是一直被沒辦法連結matlab~上面教說
Matlab提供的Def文件允許用戶通過Implib命令生成相應的Lib文件。其命令格式爲:
---- Implib ???.lib ???.def
但是一直無法編出.kib檔~我用的是matlab6.5跟bcb5.0~然後我發現matlab的lib資料夾中好像本來就已經有_libeng.lib,_libmat.lib和_libmx.lib這三個~我整個弄好後~都會跟我說
[C Error] Unit1.cpp(11): E2451 Undefined symbol 'Engine'
請問為什麼呢~各位大大
|
本站聲明 |
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。 2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。 3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇! |