線上訂房服務-台灣趴趴狗聯合訂房中心
發文 回覆 瀏覽次數:2346
推到 Plurk!
推到 Facebook!

C++ Builder 與 MATLAB 混合編程

尚未結案
s2323528
一般會員


發表:5
回覆:3
積分:1
註冊:2004-07-07

發送簡訊給我
#1 引用回覆 回覆 發表時間:2004-10-12 12:42:18 IP:211.75.xxx.xxx 未訂閱
請問有誰知道如何在BCB中使用MATLAB函式的方法嗎? 例如在BCB中使用MATLAB中的FFT的函式!
zilch
中階會員


發表:5
回覆:87
積分:78
註冊:2002-09-24

發送簡訊給我
#2 引用回覆 回覆 發表時間:2004-10-12 13:02:35 IP:218.166.xxx.xxx 未訂閱
在對岸看到的..希望有幫助 ------------------ 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  在\extern\include目?下,提供了如下三?.Def文件: _libeng.def,_libmat.def,_libmx.def 通?上述命令可以生成相?的三?Lib文件。?些Lib文?中包含了可外部?用的Matlab函?的必要信息。 二、???算和?? ?清楚起?,通?一???的CBuilder例程?行?明。??例通??用Matlab??矩??算并?制?形,?演示C Builder?Matlab的?用。 在C Builder???境中,建立一?新的窗体MyForm,并放置一?按?Demo。?工程文件命名?Try.prj,其主函??try.cpp。在主函?中,我??使用一???Matlab?用的子函?DemoMatlab,作?按?Demo的??事件。其源代?如下: #include #pragma hdrstop #include "Unit1.h" #pragma package(smart_init) #pragma resource "*.dfm" TMyForm *MyForm; __fastcall TMyForm::TMyForm(TComponent* Owner) : TForm(Owner) { } void __fastcall TMyForm::DemoClick(TObject *Sender) { DemoMatlab(); //演示Matlab?言?用 } ?了?用Matlab中的函?,必??行必要的?置,?包含?些函?的文件加入工程文件Try.prj。以下是操作?程: 1. 在?文件中加入Engine.h。其包含了??Matlab?用和??的函??明。 2. 打?Project|Option...??框,??Directories/Conditionals。 ● 在Include Path中,加入目?路?\extern\include,?路?包含了engine.h和matlab.h等有用的?文件。 ● 在Library Path中,加入\bin和\extern\include。???目?路?包含了可外部?用的DLL和LIB文件。 3. ??Project|Add to Project...??框,加入如下?文件: _libeng.lib,_libmat.lib和_libmx.lib。 在?行了?些必要的?置之后,我?就可以?用适?的函????目?。 以下是子函?DemoMatlab的程序代?。 void DemoMatlab { Engine *eng; //定?Matlab引擎 char buffer[200]; //定??据??? int array[6]={1,2,3,4,5,6}; mxArray *S = NULL, *T = NULL; engOpen(NULL); //打?MATLAB 引擎 ---1 S= mxCreateDoubleMatrix(1,6, mxREAL); // ?生矩??量 mxSetName(S, "S"); memcpy((char*) mxGetPr(S),(char *) array, 6*sizeof(int)); engPutArray(eng, S); //??量X置入Matlab的工作空? engEvalString(eng, "T = S/S.^2;"); //?算 engEvalString(eng, "plot(S, T);"); //?制?形 …… …… engOutputBuffer(eng, buffer, 200); //?取Matlab?出 T = engGetArray(eng, "T"); //?得?算?果----2 engClose(eng); //??Matlab引擎,?束?用 mxDestroyArray(S); //?放?量 mxDestroyArray(T); } 若?需要?行其他功能和任?,那么按照上面介?的方法,?行?量?明后,在1、2?加?需要的?句即可。 還有 http://www.ccrun.com/doc/go.asp?id=402 發表人 - zilch 於 2004/10/12 13:04:38
s2323528
一般會員


發表:5
回覆:3
積分:1
註冊:2004-07-07

發送簡訊給我
#3 引用回覆 回覆 發表時間:2004-10-13 12:34:59 IP:211.75.xxx.xxx 未訂閱
Q1:在方法二中,找不到mediva這套軟體! Q2:方法ㄧ,mxSetName要include什麼.h檔! 有人試成功嗎? 還是有其他方法? 可以詳細解說嗎?
senlin
一般會員


發表:0
回覆:2
積分:0
註冊:2004-10-27

發送簡訊給我
#4 引用回覆 回覆 發表時間:2005-01-15 11:53:15 IP:140.124.xxx.xxx 未訂閱
如上的語法可改一行即可 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以上版本的\extern\example裡找到蠻有用的資訊 若是r12以前的版本, 因為該公司已經被matlab所併購, 所以程式也找不到了.
cowbjt
一般會員


發表:11
回覆:30
積分:8
註冊:2004-07-16

發送簡訊給我
#5 引用回覆 回覆 發表時間:2005-05-20 23:52:10 IP:140.124.xxx.xxx 未訂閱
請問一下    在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

發送簡訊給我
#6 引用回覆 回覆 發表時間:2005-06-02 11:05:15 IP:61.224.xxx.xxx 未訂閱
對啊,我也試過上述方法,結果傳回的 T 型態不合,所以印不出來~~
conundrum
尊榮會員


發表:893
回覆:1272
積分:643
註冊:2004-01-06

發送簡訊給我
#7 引用回覆 回覆 發表時間:2005-06-02 12:17:59 IP:220.132.xxx.xxx 未訂閱
http://delphi.ktop.com.tw/topic.php?topic_id=20514 http://delphi.ktop.com.tw/topic.php?topic_id=21285 http://delphi.ktop.com.tw/topic.php?topic_id=23514 Image Processing Course http://debut.cis.nctu.edu.tw/pages/IP2005Night/page.htm
dragonhippopdc
一般會員


發表:45
回覆:51
積分:19
註冊:2005-01-15

發送簡訊給我
#8 引用回覆 回覆 發表時間:2005-06-11 12:36:11 IP:220.133.xxx.xxx 未訂閱
各位大大~我看了板上的教學但是一直被沒辦法連結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' 請問為什麼呢~各位大大
系統時間:2024-05-19 8:26:00
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!