C_Builder與Matlab混合編程的兩種方法_第1頁(yè)
C_Builder與Matlab混合編程的兩種方法_第2頁(yè)
C_Builder與Matlab混合編程的兩種方法_第3頁(yè)
C_Builder與Matlab混合編程的兩種方法_第4頁(yè)
C_Builder與Matlab混合編程的兩種方法_第5頁(yè)
已閱讀5頁(yè),還剩9頁(yè)未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說(shuō)明:本文檔由用戶(hù)提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡(jiǎn)介

1、科 學(xué) 技 術(shù) 與 工 程6卷C+Builder 與 Matlab 混合編程的兩種方法杜高鵬翟正軍 1*徐雋(西北工業(yè)大學(xué) 軟件學(xué)院 , 西安 710065; dgp_2003 ; 西北工業(yè)大學(xué)計(jì)算機(jī)學(xué)院 1, 西安 710072摘 要 詳細(xì)論述了 C+Builder 與 Matlab 混合編程的兩種實(shí)現(xiàn)方法 。 一是在 C+Builder 中使用 COM 技術(shù)調(diào)用 Matlab 數(shù)據(jù) 。 二是脫離 Matlab 環(huán)境 , 通過(guò)動(dòng)態(tài)連接庫(kù)方式實(shí)現(xiàn)對(duì) Matlab 工具箱函數(shù)的調(diào)用 。 分別給出一個(gè)詳細(xì)的例子 。 這兩種方法都充分發(fā)揮了 C+Builder 與 Matlab 的優(yōu)勢(shì) , 為科學(xué)研

2、究和工程技術(shù)提供了更強(qiáng)的技術(shù)支持 。關(guān)鍵詞C+Builder MatlabCOM 組件Mediva 軟件平臺(tái) DLL中圖法分類(lèi)號(hào) TP312文獻(xiàn)標(biāo)識(shí)碼BMatlab 是一個(gè)高度集成的系統(tǒng) , 它把數(shù)值計(jì)算和可視化環(huán)境集成到一起 , 非常直觀 , 而且提供了 大量的函數(shù) , 使其越來(lái)越受到人們的喜愛(ài) 。 它集科 學(xué) 計(jì) 算 、 圖 象 處 理 、 聲 音 處 理 于 一 體 , 具 有 極 高 的 編程效率 。 近年來(lái) , Matlab 已經(jīng)從最初的 “ 矩陣實(shí)驗(yàn) 室 ” 滲透到科學(xué)與工程計(jì)算的多個(gè)領(lǐng)域 , 在自動(dòng)控 制 、 信號(hào)處理 、 神經(jīng)網(wǎng)絡(luò) 、 模糊邏輯 、 小波分析等多 個(gè)方向 , 都

3、有著廣泛的應(yīng)用 。 Borland C+Builder 是 一種新穎的可視化編程語(yǔ)言 , 它既具有 C+語(yǔ)言的 靈活性 、 高效性 , 又具有可視化編程的便利性 , 功能 豐富強(qiáng)大 , 界 面友好 , 使用 十分方便 , 但是在矩陣 運(yùn) 算 、 數(shù)值分 析 、 工程計(jì)算 等方面 , 功能 則稍嫌不 足 ; 在工程應(yīng)用中 , 我們一般用 C+Builder 語(yǔ)言編寫(xiě)應(yīng) 用 程 序 , 實(shí) 現(xiàn) 交 互 界 面 、 數(shù) 據(jù) 采 集 和 端 口 操 作 等 , 但 C+Builder 在數(shù)值處理分析和算法工具等方面 , 其效率遠(yuǎn)遠(yuǎn)低于 Matlab 語(yǔ)言 。 在準(zhǔn)確方便地繪制數(shù) 據(jù) 圖 形 方 面 ,

4、 Matlab 語(yǔ) 言 更 具 有 無(wú) 可 比 擬 的 優(yōu) 勢(shì) 。 此外 , Matlab 還提供功能強(qiáng)大的工具箱 。但 Matlab 的 缺點(diǎn)是不能實(shí)現(xiàn)端口操作和實(shí)時(shí)控制 。 因此 , 若能 將兩者結(jié)合運(yùn)用 , 實(shí)現(xiàn)優(yōu)勢(shì)互補(bǔ) , 將大大提高工作 效率 。1C+Builder 與 Matlab 混合編程的實(shí)現(xiàn)方法C+Builder 與 Matlab 混合編程有兩種實(shí)現(xiàn)方法 。一種是基于 Matlab 環(huán)境支持 , 通過(guò)在 C+Builder 中使用 COM 技術(shù)調(diào)用 Matlab 數(shù)據(jù)實(shí)現(xiàn) ; 另一種則是完全 脫離 Matlab 環(huán)境 , 通過(guò)動(dòng)態(tài)連接庫(kù)方式實(shí)現(xiàn)對(duì) Matlab 工 具 箱 函

5、 數(shù) 的 調(diào) 用 , 這 可 以 通 過(guò) 一 種 開(kāi) 發(fā) 平 臺(tái)Mediva 來(lái)實(shí)現(xiàn) 。 相對(duì)來(lái)說(shuō) , 前者的限制因素較多 , 而后者則較為方便靈活 。1.1COM 方法的實(shí)現(xiàn)COM 是組件對(duì)象模型的簡(jiǎn)稱(chēng) , 是 Windows 對(duì)象 的二進(jìn)制標(biāo)準(zhǔn) 。 為 Windows 提供了統(tǒng)一的 , 面向?qū)ο蟮?, 可擴(kuò)充的通訊協(xié)議 。 這意味著描述一個(gè)對(duì)象的可執(zhí)行代碼 (.dll 或 .exe 文件的代碼 可以被其它對(duì)象 執(zhí)行 。 即使兩個(gè)對(duì)象使用不同語(yǔ)言來(lái)編寫(xiě)的 , 他們 可以用 COM 標(biāo)準(zhǔn)來(lái)進(jìn)行通信 。 在 C+Builder 中使用COM 技術(shù)調(diào)用 Matlab 數(shù)據(jù)實(shí)現(xiàn)方法如下 :(1 根據(jù)

6、實(shí)際需要在 Matlab 中開(kāi)發(fā)算法 , 寫(xiě)成函數(shù)文件的形式 (注意 :不能是腳本文件 , 必須是函數(shù) 文件 ;(2 利用 Matlab 的 COM Builder 將 M 函數(shù)編譯為COM 組件 ;(3 在 C+Builder 中調(diào)用 COM 組件 , 得到輸出 。下面給出一個(gè)實(shí)例加以分析 。問(wèn)題 :實(shí)驗(yàn)對(duì)象為 :G (s =1/(Js2+Bs 在 Matlab 中 采用 M 函數(shù)的形式 , 利用 ODE45求解對(duì)象方程 , 然后 在 C+Builder 中進(jìn)行仿真 , 跟蹤給定信號(hào) 。2005年 12月 2日收到第一作者簡(jiǎn)介 :杜高鵬 (1980 , 男 , 陜西西安人 , 碩士研究生 ,

7、 研究 方向 :計(jì)算機(jī)網(wǎng)絡(luò)及數(shù)據(jù)庫(kù) 。*通訊作者簡(jiǎn)訊 :翟正軍 , (1965 , 男 , 教授 , 碩士生導(dǎo)師 。 研究方 向 :計(jì)算機(jī)測(cè)控與仿真 。第 6卷 第 7期 2006年 4月1671-1815(2006 07-0886-04科 學(xué) 技 術(shù) 與 工 程Science Technology and Engineering Vol. 6No. 7Apr. 20062006Sci. Tech. Engng. c杜高鵬 , 等 :C+Builder 與 Matlab 混合編程兩法 7期1 在 Matlab 中編寫(xiě)程序 genzong.m 和 cha.m 其代碼如下 :function b=

8、genzong (a ;xk=a(1 ; a(2;para=a(3 ; ts=a(4 ; tspan=0ts;tt,xx=ode45(' cha' ,tspan,xk,para ;xk=xx(length(xx, ; ;y=xk(1 ; y1=xk(2 ;b(1=y ; b(2=y1;以及對(duì)象方程 :function dy=cha(t,y,flag,parau=para ; J=0.0067; B=0.1;dy=zeros (2, 1 ; dy (1 =y (2 ; dy (2 =-B/J*y (2 +u/J ;2 用 Matlab 的 COM Builder 制 COM 組件

9、首先 , 設(shè)置 Matlab COM Builder 所使用的外部編 譯器 , 在 Matlab 命令窗口下輸入 mbuild setup , 然后選 擇合適的編譯器 , 在這里選擇 Microsoft Visual Studio 6.0, 其它的按照提示即可 。 其次 , 在 Matlab 命令窗口 下輸入命令 comtool , 啟動(dòng) COM Builder 的圖形用戶(hù)界 面 , 然 后 使 用 File->New Project 建 立 新 工 程 , 在 Component name 中輸入要生 成的 COM 組件的 名字 , 例如需輸入名字 xj 。 通過(guò) Add 和 Remo

10、ve 按鈕可以方 便地為組件添加和刪除類(lèi) 。 在這里 , 筆者為這個(gè)組 件添加一個(gè)類(lèi) xj 。 在 Compile Code in 里面推薦選擇 C 。 如果要使用 Matlab 的圖形庫(kù) , 那么就要在 Compile options 中 選 中 Use Handle Graphics Library 。 選 中 Show verbose output 可以在編譯的時(shí)候輸出 詳細(xì)的 過(guò)程信息 。 一個(gè)組件可以包含許多類(lèi) , 添加的方法 就是在 Project Settings 里面添加 。 給一個(gè)類(lèi)添加一個(gè) 方法非常簡(jiǎn)單 :先選中一個(gè)類(lèi) , 然后使用按鈕 Add File 添加 M 文件就可

11、以了 , 該 M 文件的名稱(chēng)就是 COM 組件的方法 。3 在 C+Builder 中使用生成的 COM 組件點(diǎn)擊 C+Builder 的 Project->Import Type Library , 在 上 面 的 窗 口 中 找 到 xj 1.0Type Library Version 1.0, 點(diǎn)擊 Install 按鈕 。 此時(shí)就在 AxtiveX 控件頁(yè)安裝 了 xj 控件 , 建立 一個(gè)工程文 件 project1, 在 Form 上 放 置一個(gè) IstripChart 控件 , 一個(gè) Timer 控件 (運(yùn)行時(shí)不可 見(jiàn) 和兩個(gè)按鈕控件 Button1, Button2。 雙

12、擊 Button1, 添加如下代碼 :void _fastcall TForm1:Button1Click(TObject *Senderxk1=0; xk2=0;para=0; ts=0.001; EK_1=0; k=0;Timer1->Enabled=true ;雙擊 Timer1, 添加如下代碼 :void _fastcall TForm1:Timer1Timer(TObject *Senderk=k+1;SDZ=sin(2*3.1415*k*ts ; /給定信號(hào)double src4; double out2; /傳出數(shù)據(jù)數(shù)組SAFEARRAY InSafeArray ; /用于

13、傳入的安全數(shù)組TVariant a ; TVariant b ; /傳入傳出 COM 的變體src0=xk1; src1=xk2; src2=para ; src3=0.001; /tsInSafeArray.cDims=1; /設(shè)置輸入安全數(shù)組InSafeArray.fFeatures=FADF_AUTO ;InSafeArray.cbElements=sizeof(float ;InSafeArray.rgsabound0.lLbound=0;InSafeArray.cLocks=1;InSafeArray.rgsabound0.cElements=4;InSafeArray.pvData

14、=src ;a. SetSAFEARRAY(&InSafeArray ;a.vt=VT_R8|VT_ARRAY ;xj1->genzong(1,&b,a ; /調(diào)用 COM 的方法memcpy(out,b.parray->pvData,2*sizeof(double ;xk1=out0; xk2=out1; /傳出數(shù)據(jù)EK=SDZ-xk1; dEK=(EK-EK_1/0.001; U=20*EK+0.5*dEK ; if (U>=10 U=10; if (U<=-10 U=-10;para=U ; EK_1=EK ;iStripChart1->Be

15、ginUpdate( ; /仿真曲線的繪制int TimeIndex=iStripChart1->AddIndexTime(Now( ;iStripChart1->ChannelData0TimeIndex=xk1;iStripChart1->ChannelData1TimeIndex=SDZ ;iStripChart1->EndUpdate( ;雙擊 Button2, 添加如下代碼 :void _fastcall TForm1:Button2Click(TObject *SenderTimer1->Enabled=false ;運(yùn)行程序 , 得到仿真界面 。用

16、COM 方法實(shí)現(xiàn) C+Builder 與 Matlab 混合編程 簡(jiǎn)單易懂 。 如果用戶(hù)運(yùn)行時(shí)想要脫離 Matlab 環(huán)境 , 只 需 在 Matlab 中 通 過(guò) 菜 單 Component ->Package Component 將組件打包即可 。1.2Mediva 軟件平臺(tái)Mediva 是 Mathtools 公司推出的一種 Matlab 編譯 開(kāi)發(fā)軟件平臺(tái) , 提供對(duì) Matlab 程 序文件 (M 文件 的 解釋執(zhí)行和開(kāi)發(fā)環(huán)境支持 。 Mediva 軟件平臺(tái)本身的 功能相當(dāng)強(qiáng)大 , 提供近千個(gè) Matlab 的基本功能函數(shù) , 通過(guò)必要的設(shè)置 , 就可以直接實(shí)現(xiàn)與 C+的混合編

17、 程 , 而不必再依 賴(lài) Matlab ; 同時(shí) , Mediva 還提 供編譯 887科 學(xué) 技 術(shù) 與 工 程 6卷轉(zhuǎn)換功能 , 能夠?qū)?Matlab 函數(shù)或編寫(xiě)的 Matlab 程序轉(zhuǎn) 換為 C+形式的 DLL , 從而實(shí)現(xiàn)脫離 Matlab 環(huán)境對(duì) Matlab 函數(shù)和過(guò)程的有效調(diào)用 , 這樣就有可能實(shí)現(xiàn) 對(duì) Matlab 強(qiáng)大的工具箱函數(shù)的利用 。Mediva 的缺點(diǎn)是 C+與 Matlab 混合編寫(xiě)的應(yīng)用 軟件必須攜帶必要的 DLL , 從而增大了軟件的體積 (約 4M , 同時(shí) 也不能對(duì)所 有的 Matlab 函數(shù)提 供 支 持 , 例如采用類(lèi)庫(kù)進(jìn)行設(shè)計(jì)的部分函數(shù) 。 但盡管如

18、此 , 對(duì)于控制系統(tǒng)計(jì)算機(jī)設(shè)計(jì) 、 分析的工作來(lái)說(shuō) , Mediva 仍不失為一個(gè)好的工具 。 其實(shí)現(xiàn)方式和步驟 如下 :本文假設(shè)已經(jīng)安裝了 Mediva 軟件或已經(jīng)得到必 要的兩個(gè)動(dòng)態(tài)連接庫(kù) mdv4300.dll 和 ago4300.dll 。 1.2.1Lib 文件的生成在 Dos 下用 C+Builder 中的 Implib.exe , 通過(guò)命令 生成 mdv4300.lib :implib mdv4300.lib mdv4300.dll , 將上述兩個(gè) DLL 文件和此 Lib 文件拷貝到當(dāng)前目錄 下 。1.2.2實(shí)現(xiàn)與 Matlab 的混合編程Matlab.h 包含了 Mediva

19、 中所有類(lèi)型 、 常量 、 函數(shù) 的說(shuō)明和定義 , 必須將此頭文件放于程序 的第一 行 。 Mediva 給出的 Matlab 函數(shù)形式并不特殊 , 如繪 線函數(shù) Plot , 在 Mediva 中說(shuō)明為 :Mm DLLI plot (cMm varargin ; varargin 與 Matlab 中 的 意 義 是 一 樣 的 , 與 輸入變量的個(gè)數(shù)相對(duì)應(yīng) 。 所有可以直接使用 的函 數(shù)都在 Matlib.h 頭文件中定義 , 而在 mdv4300.dll 中 實(shí)現(xiàn) 。但在 C+Builder 中使用 Mediva 提 供 的 Matlab 函 數(shù)的格式 , 與 Matlab 編程稍有不同

20、 , 這主要體現(xiàn)在 C+中必須進(jìn)行必要的說(shuō)明上 。 例如要用繪線函數(shù) Plot 來(lái)繪制數(shù)組 x 100的紅色圖線 。 在 Matlab 中調(diào)用 為 Plot (x , 'r' ; 在 C+中 調(diào) 用 則 為 :Plot (CL (x , TM ("r" , 其中 CL 是一個(gè)關(guān)鍵字 , 是多變量輸入時(shí)所必 須使用的 , 用以指明調(diào)用的變量 ; 而 TM 則指明 , 這是 一個(gè)字符 。下面給出一個(gè)示例程序 , 其功能是對(duì)一個(gè) 1024點(diǎn)的輸入數(shù)組進(jìn)行 FFT 變換 , 并繪制變換后頻譜實(shí) 部的火柴桿圖 , 最后將原數(shù)據(jù)和變換后的數(shù)據(jù)寫(xiě)入 數(shù)據(jù)文件中 。#inc

21、lude "matlib.h"/必須包含的頭文件#include vcl.h #pragma hdrstop#include "TryMatcomU.h"#pragma package(smart_init#pragma resource "*.dfm"TForm1*Form1;_fastcall TForm1:TForm1(Tcomponent*Owner:Tform(Ownervoid _fastcall TForm1:Button1Click(Tobject *Senderint k=0;initM (MATCOM_VERSIO

22、N ; /必須進(jìn)行的初始化Mm cur1,cur2; /定義變量cur1=zeros (128 ; cur2=zeros (128 ; /變量初始化for (k=1; k<=128; k+cur1.r (k =randM ( ; /生成一個(gè)隨機(jī)數(shù)列figure (1 ;plot (cur1 ; /圖形顯示該數(shù)列cur2=fft(cur1,128 ; /做 128點(diǎn) fft 變換figure(2 ; /繪制 fft 變換后實(shí)部的火柴桿圖 , 注意此處多變量輸 入的格式stem(CL(cur1,real(cur2,TM("r" ;fid=fopen(filename,mo

23、de,format opensexitM( ; /退出調(diào)用如果完全使用 C+來(lái)實(shí)現(xiàn)本程序的工作 , 其代 碼將超過(guò) 300行 ! 由此可以看出 , C+Builder 與 Matlab 函數(shù)的混合編程可以帶來(lái)多么大的方便 !1.2.3變量?jī)?nèi)部狀態(tài) /數(shù)據(jù)的觀察方法Mediva 使用的所有變量均定義為 Mm 類(lèi)型 。 如果 在 C+Builder 中觀察 Mm 類(lèi)型變量的內(nèi)部狀態(tài) /數(shù)據(jù) , 要稍麻煩一些 。 但在調(diào)試程序時(shí) , 這又是不可避免 的一步 , 這里舉例給出變量觀察的方法 。例如對(duì)上面生成的 cur2數(shù)列進(jìn)行觀察 :*cur2.pr 0.1892cur2(1 的實(shí)部*cur2.pi

24、0.0013cur2(1 的虛部2結(jié)語(yǔ)(1 基于 Matlab 環(huán)境支持 , 通過(guò)在 C+Builder 中 使 用 COM 技 術(shù) 調(diào) 用 Matlab 數(shù) 據(jù) 實(shí) 現(xiàn) C+Builder 與 Matlab 的混合編程的優(yōu)勢(shì)很明顯 , 在 C+中不易編寫(xiě) 的求解常微分方程 , 在 MATLAB 中只需寥寥數(shù)行便 能求解 , 只需在 C+Builder 中寫(xiě)好數(shù)據(jù)接口便能實(shí) 現(xiàn)仿真 。(2 Matlab 提供了可外部連接的 DLL 文件 , 通過(guò)888杜高鵬 , 等 :C+Builder 與 Matlab 混合編程兩法7期 Two Methods of C+Builder and the Ma

25、tlab Mix ProgrammingDU Gaopeng , ZHAI Zhengjun 1*, XU Jun(Software College , Northwestern Polytechnical University , Xi'an 710065; Computer College ofNorthwestern Polytechnical University 1, Xi'an 710072Abstract Two realization methods of C+Builder and the Matlab mix programming are elaborat

26、ed in detail. First , transfer the Matlab data by useing the COM technology in C+Builder ; Second , separating from the Matlab environment , transfer Matlab toolbox function through dynamic connection storehouse way are presented.And a detail example is given. These two kinds of methods both gave fu

27、ll play to C+Builder and advantage of Matlab , and provided the stronger technical support for the scientific research and the project technology. Key words C+Builder Matlab Com module Mediva software platform DLL 將其轉(zhuǎn)換為相應(yīng)的 Lib 文件 , 并加以必要的設(shè)置 , 就可 以在 C+Builder 中直接 進(jìn)行 Matlab 函數(shù) 調(diào)用 , 實(shí)現(xiàn)C+Builder 語(yǔ)言與 Mat

28、lab 語(yǔ)言的混合編程 。參考文獻(xiàn)1Borland/Inprise , 梁志剛 , 等譯 . C+Builder 5開(kāi)發(fā)人員指南 . 北京 :機(jī)械工業(yè)出版社 , 20002北 京 寶 蘭 -英 博 思 信 息 技 術(shù) 有 限 公 司 . Borland C+Builder 4標(biāo)準(zhǔn)教程 . 北京 :清華大學(xué)出版社 , 20003Hollingworth J 等 , 著 . 康向東 , 等譯 . C+Builder 5程序設(shè)計(jì)大 全 . 北京 :機(jī)械工業(yè)出版社 , 20024羅建軍 . Matlab 教程 . 北京 :電子工業(yè)出版社 , 20055潘愛(ài)民 . COM 原理與應(yīng)用 . 北京 :清華大

29、學(xué)出版社 , 2005!An Effective Audit Mechanism for Detecting Authority Promoting AttackWU Hao , JIANG Xiangtao(School of Computer and Communication , Hunan University , Changsha 410082Abstract Providing a new aduiting mechanism for detecting authority promoting attack , based on modifing Linux kernel , adds aduiting mechanism in system call-execve. Through monitor the changes of process's real user ID , effective ID and save set-user-ID , i

溫馨提示

  • 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶(hù)所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶(hù)上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶(hù)上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶(hù)因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。

評(píng)論

0/150

提交評(píng)論